関数rf_bisection.eq1.gifを区間rf_bisection.eq2.gifを考えたとき, rf_bisection.eq3.gifrf_bisection.eq4.gifの符号が異なる場合(rf_bisection.eq5.gif),区間rf_bisection.eq2.gif内に少なくとも1つの解が存在する. 区間rf_bisection.eq2.gifの中点での関数値rf_bisection.eq6.gifを求め,その値の符号がrf_bisection.eq4.gifと同じならば, 解はrf_bisection.eq7.gif内に存在する. このとき,解の存在する区間はrf_bisection.eq8.gifになっている. 同様にして,rf_bisection.eq7.gifの中点での関数値を使うことで,解の存在区間はrf_bisection.eq9.gifとなる. この作業を繰り返すことで方程式の解を求める方法を2分法(bisection method)と呼ぶ.

bisection.jpg
図1 2分法

図1は2分法で近似解を求める手順を示している. 現在の解の存在区間をrf_bisection.eq10.gifとする. rf_bisection.eq10.gifrf_bisection.eq2.gifで初期化される. 中点をrf_bisection.eq11.gifとする. 図1ではrf_bisection.eq12.gifであるので,解はrf_bisection.eq13.gifに存在するので, rf_bisection.eq14.gifとする. 次の中点をrf_bisection.eq15.gifであり, 図1ではrf_bisection.eq16.gifであるので,解はrf_bisection.eq17.gifに存在する. これを反復して,rf_bisection.eq18.gifと求めていく.

2分法の手順を以下に示す.

  1. rf_bisection.eq19.gif, rf_bisection.eq20.gifとする.
  2. 中点rf_bisection.eq21.gifにおける関数値rf_bisection.eq22.gifを求める.
  3. rf_bisection.eq23.gifの場合rf_bisection.eq24.gifrf_bisection.eq25.gifの場合rf_bisection.eq26.gifとする.
  4. 2に戻る

反復を終了するための収束条件は以下となる.

rf_bisection.eq27.gif

2分法のコード例を以下に示す.

/*!
 * 2分法(bisection method)
 * @param[in] func 関数値を与える関数ポインタ
 * @param[in] xl,xr 探索範囲
 * @param[out] x 解
 * @param[inout] max_iter 最大反復数(反復終了後,実際の反復数を返す)
 * @param[inout] eps 許容誤差(反復終了後,実際の誤差を返す) 
 * @return 1:成功,0:失敗
 */
int bisection(double func(const double), double xl, double xr, double &x, int &max_iter, double &eps)
{
    double f = func(xl);
    double fmid = func(xr);

    // 探索範囲の境界での値の符号が異なる場合のみ探索
    if(f*fmid >= 0.0) return 0.0;

    int k;
    double dx = fabs(xr-xl), xmid;
    for(k = 0; k < max_iter; ++k){
        xmid = 0.5*(xl+xr);    // 中点
        dx *= 0.5;

        // 中点での関数値を求める
        fmid = func(xmid);

        // 収束判定
        if(dx < eps || fmid == 0.0){
            x = xmid;
            max_iter = k; eps = dx;
            return 1;
        }

        // 新しい区間
        if(f*fmid < 0){
            xr = xmid;
        }
        else{
            xl = xmid;
            f = fmid;
        }
    }

    max_iter = k; eps = dx;
    return 0;
}

添付ファイル: filerf_bisection.eq8.gif 615件 [詳細] filerf_bisection.eq9.gif 618件 [詳細] filerf_bisection.eq20.gif 640件 [詳細] filerf_bisection.eq21.gif 557件 [詳細] filerf_bisection.eq22.gif 640件 [詳細] filerf_bisection.eq23.gif 642件 [詳細] filerf_bisection.eq24.gif 620件 [詳細] filerf_bisection.eq25.gif 632件 [詳細] filerf_bisection.eq26.gif 642件 [詳細] filerf_bisection.eq27.gif 680件 [詳細] filerf_bisection.eq3.gif 706件 [詳細] filerf_bisection.eq4.gif 630件 [詳細] filerf_bisection.eq5.gif 639件 [詳細] filerf_bisection.eq6.gif 750件 [詳細] filerf_bisection.eq7.gif 698件 [詳細] filebisection.jpg 2178件 [詳細] filerf_bisection.eq1.gif 672件 [詳細] filerf_bisection.eq10.gif 643件 [詳細] filerf_bisection.eq11.gif 654件 [詳細] filerf_bisection.eq12.gif 765件 [詳細] filerf_bisection.eq13.gif 617件 [詳細] filerf_bisection.eq14.gif 665件 [詳細] filerf_bisection.eq16.gif 607件 [詳細] filerf_bisection.eq17.gif 622件 [詳細] filerf_bisection.eq15.gif 682件 [詳細] filerf_bisection.eq18.gif 640件 [詳細] filerf_bisection.eq19.gif 635件 [詳細] filerf_bisection.eq2.gif 620件 [詳細]

トップ   編集 凍結 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2024-03-08 (金) 18:06:01