🙋
「不動点反復」って、同じ計算をぐるぐる繰り返すだけで方程式が解けるって本当ですか?なんだか不思議です。
🎓
ざっくり言うと本当だよ。コツは方程式を「x = g(x)」という形に書き直すこと。たとえば cos(x) = x を解きたいなら、もう右辺と左辺がその形になっているよね。あとは適当な初期値 x0 を電卓に入れて、cos を押し続けるだけ。x0=1 から cos を何度も押すと、値がだんだん 0.739… のあたりに落ち着く。これが「不動点」、つまり g を作用させても動かない点なんだ。
🙋
電卓で cos を押し続けると同じ数に近づくの、やったことあります!あれが解だったんですね。でも、どんな式でもこれで解けるんですか?
🎓
そこが肝心なところで、残念ながらいつも収束するわけじゃない。決め手は不動点での g の傾き、|g'(x*)| だ。これが 1 より小さいと、写像 g は距離を縮める「縮小写像」になって、反復するほど誤差が縮んで解に巻き込まれていく。逆に 1 より大きいと、近づくどころか毎回はじき飛ばされて発散する。左のメニューで『g(x)=2x−1』を選んでごらん。これは傾きが常に 2 だから、初期値を 1 以外にすると必ず吹き飛ぶよ。
🙋
本当だ、発散して「発散」と出ました!じゃあ収束する場合でも、速い・遅いの差ってあるんですか?
🎓
あるよ。不動点反復は「線形収束」といって、誤差が毎ステップおよそ |g'(x*)| 倍に縮む。だから |g'| が小さいほど速い。cos の場合は不動点で |g'|≈0.67 だから、誤差は毎回3分の2くらい。これだとそこそこ。でも |g'| が 0.95 みたいに 1 に近いと、1回で5%しか減らず、何十回回しても全然進まない。下の誤差グラフを対数スケールで見ると、収束する例は誤差がきれいな直線で落ちて、その傾きが log|g'| になっているのが分かるよ。
🙋
『g(x)=(x+2/x)/2』を選ぶと、たった数回で √2 にぴったり収束しました。これだけ妙に速いのはなぜですか?
🎓
いい発見だね。それは実はバビロニア法(ニュートン法を x²−2=0 に適用したもの)なんだ。この g は不動点 √2 で g'(√2)=0 になっている。線形収束の係数がゼロということは、誤差の1次の項が消えて、実際には「2次収束」――誤差が毎回2乗されるように激減する。だから3〜4回で電卓の表示精度に届く。同じ方程式 x²=2 でも、x=2/x と書けば発散、x=(x+2/x)/2 と書けば超高速。式の書き換え方ひとつで全く別物になるのが不動点反復の面白さであり、難しさでもあるんだ。
ピカール反復は、方程式を x = g(x) の形に書き直し、ある初期値 x0 から x_{n+1} = g(x_n) をくり返して解(不動点)に近づける数値解法です。不動点 x* は g(x*) = x* を満たす点、つまりグラフ y=g(x) と直線 y=x の交点です。たとえば g(x)=cos(x) で x0=1 から反復すると、値はドッティ数 x*≈0.739085 にゆっくり収束します。実装が極めて簡単で、ニュートン法など多くの反復解法の基礎にもなっています。
局所的な収束条件は |g'(x*)| < 1 です。不動点 x* の近くで写像 g の傾きの絶対値が 1 より小さいとき、g は「縮小写像」となり、反復するほど誤差が縮んで x* に収束します。逆に |g'(x*)| > 1 だと x* は反発点となり、どんなに近くから始めても発散します。本ツールの『g(x)=2x−1』は |g'|=2>1 のため、x0≠1 のとき必ず発散します。|g'(x*)|=1 は中立で、収束するかは高次の項で決まります。
不動点反復は線形収束で、誤差 e_n = x_n − x* は1ステップごとにおよそ係数 |g'(x*)| 倍になります。つまり |g'(x*)| が小さいほど速く収束します。たとえば |g'|=0.5 なら誤差は毎回ほぼ半分、|g'|=0.95 なら1ステップでわずか5%しか減らず、収束は非常に遅くなります。本ツールの誤差グラフを対数スケールで見ると、収束する場合は誤差がほぼ直線で減り、その傾きが log|g'(x*)| に対応していることが分かります。
発散の原因は不動点で |g'(x*)| ≥ 1 になっていることです。対策は、同じ方程式を g(x) の取り方を変えて書き直すことです。たとえば x²=2 を解くとき、x=2/x(|g'|=2 で発散)の代わりに x=(x+2/x)/2(不動点 √2 で |g'|=0 となり超高速収束)と書き直せば収束します。逆写像 x=g⁻¹(x) を使う、緩和係数 ω を入れて x_{n+1}=(1−ω)x_n+ω·g(x_n) とする、といった工夫も有効です。
非線形方程式の求解:不動点反復は、解析的に解けない非線形方程式 f(x)=0 を数値的に解くための最も基本的な道具です。f(x)=0 を x=g(x) の形に書き換えて反復するだけで実装でき、表計算ソフトの循環参照や、組込み機器の小さなマイコンでも動きます。ニュートン法 x_{n+1}=x_n−f(x_n)/f'(x_n) も、g(x)=x−f(x)/f'(x) という特別な不動点反復として理解できます。
CAE・連立方程式の反復解法:有限要素法や有限体積法の非線形解析では、各時間ステップや荷重ステップで巨大な連立方程式を解きます。ヤコビ法・ガウス・ザイデル法・SOR法といった反復解法は、いずれも行列形式の不動点反復 x_{n+1}=Mx_n+c に他なりません。収束条件「反復行列 M のスペクトル半径 < 1」は、本ツールの |g'(x*)|<1 を多次元に一般化したものです。
流体・伝熱の連成解析:圧力と速度を交互に解くSIMPLE法、流体と構造を行き来する連成(FSI)解析、輻射と伝導の連成などは、片方を固定してもう片方を解く操作を不動点反復として繰り返します。緩和係数(アンダーリラクセーション)を入れて x_{n+1}=(1−ω)x_n+ω·g(x_n) とするのは、実効的な |g'| を 1 未満に抑えて発散を防ぐ典型的な手法です。
常微分方程式とピカールの存在定理:「ピカール反復」の名は、常微分方程式 dy/dx=f(x,y) の解の存在と一意性を示すピカールの逐次近似法に由来します。積分方程式 y(x)=y0+∫f(t,y(t))dt を写像とみなし、関数列を反復生成して解に収束させます。バナッハの不動点定理(縮小写像の原理)が、その収束を保証する数学的な背骨になっています。
まず多いのが、「f(x)=0 を x=g(x) に書き直す方法は一通りだと思い込む」ことです。同じ方程式でも g(x) の取り方は無数にあり、収束するかどうか・どれだけ速いかは、その選び方で全く変わります。本ツールの x²=2 がよい例で、x=2/x と書けば不動点で |g'|=2 となり発散、x=(x+2/x)/2 と書けば |g'|=0 で2次収束します。発散したからといって「この方程式は反復では解けない」と結論づけるのは早計で、g の書き換えで救えることがほとんどです。
次に、「収束条件は初期値で決まる」と誤解することです。収束条件 |g'(x*)|<1 は不動点 x* の性質であって、初期値の良し悪しではありません。x* が反発点(|g'|>1)なら、どれだけ x* の近くから始めても発散します。逆に x* が吸引点(|g'|<1)なら、十分近い初期値からは必ず収束します。初期値が効くのは「複数の不動点があるとき、どの不動点に落ちるか」や「収束域の外から始めて発散するか」であって、写像そのものの収束性とは別問題です。
最後に、「反復が止まった=正しい解に収束した」と決めつけることです。打ち切り条件 |x_{n+1}−x_n|<ε を満たしても、それは「ステップ幅が小さくなった」ことを示すだけです。収束が極端に遅い(|g'| が 1 に非常に近い)場合、まだ解から遠いのに更新量が小さくなって、偽の収束と判定されることがあります。実務では、残差 |f(x)| そのものも併せて確認し、反復回数の上限に達したのか真に収束したのかを区別することが重要です。本ツールでは最終誤差と実行反復回数の両方を表示しているので、その違いを確かめてみてください。