微積分 · ニュートン法

ニュートン法

ニュートン法は、一つのステップを繰り返してfの根を近似します。近似値xₙから(xₙ, f(xₙ))での接線を引き、x軸との交点を次の近似値にします。初期値をドラッグして、速い収束、周期、発散を見比べてください。

この図で見るニュートン法

ニュートン法は、一つのステップを繰り返してfの根、つまりf(r)=0f(r) = 0を満たす数rを近似します。現在の近似値xnx_nに対して、グラフ上の点(xn,f(xn))(x_n, f(x_n))での接線L(x)=f(xn)+f′(xn)(x−xn)L(x) = f(x_n) + f'(x_n)(x - x_n)を考えます。xnx_nの近くでは接線が曲線に近いため、接線とx軸の交点は、曲線と軸の交点のよりよい近似になります。L(x)=0L(x) = 0を解くと次の近似値が得られます。図の各ステップでは、xnx_nから薄い破線に沿って曲線まで進み、次に接線に沿って軸まで進みます。

ニュートン法の1ステップ。f′(xₙ) ≠ 0のとき定義される
xn+1=xn−f(xn)f′(xn)x_{n+1} = x_n - \frac{f(x_n)}{f'(x_n)}

誤差をen=xn−re_n = x_n - rとします。rが単根(f′(r)≠0f'(r) \ne 0)で、fの二階導関数が連続なら、xnx_nがrに近いとき、ステップのテイラー展開からen+1≈f′′(r)2f′(r) en2e_{n+1} \approx \frac{f''(r)}{2f'(r)}\,e_n^2を得ます。誤差を二乗すると、正しい桁数はおよそ2倍になります。x² − 2をx₀ = 1から始めた誤差は0.086、0.0025、2.1 × 10⁻⁶、1.6 × 10⁻¹²で、表示ではen/en−12e_n/e_{n-1}^2が1/(22)≈0.3541/(2\sqrt2) \approx 0.354に近づきます。根から遠い場所では保証されません。f′′(r)=0f''(r) = 0なら二乗の項が消えてさらに速くなります。arctan xでは次の誤差は約−23en3-\tfrac23 e_n^3で、毎回三乗になります。

このステップにはf′(xn)≠0f'(x_n) \ne 0が必要です。水平な接線は軸と交わらず、ほぼ水平な接線は遠くで交わります。x² − 2を0.1から始めると、最初の着地点は10.05です。遠くへ逃げなくても失敗することがあります。x³ − 2x + 2では、0での接線は1へ、1での接線は0へ戻り、0の近くの初期値もこの周期に引き込まれます。数列は有界ですが極限を持ちません。arctan xには、2α=(1+α2)arctan⁡α2\alpha = (1 + \alpha^2)\arctan\alphaを満たすα ≈ 1.3917という境界があります。|x₀| < αなら収束し、それを超えると毎回反対側のさらに遠くに着地します。「すべての初期値」は行き着く先に応じてx軸を色分けします。x³ − 2x + 2では[−3, 3]の約5分の1が周期に入り、接線が水平になる±2/3\pm\sqrt{2/3}へ集まる細い帯も含まれます。初期値を複素数にすると、これらの帯はニュートンフラクタルになります。

重根ではf′(r)=0f'(r) = 0も成り立ち、誤差が二乗で減る性質が失われます。(x−1)2(x - 1)^2ではステップが厳密にxn+1=(xn+1)/2x_{n+1} = (x_n + 1)/2となるため、誤差は毎回半分になります。これは一次収束で、小数が新たに1桁正しくなるまで約3.3ステップかかります。重複度mの根の近くでは、比en+1/ene_{n+1}/e_nが(m−1)/m(m - 1)/mに近づきます。

注目する点

  • ニュートンは1669年にx3−2x−5=0x^3 - 2x - 5 = 0を論じました。現在の方法を2から始めると2.1、2.0945681、2.0945514817となり、3ステップで小数第9位まで正しくなります。
  • f(x)=x2−af(x) = x^2 - aならステップはxn+1=12(xn+a/xn)x_{n+1} = \tfrac12\left(x_n + a/x_n\right)です。近似値と、aをその近似値で割った値の平均を取る、古くからの平方根計算法です。

操作

  • 青い点x₀をx軸に沿ってドラッグするか、軸を押してそこに置きます。0.5の倍数で吸着します。
  • nを設定してその回数のステップを表示するか、n → ∞を押してn = 10まで進めます。各xₙと誤差を記録し、根に達したとき、接線が水平なとき、または10⁶を超えたときは途中で停止します。
  • 「すべての初期値」をオンにすると、各初期値が行き着く先に応じてx軸を色分けします。

関連項目