/* newton1_4.c: コマンド行入力バージョン */ #include // fprintf, printf, fgets, sscanf #include // fabs, atof double a = 2; double f(double x) { return x * x - a; // f(x) = x^2 - a } double df(double x) { return 2 * x; // f'(x) = 2x } double newton(double x, double (*f)(double), double (*df)(double), double eps) /* Solving f(x) = 0 by Newton Method x: initial value of x f(x): left term of equation f(x)=0 df(x): derivative of f(x) eps: error */ { int n = 0; double x0, err; printf("# n, x, err\n"); printf("%4d, % .15e\n", n, x); do { n++; x0 = x; x = x0 - f(x0) / df(x0); err = fabs(x - x0); printf("%4d, % .15e, % .15e\n", n, x, err); } while (err >= eps); return x; } int main(int argc, char *argv[]) { double x, eps = 1.0e-10; char s[128]; if (argc < 2) { fprintf(stderr, "usage: %s a\n", argv[0]); return 1; } a = atof(argv[1]); x = (a + 1.0) / 2.0; printf("\n# sqrt(%e) = % .15e\n", a, newton(x, f, df, eps)); return 0; } /* --- 実行例 --- Z:\proen1\kadai4>newton1_4 2 # n, x, err 0, 1.500000000000000e+000 1, 1.416666666666667e+000, 8.333333333333326e-002 2, 1.414215686274510e+000, 2.450980392156854e-003 3, 1.414213562374690e+000, 2.123899820016817e-006 4, 1.414213562373095e+000, 1.594724352571575e-012 # sqrt(2.000000e+000) = 1.414213562373095e+000 */