ニュートン・ラフソン法 [C言語]
16/03/2019 03/12/2020
こんにちは さくらえびです。
今日はニュートン・ラフソン法のC言語での組み方をご説明します。
ニュートン・ラフソン法は求根アルゴリズムの一つで、簡単に説明すると、
\(f(x)=0\)となる\(x\)を求める方法です。
しかし、根(解)が複数ある場合、最近接の解が適用されます。
なので、解がどこにあるのかわからないものに対して適用するには、難しい方法です。
ニュートン・ラフソン法の求根式は以下のとおりです。
\[
x_{n+1} = x_n – f(x_n)/f'(x_n)
\]
\(x_n\)は最初、\(x_0\)から始まり、\(\lim_{n \to \infty} x_n\)で収束します。
とはいえ、無限までプログラムを実行し続けるわけにはいかないので、
収束したと認めるための閾値が必要となります。
ソースコードを下記に示します。
まずニュートン・ラフソン法の関数定義は、ポインタを使用して下記のように定義します。
double NEW_LAP(double(*fun)(double x),double x_ini);
定義したNEW_LAP関数の内部処理は、下記のとおりです。
double NEW_LAP(double(*fun)(double x),double x_ini){
double x_new;
double x_old;
x_new = x_ini;
while(fabs(x_new - x_old) >= 0.000001){
x_old = x_new;
x_new = x_old - fun(x_old)/DIF_F(fun,x_old);
}
return x_new;
}
関数の微分プログラムは前回作成のものを使っています。
では、関数\(f(x)=x^2 – 1\)に対して、ニュートン・ラフソン法を適用するプログラムのテストをします。
下記はテスト用のソースコードです。
#include
#include
double DIF_F(double (*fun)(double x),double xd);
double fx(double x);
double NEW_LAP(double(*fun)(double x),double x_ini);
int main(void){
double x;
x = 1.0;
printf("%lf,%lf,%lf",fx(1.0),NEW_LAP(fx,-2.0),DIF_F(fx,1.0));
return 0;
}
double fx(double x){
double fx;
fx = pow(x,2.0)-1.0;
return fx;
}
結果は下記のとおりです。おおよそ出収束しているようです。
下記は収束までの値を示した図です。

by さくらえび