 
 
 
 
 
 
 
  
ここでは非線形方程式を解くための代表的な方法である 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;
      }
のように書くことも出来ます (こちらの書き方が普通です)。
 
 
 
 
 
 
