Pythonでの二分法の実装

二分法は、ある関数の根(方程式の解)を数値的に求めるための手法です。Pythonには、数値計算や科学技術計算に適したライブラリが多数存在しますが、ここでは最も基本的な二分法の実装について説明します。

二分法のアルゴリズム

二分法は、数値的に関数の根(方程式の解)を求めるためのアルゴリズムの一つです。関数が連続的であることを前提として、ある区間の中心を取り、その点での関数値と解との大小関係から、新たな区間を設定して解を探索します。このように区間を狭めることで、解を高精度に求めることができます。

具体的には、まず初期の区間を設定し、その区間の中心を求めます。中心での関数値と解との大小関係から、解が存在する区間を選択し、その区間を狭めるための新たな中心を求めます。これを繰り返すことで、解を高精度に求めることができます。二分法は単純であるため、数値解法の入門的なアルゴリズムとしてよく用いられます。

ただし、二分法は収束が比較的遅いため、高速に解を求めることが求められる場合には他の数値解法を使うことが適切かもしれません。また、関数の形状によっては収束しない場合があります。

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

  1. 関数f(x)が与えられる。
  2. 初期の区間[a,b]を設定する。
  3. 区間[a,b]の中央点を求める。
  4. 中央点の値をf(c)とする。
  5. f(c)が0に十分近ければcを解として返す。
  6. f(a)とf(c)の符号が異なる場合、解は区間[a,c]に存在するので、bをcに置き換える。
  7. f(b)とf(c)の符号が異なる場合、解は区間[c,b]に存在するので、aをcに置き換える。
  8. 区間[a,b]を狭め、3.に戻る。

二分法のPythonでの実装

以下は、二分法を実際にPythonで実装したコードです。

def bisection(f, a, b, tol=1e-6):
    """
    二分法による根の求め方
    f: 解きたい関数
    a: 区間の左端
    b: 区間の右端
    tol: 許容誤差
    """
    fa, fb = f(a), f(b)
    if fa * fb >= 0:
        raise ValueError("区間が不正です。")
    
    while abs(b - a) > tol:
        c = (a + b) / 2
        fc = f(c)
        
        if fc == 0:
            return c
        
        if fa * fc < 0:
            b = c
            fb = fc
        else:
            a = c
            fa = fc
            
    return (a + b) / 2

上記のコードでは、bisection関数に対象となる関数f、区間の左端a、右端b、許容誤差tolを渡します。関数fは、単一の引数xを受け取り、xに対するf(x)を返す関数として実装する必要があります。例えば、以下のように関数を定義して二分法を実行することができます。

def f(x):
    return x**2 - 2

root = bisection(f, 0, 2)
print(root)  # 結果: 1.4142136573791504

上記の例では、f(x) = x2 - 2 の根を求めています。初期の区間は[0, 2]で、許容誤差はデフォルトの1e-6としています。bisection関数は、区間が不正な場合にはValueErrorを発生させます。また、根が見つからなかった場合は、区間の中央点を返します。

まとめ

以上が、Pythonでの二分法の実装方法です。二分法は比較的単純なアルゴリズムであり、初心者にも理解しやすいため、Pythonを学ぶ上での基礎的なアルゴリズムの1つとして学ぶことをお勧めします。

問題解決のための「アルゴリズム×数学」が基礎からしっかり身につく本 [ 米田優峻 ]