2分法は指定した区間内の解は必ず求めるものの,解の収束は遅い. 関数rf_newton.eq1.gifが連続で微分可能関数であるならば,関数の勾配値を用いることで収束を早めることができる.

解の初期値をrf_newton.eq2.gifとする. rf_newton.eq3.gifでの関数rf_newton.eq1.gifの接線は,

rf_newton.eq4.gif

となる.この接線がrf_newton.eq5.gif軸と交差する(rf_newton.eq6.gif)点は,

rf_newton.eq7.gif

rf_newton.eq8.gifを次の近似値として同様の処理を繰り返すことで解に近づいていく.図2はこの手順を示したものである. この方法をニュートン・ラフソン法(Newton-Raphson method),もしくは単にニュートン法(Newton method)と呼ぶ. ニュートン法の式は以下となる.

rf_newton.eq9.gif

反復回数を多くすると限りなくrf_newton.eq10.gifの解に近づく. 反復を終了するための収束条件は,

rf_newton.eq11.gif

となる.

ニュートン法は2分法と異なり解のある区間でなく初期近似値1つだけを指定するだけでよく,収束も速い. しかし,rf_newton.eq1.gifだけでなくその微分値rf_newton.eq12.gifも必要で,初期値によっては解へ収束しない場合もある.

newton.jpg
図2 ニュートン法

ニュートン法のコード例を以下に示す.

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29

int newton(double func(const double), double dfunc(const double), 
           double &x, int &max_iter, double &eps)
{
    double f, df, dx;
    int k;
    for(k = 0; k < max_iter; ++k){
        f = func(x);
        df = dfunc(x);
        x = xn-f/df;
 
                dx = fabs(f/df);
        if(dx < eps || fabs(f) < eps){
            max_iter = k; eps = dx;
            return 1;
        }
    }
 
    max_iter = k; eps = dx;
    return 0;
}

添付ファイル: filerf_newton.eq4.gif 612件 [詳細] filerf_newton.eq8.gif 635件 [詳細] filerf_newton.eq11.gif 603件 [詳細] filerf_newton.eq9.gif 600件 [詳細] filerf_newton.eq1.gif 660件 [詳細] filerf_newton.eq10.gif 673件 [詳細] filenewton.jpg 1972件 [詳細] filerf_newton.eq2.gif 642件 [詳細] filerf_newton.eq12.gif 683件 [詳細] filerf_newton.eq5.gif 694件 [詳細] filerf_newton.eq6.gif 692件 [詳細] filerf_newton.eq7.gif 675件 [詳細] filerf_newton.eq3.gif 597件 [詳細]

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2022-11-30 (水) 13:48:11