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
/*!
 * ニュートン・ラフソン法(Newton-Raphson method)
 * @param[in] func 関数値を与える関数ポインタ
 * @param[inout] x 探索開始位置を受け取り,解を返す
 * @param[inout] max_iter 最大反復数(反復終了後,実際の反復数を返す)
 * @param[inout] eps 許容誤差(反復終了後,実際の誤差を返す) 
 * @return 1:成功,0:失敗
 */
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;
}

添付ファイル: filenewton.jpg 1363件 [詳細] filerf_newton.eq5.gif 475件 [詳細] filerf_newton.eq12.gif 472件 [詳細] filerf_newton.eq6.gif 471件 [詳細] filerf_newton.eq7.gif 477件 [詳細] filerf_newton.eq3.gif 446件 [詳細] filerf_newton.eq2.gif 468件 [詳細] filerf_newton.eq4.gif 455件 [詳細] filerf_newton.eq11.gif 451件 [詳細] filerf_newton.eq9.gif 443件 [詳細] filerf_newton.eq1.gif 471件 [詳細] filerf_newton.eq10.gif 480件 [詳細] filerf_newton.eq8.gif 465件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2012-06-26 (火) 18:24:04 (3008d)