/* ニュートン法による方程式の解法 2005-7-5 Yoshinari Nomura. コンパイル方法: cc -lm newton-method-3.c 振動の様子を観察 */ #include /* printf を利用するのに必要 */ #include /* 各種算術関数のために必要 */ /* f(x) = 0 の x を求める問題となる関数 */ double f(double x) { return x * x * x - 2 * x - 5; } /* f の一次導関数*/ double f1(double x) { return 3 * x * x - 2; } /* ニュートン法の繰り返し関数 */ double newton(double xk) { return xk - (f(xk) / f1(xk)); } main() { /* 各種初期値設定 */ int k = 0; /* 繰り返し回数 */ double delta = 3E-15; /* 許容誤差 3E-15 .. 3.0x10の-15乗 */ double xk = 0; /* 初期値 */ /* 開始メッセージを表示 */ printf("Newton method program start.\n"); printf("k:%d xk:%f f(xk):%f f'xk:%f\n", k, xk, f(xk), f1(xk)); while (fabs(f(xk)) > delta){ /* 収束条件 : f(x) が delta 以下になる */ k = k + 1; xk = newton(xk); printf("k:%d xk:%f f(xk):%f f'xk:%f\n", k, xk, f(xk), f1(xk)); } /* 終了メッセージを表示 */ printf("done.\n"); }