MENU

ニュートン法

ニュートン法

ニュートン法ニュートン・ラフソン法)は、方程式を数値計算によって解くための反復的な方法による求根アルゴリズムの1つです。

ja.wikipedia.org

f:id:Manao55:20200816204520j:plain

①根の近くの値 x_0 を初期値にします。

y=f(x)x=x_0 における接戦を引き、 x 軸と交わったところを x_1 とし、 以下同様の手順で x_2, x_3 , ... , x_{n} と求めます。

x_n を求めるには、

{ \displaystyle
f'(x_{n-1})≃\frac{f(x_{n-1})}{x_{n-1}-x_n}
}

という性質があることを用いて、

{ \displaystyle
x_n = x_{n-1}-\frac{f(x_{n-1})}{f'(x_{n-1})}
}

と、前の値 x_{n-1} を用いて求めることができます。

{ \displaystyle
\frac{|x_n-x_{n-1}|}{|x_{n-1}|} < EPS
}

になったときの x_n の値を求める根とし、そうでないなら②を繰り返します。 EPS は適当な精度を選びます。

プログラム

#include <iostream>
#include <math.h>
using namespace std;

#define f(x)  ((x)*(x)-2)
#define g(x)  (2*(x))
#define EPS   1e-09
#define LIMIT 50

int main(void)
{
    double x=2.0,dx;
    int k;

    for(k=1;k<=LIMIT;k++){
        dx = x;
        x=x-f(x)/g(x);
        if (fabs(x-dx)<fabs(dx)*EPS){
            cout << "x=" << x << endl;
            break;
        }
    }
    if (k>LIMIT)
        cout << "収束しない" << endl;
}

実行結果

x=1.41421