こんにちは。
久しぶりに記事を書いていきます。
今日は、ニュートン法という非線形方程式の解法をやっていきたいと思います。
ニュートン法は、直感的にもわかりやすく、コーディングも比較的楽なので、使いやすいと思います。
それではやっていきます。
ニュートン法の考え方
以下の図を用いて考えます。
上の図の青色の線の式のx軸との交点の座標、つまり点Eのx座標を求めることを考えます。
まず、x座標の初期値を設定します。
今回は上図のようにx0を初期値にしたとします。
ここで、 における青線の傾きを
、点Aのy座標を
だとすると、
点Aにおける接線の方程式は
と書くことができます。
この接線とx軸との交点、すなわち点Bのx座標は、
同様に、点Cにおける接線を求めて、点Dのx座標を求めると、
となります。
これを繰り返すことで、点Eのx座標を出していきます。
最終的には、更新する幅が小さくなったところなんかで計算を止めます。
ニュートン法のコード
それでは、c言語を使って、コードを書きます。
今回は以下のように書きました。
#include <stdio.h> double f(double x); double _f(double x); int main(void){ double x_start = 2.0; double err = 100.0; double x_pre = x_start; while(err>0.000001){ x_start = x_start - f(x_start)/_f(x_start); err = (x_start - x_pre) * (x_start - x_pre); x_pre = x_start; printf("%lf\n",x_start); } printf("result:%lf\n",x_start); } double f(double x){ return 5*x*x*x + 10*x*x - 2*x -5; } double _f(double x){ return 15*x*x + 20*x -2; }
実行結果は以下のようになります。
1.275510 0.877004 0.717828 0.689623 0.688756 result:0.688756
今回は以下の式の解を求めています。
グラフにすると、以下の図のようになります。
グラフからも、実行結果があっていることが確認できます。
今回は以上で終わります。