二分法

C言語

二分法とは

数値計算による非線形方程式の解法として、二分法というアルゴリズムがあります。

二分法は、データ範囲を半分に分け、解が半分に分けたどちら側にあるかを調べるということを繰り返す手法です。この繰り返しにより、調べる範囲を狭めていき、最終的に方程式の解を近似します。

上の図は、二分法のイメージ図です。

解を求めようとしている関数f(X)に対して、f(a)<0でf(b)>0となるX軸上の点a,bを設定します。

ただし、点a,bは、その区間[a,b]の内でf(X)が1回だけX軸と交わるという条件を付けます。つまり、区間[a,b]でf(X)は、1つだけ解をもつということがわかっている前提となります。

この区間[a,b]の中点xを求めて、そのxに対してf(x)の値が正か負かを判定することで、解が区間[a,x]側にあるか、区間[x,b]側にあるかがわかります。これにより、解のある範囲が半分に絞れます。この半分の範囲に対して同じように解の所在を探索していくことで、数値解を求めます。

このように解の探索範囲を半分に分割することを繰り返すというところからこの手法は、二分法と呼ばれています。

二分法アルゴリズム

二分法のアルゴリズムは次のようになります。

二分法アルゴリズム
  1. 解の左右にある2点a,bをlowとhighの初期値とする
  2. lowとhighの中点xを求める
  3. f(x)>0なら解はxより左側にあるので、high=xとして上限を半分に狭める
  4. f(x)<0なら解はxより右側にあるので、low=xとして下限を半分に狭める
  5. f(x)=0か収束判定基準(ESP)以下のxを解とする
  6. 基準外であれば、2以降を繰り返す

中点は、

で求まります。

また、収束判定基準(ESP)は、適切な制度の値に設定し

を満たすとき、収束したと判断し、その時のxを解とします。

二分法プログラム

二分法のサンプルプログラムです。

このプログラムでは、収束判定基準値を

1.0E-8(Eは、10のべき乗)に設定していて、最大50回の繰り返しで収束しない場合は、処理を終了させます。

コメント

タイトルとURLをコピーしました