常微分方程式(Ordinary Differential Equation, ODE)の初期値問題(Initial Value Problem, IVP)に対する数値解法をアプローチごとに紹介する。網羅的ではないし、結果的に異なるアプローチから同じ数値解法が得られることもあるが、数値解法のアイデアを理解するために、アプローチごとに分類して説明する。
yを時間に対する関数とし、y(t)∈RNとする。微分方程式dtdy=f(t,y)に対して初期値y(t0)=y0が与えられたとき、y(t)を求める問題を初期値問題(IVP)というが、これの数値的な解法のアプローチを以下に挙げる。時間を離散化して, tn=t0+nhとしyn(=y(tn))を使ってyn+1を求める。hは時間の刻み幅で、10−3などの小さい値を取ることが多い。
以下、yは真の解を表し、uは数値解を表すものとする。
テイラー展開
y(tn+1)=yn+f(tn,yn)=h(tn+1−tn)+21f′(tn,yn)=h2(tn+1−tn)2+⋯
を用いて、y(t)を近似する方法。高次の項を無視すると、微分方程式の右辺fの値やその微分を利用して、y(t)を近似的に求めることができる。
-
次数1で打ち切ると
un+1=un+hf(tn,un)
これはオイラー法と呼ばれる数値解法の一種である。単にf(tn,un)を用いて、un+1を線形に近似しているので、実装やアルゴリズムは簡単だが、後に記述するように精度や安定性が低い。
-
次数2で近似すると
un+1=un+hf(tn,un)+2h2f′(tn,un)
となり、
f′(tn,un)=∂t∂f(tn,un)+∂u∂f(tn,un)=f(tn,un)dtdu(連鎖率)
を計算する必要がある。ここで、Df(t0,u0)はfのuに関するヤコビ行列である。まとめると
un+1≈un+hf(tn,un)+2h2(∂t∂f(tn,un)+Df(tn,un)f(tn,un))
だが、ヤコビ行列の計算が計算コストが高いことが多いので、ポピュラーな方法ではない。
微分方程式を積分方程式に書き直すと
yn+1=yn+∫tntn+1f(t,y(t))dt
となる。この積分を求積法で近似する方法。
- Forward Euler法
∫abg(t)dt≈(b−a)g(a)
を使うと,
un+1=un+hf(tn,un)
で先程テイラー展開で1次近似したオイラー法と同じ式が得られる。
- Backward Euler法
∫abg(t)dt≈(b−a)g(b)
を使うと,
un+1=un+hf(tn+1,un+1)
となる。これも一次近似であり、un+1が両辺に現れるため、非線形方程式を解く必要がある。
このように、右辺に未知の値un+1が現れる方法を 陰解法(implicit method) と呼ぶ。Forward Eulerのような、右辺に未知の値が現れない方法を 陽解法(explicit method) と呼ぶ。陰解法は安定性が高いが、非線形方程式を解く必要があるため、計算コストが高いことが多い。
例えばNewton法を使って
F(un+1)=un+1−un−hf(tn+1,un+1)=0
を解く。安定性が高いが、計算コストも高い。
- 台形則
台形則
∫abg(t)dt≈2b−a(g(a)+g(b))
を使うと,
un+1=un+2h(f(tn,un)+f(tn+1,un+1))
となる。これは2次近似で、un+1が両辺に現れるため、Newton法などで非線形方程式を解く必要があるが、安定性が高い(ただしBackward Euler法よりは低い)。
- 中点法
∫abg(t)dt≈(b−a)g(2a+b)
を使うと,
un+1=un+hftn+2h,?u(tn+2h)
となる。u(tn+2h)は未知なので、例えば2un+un+1などで置き換える。したがって
un+1=un+hf(tn+2h,2un+un+1)
となり、これも非線形方程式を解く必要があるが、安定性が高い(ただしBackward Euler法よりは低い)。
先の方法は, 右辺にもun+1が現れるため、非線形方程式を解く必要があったが、修正子法は右辺のun+1をunなどの既知の値を使ったEuler法等の近似で置き換えることで、非線形方程式を解く必要をなくしたものである。例えば以下のようなものがある。
Euler法で中点の点を
un+21=un+2hf(tn,un)
で近似することで、更新式が
un+1=un+hf(tn+2h,un+21)
とexplicitになる。
Euler法で右辺のun+1を
un+1∗=un+hf(tn,un)
と近似することで、更新式が
un+1=un+2h(f(tn,un)+f(tn+1,un+1∗))
とexplicitになる。
求積法のSimpson則
∫abg(t)dt≈6b−a(g(a)+4g(2a+b)+g(b))
ステップn+1/2とn+1の両方を修正子で近似してexplicitにする。更新式は
k1k2k3k4un+1=f(tn,un)=f(tn+2h,un+2hk1)(≈f(u(tn+2h)))=f(tn+2h,un+2hk2)(≈f(u(tn+2h)))=f(tn+h,un+hk3)(≈f(u(tn+h)))=un+6h(k1+2k2+2k3+k4)
となる。これは4次近似で、安定性も高いが、計算コストも今までの低次の方法より高い。
上までは常にunを使ってun+1を求める方法であった(中間の点を補間することで次数を上げてた)。しかし、un−1,un−2,⋯などのより過去の点を使った多段的な解法が存在し、
ここでは多項式補間を用いて導出される代表的な線形多段法として、Adams系とBDFを紹介する。
Adams系はtn,tn−1,⋯における微分方程式の右辺fの値fn,fn−1,⋯を使ってfを補間する多項式p(t)を作り、
yn+1=yn+∫tntn+1p(t)dt
と積分する。陽解法がAdams-Bashforth法、fn+1を使う陰解法がAdams-Moulton法である。
- Adams-Bashforth法は、Newton補間多項式を使う。まずは差分商を定義すると、
f[tn,tn−1]f[tn,tn−1,tn−2]=tn−tn−1fn−fn−1=tn−tn−2f[tn,tn−1]−f[tn−1,tn−2]
つまり差分商f[tn,tn−1]は (fの変化量) / (tの変化量)、f[tn,tn−1,tn−2]はf[tn,tn−1]とf[tn−1,tn−2]の差分商である。(それぞれ、幾何的には傾きと曲率に対応する。)
これを使って、fのNewton補間多項式を作ると1
pk(t)=fn+f[tn,tn−1](t−tn)+f[tn,tn−1,tn−2](t−tn)(t−tn−1)+⋯+f[tn,tn−1,⋯,tn−k+1](t−tn)(t−tn−1)⋯(t−tn−k+1).
これを、step幅が定数hであることを使って積分すると、un+1を求める式が得られる。
例えば、
- 2段 (k=2) の場合
un+1=un+2h(3fn−fn−1)
- 3段 (k=3) の場合
un+1=un+12h(23fn−16fn−1+5fn−2)
- Adams-Moulton法は、fn+1を使う陰解法である。多項式は
pk(t)=fn+1+f[tn+1,tn](t−tn+1)+f[tn+1,tn,tn−1](t−tn+1)(t−tn)+⋯+f[tn+1,tn,⋯,tn−k+1](t−tn+1)(t−tn)⋯(t−tn−k+2).
これを刻み幅hとして積分すると、un+1を求める式が得られる。
例えば、
- 2段 (k=2) の場合
un+1=un+12h(5fn+1+8fn−fn−1)
- 3段 (k=3) の場合
un+1=un+24h(9fn+1+19fn−5fn−1+fn−2)
これも多項式補間だが、微分方程式の右辺のfを補間するのではなく、数値解u(t)を補間する(un+1を節点に含める)。
補間した多項式p(t)を微分して、tn+1で評価する、つまり
p′(tn+1)=f(tn+1,un+1)
という方程式を作り、これを解くことでun+1を求める。
例えば2段(k=2)のBDF2の場合、un+1,un,un−1を通る多項式p(t)を作り、これを微分して
p′(tn+1)=2h3un+1−4un+un−1
を得る。したがって
2h3un+1−4un+un−1=f(tn+1,un+1)
を解くことでun+1を求める。BDF法は安定性が高いが、非線形方程式を解く必要がある。
Adams系やBDFを含む線形多段法 (Linear Multistep Method, LMM) は、一般に
un+1+α0un+⋯+αk−1un−k+1=h(β−1fn+1+β0fn+⋯+βk−1fn−k+1)
の形で表される。ここでαi,βiは各メソッド固有の係数である。
Approach 4では、補完多項式を積分 or 微分して係数を求めたが、未定係数法では、まずこの形を仮定し、u(t)をテイラー展開して、un+1をtnの周りで展開することで、係数αi,βiを決定する。
以上でアプローチを挙げたが、複数の観点からそれらをグループ分けできる。
- 陽解法と陰解法:
- 陽解法: un+1=… の右辺にun+1が現れない陽解法は計算コストが低いが安定性が低い。
- 陰解法: 方程式をNewton法などで毎回解く必要があるので計算コストが高いが安定性が高い。
- 単段法と多段法:
- 単段法: un+1を求めるのに、unのみを使う。安定性が高い。
- 多段法: un+1を求めるのに、さらにun−1,un−2,⋯などの過去の点を使う。効率が良いが安定性に欠ける。余談だが、多段法は最初の数ステップは単段法で計算する必要がある。
- 線形と非線形:
- 線形: un+1が過去のuの線形結合で表される。Adams系やBDF法と入った線形多段法など。
- 非線形: 修正子を使うRunge-Kutta法などはfの値をfの引数に入れるため、一般に非線形である。