位置: 数学編 第30回 / 前提: M2 / 数学編: なし / この回でできるようになること: ニュートン法と二分法で方程式を数値的に解き、ニュートン法が失敗する初期値を見分けることができる
目次
0. 物語 ― 初期値によっては収束しない
ある方程式の解を数値的に見つけたいとき、どこから始めても解にたどり着けるのでしょうか。
グラフの上に点を打ち、そこで接線を引いて、接線が横軸と交わるところに移動する。この操作を繰り返せば解に近づいていく――そう期待するのは自然なことです。実際、2の平方根を求める場合は、たった4回の繰り返しで正しい桁数が約12桁に達します。
ところが、ある3次方程式でこれを試してみると、思わぬことが起こります。この方程式にはマイナス1.77付近に解が1つあります。出発点を0に置いて接線を引くと、接線は右下がりで、横軸との交点は1です。今度は1から接線を引くと、右上がりで、横軸との交点は0に戻ってしまいます。0に戻れば同じ接線が引かれるので、次も1へ。そこからまた0へ。何度繰り返しても0と1の間を往復するだけで、解があるマイナス1.77付近には一歩も近づけません。
この接線を使う方法はニュートン法と呼ばれます。うまくいくときは驚くほど速い一方で、出発点の選び方を間違えると永遠に解に届きません。一方、区間を半分ずつ狭めていく二分法という方法は、遅いけれど確実に収束します。なぜニュートン法はこれほど速いのか、どんな条件が崩れると失敗するのか、この記事で証明と数値の両面から明らかにします。
1. 動機 ― 方程式を数値で解く2つの方法
この回を読み終えると、ニュートン法と二分法で方程式を数値的に解き、ニュートン法が失敗する初期値を見分けることができます。
f(x)=0 の解を手で求められないとき、数値的に近似する手段が必要です。本記事では代表的な2つの方法、ニュートン法と二分法を扱います。
ニュートン法は驚くほど速い一方、初期値を間違えると収束しないことがあります。二分法は遅いけれど確実です。この「速さと安全のトレードオフ」を、証明と数値の両面から理解します。
本編第85回(予告:インプライド・ボラティリティの計算)では、市場で観測された価格から未知のパラメータを逆算する場面でこの手法が登場します。
この記事で証明すること
- THM-M30-1 ニュートン法は、解の近くで関数が十分滑らかなら、誤差が1回の反復ごとに前の誤差の二乗に比例する量まで縮みます(二次収束)。
- THM-M30-2 連続関数が区間の両端で符号を変えるとき、二分法は反復ごとに誤差を半分にし、必ず収束します。
- THM-M30-3 ニュートン法は初期値によって、同じ点を往復したり発散したりします。大域的な収束は保証されません。
この節のまとめ:ニュートン法は速さ、二分法は確実さが持ち味です。両者の理論的な根拠をこの記事で与えます。
2. 設定と仮定 ― 接線を引いて近づく
ニュートン法のアルゴリズム
f(x)=0 を解きたいとします。初期値 x0 を選び、次の漸化式で xn を更新します。
xn+1=xn−f′(xn)f(xn)(2.1)
幾何的には、点 (xn,f(xn)) で接線を引き、その接線が x 軸と交わる点を次の近似値とする操作です。
二分法のアルゴリズム
連続関数 f が f(a)<0<f(b)(または f(a)>0>f(b))を満たすとき、中間値の定理から区間 [a,b] に解が存在します。
- 中点 m=(a+b)/2 を計算します。
- f(m) の符号を調べ、解がある側の半区間に絞ります。
- 区間幅が十分小さくなるまで繰り返します。
仮定の整理
- THM-M30-1 の仮定: f は解 x∗ の近傍で二回連続微分可能(C2 級)で、f′(x∗)=0 です。
- THM-M30-2 の仮定: f は閉区間 [a,b] 上で連続で、f(a)⋅f(b)<0 です。
- THM-M30-3: 特定の関数と初期値を構成して、収束しない例を作ります。
この節のまとめ:ニュートン法は接線の x 切片を次の近似値にする方法で、二分法は中間値の定理を使って区間を半分ずつ狭める方法です。
3. 主張 ― うまくいけば誤差は二乗で縮む
定理 THM-M30-1(二次収束)
f が解 x∗ の近傍で C2 級であり、f′(x∗)=0 であるとする。このとき、x0 が x∗ に十分近ければ、ニュートン法の誤差 en=xn−x∗ は
∣en+1∣≤C∣en∣2,C=2∣f′(x∗)∣∣f′′(x∗)∣+εを満たす。ここで ε>0 は x0 を x∗ に近づけるといくらでも小さくできる。
定理 THM-M30-2(二分法の収束)
f が [a,b] 上で連続で f(a)⋅f(b)<0 であるとする。二分法の n 回目の中点 mn について
が成り立つ。特に mn→x∗ である。
定理 THM-M30-3(大域的な収束は保証されない)
f(x)=x3−2x+2 に対し、ニュートン法を x0=0 から始めると、xn は 0 と 1 を交互に往復し、いかなる解にも収束しない。
この節のまとめ:THM-M30-1 は「速いが条件付き」、THM-M30-2 は「遅いが確実」、THM-M30-3 は「初期値次第で失敗する」という三者の関係を示しています。
証明を読む(読まなくても記事は完結します)
4. 証明 ― テイラー展開で誤差を評価する
この節は読まなくても記事は完結します。
この証明を追いたい人は、数学編 第2回「テイラー展開」へ。
THM-M30-1 の証明
誤差 en=xn−x∗ を使って漸化式を書き直します。f(x∗)=0 に注意して、f(xn) を x∗ のまわりでテイラー展開します。
f(xn)=f(x∗+en)=f(x∗)+f′(x∗)en+2f′′(x∗)en2+Rn(4.1)
ここで Rn は ∣en∣2 より高次の剰余項です。f(x∗)=0 なので
f(xn)=f′(x∗)en+2f′′(x∗)en2+Rn(4.2)
同様に f′(xn) もテイラー展開します。
f′(xn)=f′(x∗)+f′′(x∗)en+Rn′(4.3)
ニュートン法の漸化式 (2.1) から、次の誤差を計算します。xn+1=xn−f(xn)/f′(xn) の両辺から x∗ を引くと
en+1=en−f′(xn)f(xn)(4.4)(4.2)
f′(xn)f(xn)=f′(x∗)+f′′(x∗)en+Rn′f′(x∗)en+2f′′(x∗)en2+Rn
分母から f′(x∗) をくくり出します。f′(x∗)=0 を使うためです。
=1+f′(x∗)f′′(x∗)en+f′(x∗)Rn′en+2f′(x∗)f′′(x∗)en2+f′(x∗)Rn(4.5)
∣en∣ が十分小さいとき、分母は 1 に近いので、1/(1+h)=1−h+O(h2) の展開が使えます。h=f′(x∗)f′′(x∗)en+O(en2) とおくと
f′(xn)f(xn)=(en+2f′(x∗)f′′(x∗)en2+O(en3))×(1−f′(x∗)f′′(x∗)en+O(en2))
積を展開して en2 までの項を集めます。en×1=en は en+1 の計算でキャンセルさせるための項です。en2 の係数を拾うと
f′(xn)f(xn)=en+2f′(x∗)f′′(x∗)en2−f′(x∗)f′′(x∗)en2+O(en3)=en−2f′(x∗)f′′(x∗)en2+O(en3)(4.4)
en+1=en−(en−2f′(x∗)f′′(x∗)en2+O(en3))=2f′(x∗)f′′(x∗)en2+O(en3)(4.6)
したがって ∣en∣ が十分小さい領域では
∣en+1∣≤C∣en∣2,C=2∣f′(x∗)∣∣f′′(x∗)∣+ε
が成り立ちます。ε は剰余項に由来し、x0 を x∗ に近づけるといくらでも小さくできます。誤差が二乗で縮むので、正しい桁数が反復ごとにおよそ倍になります。 ∎
THM-M30-2 の証明
二分法の n 回目の反復後の区間を [an,bn] とします。初期区間は [a0,b0]=[a,b] です。
区間幅の縮小: 各反復で区間を半分に狭めるので
これは帰納法で示します。n=0 では区間幅が b−a そのものなので成り立ちます。n 回目の区間 [an,bn] から中点 mn=(an+bn)/2 を作り、f(mn) の符号に応じて [an,mn] または [mn,bn] を選ぶので、新しい区間幅は (bn−an)/2 です。帰納法の仮定を使うと bn+1−an+1=(b−a)/2n+1 です。
解が区間内に残ること: 初期区間で f(a)⋅f(b)<0 です。反復のたびに、解を含む側(符号が変わる側)を選ぶので、すべての n で f(an)⋅f(bn)≤0 が保たれます。中間値の定理より、各 [an,bn] に解 x∗ が存在します。
誤差の評価: 中点 mn は区間 [an,bn] の中央なので、x∗∈[an,bn] から
∣mn−x∗∣≤2bn−an=2n+1b−a(4.8)
n→∞ で右辺は 0 に収束するので mn→x∗ です。 ∎
THM-M30-3 の証明
f(x)=x3−2x+2 とします。f′(x)=3x2−2 です。
x0=0 から始めます。
x1=0−f′(0)f(0)=0−−22=1
f(0)=2, f′(0)=−2 なので、接線の傾きが負で x 軸との交点が 1 になります。
f(1)=1, f′(1)=1 なので、x2=0 に戻ります。
以降は x0=0 と同じ状態なので、同じ計算が繰り返されます。帰納法で示すと、すべての偶数 n で xn=0、すべての奇数 n で xn=1 です。
f の実数解は x≈−1.769 付近にあり、0 にも 1 にも存在しません(f(0)=2=0, f(1)=1=0)。したがって列 {xn} はいかなる解にも収束しません。 ∎
5. 反例 ― 初期値が悪いと往復する
CEX-M30-1: 永遠に往復する初期値
f(x)=x3−2x+2 を初期値 x0=0 から解きます。THM-M30-3 で証明した通り、反復は 0→1→0→1→⋯ を繰り返します。
outputs.json の数値を並べます。
| 反復 n |
xn |
f(xn) |
f′(xn) |
| 0 |
0 |
2 |
−2 |
| 1 |
1 |
1 |
1 |
| 2 |
0 |
2 |
−2 |
| 3 |
1 |
1 |
1 |
| 4 |
0 |
2 |
−2 |
x0=0 では接線が右へ、x1=1 では接線が左へ戻す。2点間のサイクルに閉じ込められ、解に近づくことは永遠にありません。
CEX-M30-2: 重解で収束が遅くなる
f(x)=(x−1)2 は x∗=1 に重解を持ちます。f′(x∗)=0 なので THM-M30-1 の仮定「f′(x∗)=0」が破れています。
初期値 x0=3 からニュートン法を適用すると、xn+1=xn−(xn−1)/2 より en+1=en/2 です。誤差は毎回ちょうど半分になり、一次収束に落ちます。
| 反復 n |
xn |
誤差 |
比 en+1/en |
| 0 |
3.0 |
2.0 |
0.5 |
| 1 |
2.0 |
1.0 |
0.5 |
| 2 |
1.5 |
0.5 |
0.5 |
| 3 |
1.25 |
0.25 |
0.5 |
| 5 |
1.0625 |
0.0625 |
0.5 |
| 10 |
1.001953125 |
0.001953125 |
0.5 |
| 20 |
1.000001907 |
0.000001907 |
0.5 |
二次収束なら5回で誤差が 10−12 以下になるところ、20回でもまだ 10−6 程度にしか縮んでいません。重解では収束は保証されますが、二乗ではなく線形にしか縮みません。
CEX-M30-3: 導関数が小さいと遠くへ飛ぶ
f(x)=arctan(x) を考えます。解は x∗=0 です。x0=10 から始めると、f′(10)=1/(1+100)=0.009901 と非常に小さいため
x1=10−0.0099011.471128≈−138.5839
1回の反復で解から 148.5839 も離れた場所へ飛ばされます。導関数が小さいと接線がほぼ水平になり、x 軸との交点が遥か遠くになることが原因です。
この節のまとめ:CEX-M30-1 はサイクルによる発散、CEX-M30-2 は重解による収束速度の低下、CEX-M30-3 は導関数が小さい点からの暴走を示しています。いずれも THM-M30-1 の仮定が破れた状況です。
6. 数値例 ― √2 を2つの方法で求める
f(x)=x2−2=0 をニュートン法と二分法の両方で解き、収束の速さを比較します。真の解は 2=1.41421356… です。
ニュートン法(初期値 x0=2)
漸化式は xn+1=xn−(xn2−2)/(2xn) です。
| 反復 n |
xn |
誤差 |
正しい桁数 |
| 0 |
2.0 |
5.86×10−1 |
0.4 |
| 1 |
1.5 |
8.58×10−2 |
1.2 |
| 2 |
1.416667 |
2.45×10−3 |
2.8 |
| 3 |
1.41421569 |
2.12×10−6 |
5.8 |
| 4 |
1.41421356237469 |
1.59×10−12 |
11.9 |
| 5 |
1.41421356237310 |
計算機精度 |
16.0 |
正しい桁数が 0.4→1.2→2.8→5.8→11.9→16.0 と、おおむね倍々に増えています。これが二次収束の実例です。わずか4回で誤差が 10−12 以下になりました。
二分法(初期区間 [1,2])
f(1)=−1<0, f(2)=2>0 なので適用できます。
| 反復 n |
区間 |
中点 |
誤差 |
| 0 |
[1,2] |
1.5 |
8.58×10−2 |
| 2 |
[1.25,1.5] |
1.375 |
3.92×10−2 |
| 6 |
[1.40625,1.421875] |
1.4140625 |
1.51×10−4 |
| 10 |
[1.4140625,1.4150391] |
1.4145508 |
3.37×10−4 |
| 14 |
[1.4141846,1.4142456] |
1.4142151 |
1.53×10−6 |
| 19 |
[1.4142132,1.4142151] |
1.4142141 |
5.72×10−7 |
19回反復しても誤差は 10−7 程度です。誤差が 10−10 を切るまでに29回かかりました。
比較
誤差 10−10 以下にするまでの反復回数:
ニュートン法が圧倒的に速い一方、二分法は初期区間さえ見つかれば確実に収束する安全性があります。
この節のまとめ:ニュートン法は4回で 10−10 以下の精度に達し、二分法は29回かかります。二次収束と一次収束の差がこの回数に直結しています。
7. 次回へ ― 差分近似と誤差の次数
ニュートン法は f′(xn) を毎回計算する必要がありますが、導関数が解析的に求められない場合もあります。次回 M31 では、導関数を差分で近似する方法と、その近似が収束の速さにどう影響するかを扱います。
よくある質問
二分法とニュートン法はどちらを使うべきですか
確実さなら二分法、速さならニュートン法です。組み合わせるのが実務的です。
二次収束とは何ですか
正しい桁数が1回ごとにおよそ倍になる、という速さです。
なぜ失敗するのですか
接線の傾きが小さいと遠くへ飛ばされたり、同じ点を往復したりするからです。
参考文献
- Burden R. L. and Faires J. D.、Numerical Analysis、第9版、Brooks Cole、2010年
- 森正武、数値解析、第2版、共立出版、2002年
数値例は compute.py により float 演算で計算済み。assert による検算を含む。