ここでは非線形方程式を解くための代表的な方法である Newton 法を試して みましょう。 という関数があった時に、 についての方程式
example4.c |
/* example4.c -- Newton 法で正の数 d の平方根を求める */ #include <stdio.h> #include <math.h> int main() { int n; double eps = 1.0e-15; double d, Xn, Xnp1; printf("Newton 法で正の数 d の平方根を求めます。\n"); printf("d="); scanf("%lf", &d); if (d < 0.0) return 0; Xn = 1.0; for (n = 0; n < 100; n++) { Xnp1 = (Xn + d / Xn) / 2; printf("%20.15e\n", Xnp1); /* 次の繰り返しのため */ Xn = Xnp1; /* 十分よい近似値が得られたかどうかチェックして、満足行く精度に なっていたら繰り返しを打ち切って END に飛ぶ */ /* if (Xn == Xnp1) goto END; */ /* if (fabs(Xn - Xnp1) < eps * fabs(Xn)) goto END; */ if (fabs(Xn * Xn - d) / d < eps) break; } printf("Square of %20.15e = %20.15e\n", Xn, Xn * Xn); return 0; } |
最後に求めた計算値を自乗してチェックするようになっています。このプログ ラムで を計算すると次のようになります。
example4 の実行結果 |
oyabun% ./example4 Newton 法で正の数 d の平方根を求めます。 d=2 1.500000000000000e+00 1.416666666666667e+00 1.414215686274510e+00 1.414213562374690e+00 1.414213562373095e+00 Square of 1.414213562373095e+00 = 2.000000000000000e+00 oyabun% |
上記のプログラム example4.c の for ループの部分は Xnp1
という変数を使わないで
for (n = 0; n < 100; n++) { Xn = (Xn + d / Xn) / 2; printf("%20.15e\n", Xnp); if (fabs(Xn * Xn - d) / d < eps) goto END; }のように書くことも出来ます (こちらの書き方が普通です)。