Pythonでのニュートン法の実装

ニュートン法は、方程式の解を数値的に求める手法の一つであり、微分可能な関数に対して高い収束速度を持ちます。この記事では、Pythonニュートン法を実装する方法を説明します。

ニュートン法とは

ニュートン法とは、数学的な関数の解を求めるための近似的な手法の一つで、関数のグラフ上の一点から接線を引き、その接線がx軸と交わる点を求めることで、近似的な解を得る手法です。具体的には、ニュートン法は、関数f(x)の根を求めるために、ある初期値x0から始めて、次のような式を反復的に解いていく手法です。

x_{n+1} = x_n - \frac{f(x_n)}{f'(x_n)}

この式は、接線の方程式を用いて、現在の解候補x_nでの関数f(x)の近似値と、その近似値での接線とx軸の交点を求めて、次の解候補x_{n+1}を求めるものです。

ニュートン法の実装

Pythonニュートン法を実装するには、以下の手順が必要です。

  • Step 1. 関数f(x)とその導関数f'(x)を定義する。
  • Step 2. 初期値x0を設定する。
  • Step 3. 反復的にx_{n+1}を求める。

以下では、例として関数f(x) = x3 - 2x2 + 2を考えます。この関数の導関数はf'(x) = 3x2 - 4xとなります。まず、Step 1で関数f(x)とその導関数f'(x)をPythonで定義します。

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

def df(x):
    return 3*x**2 - 4*x

次に、Step 2で初期値x0を設定します。ここでは、x0=2とします。

x0 = 2

最後に、Step 3で反復的にx{n+1}を求めます。以下のように、whileループを使って、収束条件を満たすまでx{n+1}を更新し続けます。

x = x0
tol = 1e-8
max_iter = 1000
iter = 0

while abs(f(x)) > tol and iter < max_iter:
    x = x - f(x)/df(x)
    iter += 1

print("x =", x)
print("f(x) =", f(x))

このコードでは、収束条件として誤差の絶対値が1e-8以下になるまで、または反復回数が1000回を超えない限り反復計算を続けます。また、x_{n+1}の更新はx_n - \frac{f(x_n)}{f'(x_n)}の式を使って行われます。最終的に、求めたxとf(x)を表示します。

プログラムの実行結果

上記のコードを実行すると、次のような結果が得られます。

x = 1.7692923542386313
f(x) = 6.077471918045714e-09

この結果から、関数f(x) = x3 - 2x2 + 2の解はx = 1.7692923542386313であり、そのときのf(x)はほぼ0に近いことがわかります。つまり、ニュートン法が正しく動作していることが確認できました。

まとめ

この記事では、Pythonニュートン法を実装する方法を説明しました。具体例と具体的なコードを交えて説明したので、Pythonを使って数値計算を行う初心者の方でも理解できる内容となっています。ニュートン法は収束速度が非常に速い手法の一つであり、Pythonを使って簡単に実装できるため、ぜひ活用してみてください。

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