ニュートン法を解説!(最適化講座①)

未分類

ニュートン法、教科書で式だけ見ても実感できませんよね。今回の講座ではニュートン法についてわかりやすく解説し、実際の例題まで解いていきたいと思います

ニュートン法とは?

ニュートン法(Newton-Raphson法とも呼ばれます)は、非線形方程式の解を求めるための反復法の一つです。特に、方程式\(f(x)=0\)の解を求めるのに利用されます。ニュートン法は、微分を利用して解の近似値を反復的に改善していく手法で、多くの工学や科学の問題で広く使用されています。

原理

ニュートン法の基本的な考え方は、関数\(f(x)\)の根(解)を見つけるために、その関数の接線を利用することです。初期値\(x_0\)​からスタートし、次の反復公式を用いて次の近似値を計算します:

$$x_{n+1} = x_n – \alpha \frac{f(x_n)}{f'(x_n)}$$

ここで、\(f′(x)\)は\(f(x)\)の導関数であり、\(\alpha\)は歩み幅と呼ばれるパラメータです。通常、\(\alpha = 1\)ですが、収束を速めたり安定化させたりするために異なる値が使われることもあります。

定義式

ニュートン法の反復公式は次の通りです:

$$x_{n+1} = x_n – \alpha \frac{f(x_n)}{f'(x_n)}$$

この式を用いて、初期値\(x_0\)からスタートし、収束するまで繰り返し計算を行います。

例題

ここでは、具体的な例題を用いてニュートン法の使い方を説明します。

例題1: \(f(x) = x^2 – 2\)$の根を求める

まず、関数とその導関数を定義します:

$$f(x) = x^2 – 2 \\
f'(x) = 2x$$

初期値を\(x_0 = 1\)とし、あゆみ幅\(\alpha = 1\)を用いてニュートン法を適用します。

  1. 初期値:\(x_0 = 1\)
  2. 反復計算:

$$x_1 = x_0 – \frac{f(x_0)}{f'(x_0)} = 1 – \frac{1^2 – 2}{2 \cdot 1} = 1 – \frac{-1}{2} = 1 + 0.5 = 1.5$$

次に、\(x_1 = 1.5\)を用いて続けます:

$$\begin{align}
x_2 &= x_1 – \frac{f(x_1)}{f'(x_1)} \\
&= 1.5 – \frac{1.5^2 – 2}{2 \cdot 1.5} = 1.5 – \frac{0.25}{3} = 1.5 – 0.0833 = 1.4167
\end{align}$$

この手順を繰り返すことで、次第に解に近づいていきます。\(f(x)=x^2-2=0\)の解は正の解は容易に\(x=\sqrt{2}=1.41421356237\)とわかるので、2回の反復でかなり近い近似解まで計算できていることがわかります。多くの場合、数回の反復で非常に高精度な近似解を得ることができるので、実際に何回の反復で十分に収束しているのかPythonコードで計算し、確認してみましょう。以下がソースコードです。

def newton_method(f, df, x0, alpha=1, tol=1e-7, max_iter=100):
    """
    ニュートン法を用いて方程式 f(x) = 0 の解を求める。
    
    Parameters:
    f : function
        解を求める対象の関数 f(x)
    df : function
        f(x) の導関数 f'(x)
    x0 : float
        初期値
    alpha : float
        歩み幅
    tol : float
        収束判定のための許容誤差
    max_iter : int
        最大反復回数
    
    Returns:
    x : float
        求められた解
    """
    x = x0
    for i in range(max_iter):
        x_new = x - alpha * f(x) / df(x)
        print(f"Iteration {i+1}: x = {x_new}")
        if abs(x_new - x) < tol:
            return x_new
        x = x_new
    raise Exception("収束しませんでした")

# 関数 f(x) = x^2 - 2 およびその導関数 f'(x) = 2x
def f(x):
    return x**2 - 2

def df(x):
    return 2*x

# 初期値 x0
x0 = 1.0

# ニュートン法を実行
solution = newton_method(f, df, x0, alpha=1)

print(f"求められた解: x = {solution}")
Iteration 1: x = 1.5
Iteration 2: x = 1.4166666666666667
Iteration 3: x = 1.4142156862745099
Iteration 4: x = 1.4142135623746899
Iteration 5: x = 1.4142135623730951
求められた解: x = 1.4142135623730951

先ほども書いた通り、\(x=\sqrt{2}=1.41421356237\)なので、5回の計算でかなりの精度になることがわかります。

このニュートン法という手法は実際に手で解くことが難しい方程式を正確な値で解くのに非常に有効な手段なので、ぜひ使いこなせるようにしましょう!

結論

ニュートン法は、関数の根を見つけるための強力で効率的な手法です。微分を利用することで、初期値から解まで迅速に収束する特徴があります。ただし、初期値の選び方や関数の特性によっては収束しない場合もあるため、注意が必要です。実際の応用例を通じて、その有効性と使いやすさを実感してみてください。

このブログが、ニュートン法についての理解を深める一助となれば幸いです。質問やコメントがあれば、ぜひお寄せください。

コメント

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