namereq

ニュートン法(関数ポインタを使った場合)

Jun 27th, 2018
150
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 1.00 KB | None | 0 0
  1. /*
  2. newton.c: ニュートン法
  3. */
  4. #include <stdio.h> // printf, fprintf, fgets, sscanf
  5. #include <math.h> // fabs
  6.  
  7.  
  8. double f(double x, double a)
  9. {
  10.     return x*x - a;
  11. }
  12.  
  13. double df(double x)
  14. {
  15.     return 2 * x;
  16. }
  17.  
  18. double newton(double a, double(*f)(double, double), double(*df)(double),
  19. double eps)
  20. {
  21.     int n = 0;
  22.     double x0, err, x;
  23.     x = (a + 1.0)/2.0;
  24.     printf("# n, x, err\n");
  25.     printf("%4d, % .15e\n", n, x);
  26.     do {
  27.         n++;
  28.         x0 = x;
  29.         x = x0 - f(x0, a)/df(x0);
  30.         err = fabs(x - x0);
  31.         printf("%4d, % .15e, % .15e\n", n, x, err);
  32.     } while (err >= eps);
  33.     return x;
  34. }
  35.  
  36. int main(void)
  37. {
  38.     int n = 0;
  39.     double a = 0, x, x0, err, eps = 1.0e-10;
  40.     char s[128];
  41.    
  42.     fprintf(stderr, " a = "); fgets(s, 128, stdin); sscanf(s, "%lf", &a);
  43.     while (a <= 0.0) {
  44.         fprintf(stderr, "'a' には正の数を入れてください。\n");
  45.         fprintf(stderr, " a = "); fgets(s, 128, stdin); sscanf(s, "%lf", &a);
  46.     }
  47.    
  48.     x = newton(a, &f, &df, eps);
  49.     printf("\n# sqrt(%e) = % .15e\n", a, x);
  50.     return 0;
  51. }
Advertisement
Add Comment
Please, Sign In to add comment