ノート

ODEの数値解法アプローチ

#Numerical Analysis

更新日: 2026年7月16日

常微分方程式(Ordinary Differential Equation, ODE)の初期値問題(Initial Value Problem, IVP)に対する数値解法をアプローチごとに紹介する。網羅的ではないし、結果的に異なるアプローチから同じ数値解法が得られることもあるが、数値解法のアイデアを理解するために、アプローチごとに分類して説明する。

ODEの初期値問題の数値アプローチ

yを時間に対する関数とし、y(t)RNy(t)\in\mathbb{R}^Nとする。微分方程式dydt=f(t,y)\frac{dy}{dt} = f(t, y)に対して初期値y(t0)=y0\quad y(t_0) = y_0が与えられたとき、y(t)y(t)を求める問題を初期値問題(IVP)というが、これの数値的な解法のアプローチを以下に挙げる。時間を離散化して, tn=t0+nht_n = t_0 + nhとしyn(=y(tn))y_n(=y(t_n))を使ってyn+1y_{n+1}を求める。hhは時間の刻み幅で、10310^{-3}などの小さい値を取ることが多い。
以下、yyは真の解を表し、uuは数値解を表すものとする。

1. テイラー展開で近似

テイラー展開

y(tn+1)=yn+f(tn,yn)(tn+1tn)=h+12f(tn,yn)(tn+1tn)2=h2+y(t_{n+1}) = y_n + f(t_n, y_n)\underbrace{(t_{n+1} - t_n)}_{=h} + \frac{1}{2}f'(t_n, y_n)\underbrace{(t_{n+1} - t_n)^2}_{=h^2} + \cdots

を用いて、y(t)y(t)を近似する方法。高次の項を無視すると、微分方程式の右辺ffの値やその微分を利用して、y(t)y(t)を近似的に求めることができる。

  • 次数1で打ち切ると un+1=un+hf(tn,un)u_{n+1} = u_n + h f(t_n, u_n) これはオイラー法と呼ばれる数値解法の一種である。単にf(tn,un)f(t_n, u_n)を用いて、un+1u_{n+1}を線形に近似しているので、実装やアルゴリズムは簡単だが、後に記述するように精度や安定性が低い。

  • 次数2で近似すると un+1=un+hf(tn,un)+h22f(tn,un)u_{n+1} = u_n + h f(t_n, u_n) + \frac{h^2}{2}f'(t_n, u_n) となり、

    f(tn,un)=ft(tn,un)+fu(tn,un)dudt=f(tn,un)(連鎖率)f'(t_n, u_n) = \frac{\partial f}{\partial t}(t_n, u_n) + \frac{\partial f}{\partial u}(t_n, u_n)\underbrace{\frac{du}{dt}}_{=f(t_n, u_n)} \quad \text{(連鎖率)}

    を計算する必要がある。ここで、Df(t0,u0)Df(t_0, u_0)ffuuに関するヤコビ行列である。まとめると

    un+1un+hf(tn,un)+h22(ft(tn,un)+Df(tn,un)f(tn,un))u_{n+1} \approx u_n + h f(t_n, u_n) + \frac{h^2}{2}\left(\frac{\partial f}{\partial t}(t_n, u_n) + Df(t_n, u_n)f(t_n, u_n)\right)

    だが、ヤコビ行列の計算が計算コストが高いことが多いので、ポピュラーな方法ではない。

2. 積分方程式を求積法で近似

微分方程式を積分方程式に書き直すと

yn+1=yn+tntn+1f(t,y(t))dty_{n+1} = y_n + \int_{t_n}^{t_{n+1}} f(t, y(t)) dt

となる。この積分を求積法で近似する方法。

  • Forward Euler法 abg(t)dt(ba)g(a)\int^b_a g(t) dt \approx (b-a)g(a) を使うと, un+1=un+hf(tn,un)u_{n+1} = u_n + h f(t_n, u_n) で先程テイラー展開で1次近似したオイラー法と同じ式が得られる。
  • Backward Euler法 abg(t)dt(ba)g(b)\int^b_a g(t) dt \approx (b-a)g(b) を使うと, un+1=un+hf(tn+1,un+1)u_{n+1} = u_n + h f(t_{n+1}, u_{n+1}) となる。これも一次近似であり、un+1u_{n+1}が両辺に現れるため、非線形方程式を解く必要がある。
    このように、右辺に未知の値un+1u_{n+1}が現れる方法を 陰解法(implicit method) と呼ぶ。Forward Eulerのような、右辺に未知の値が現れない方法を 陽解法(explicit method) と呼ぶ。陰解法は安定性が高いが、非線形方程式を解く必要があるため、計算コストが高いことが多い。 例えばNewton法を使って F(un+1)=un+1unhf(tn+1,un+1)=0F(u_{n+1}) = u_{n+1} - u_n - h f(t_{n+1}, u_{n+1}) = 0 を解く。安定性が高いが、計算コストも高い。
  • 台形則 台形則 abg(t)dtba2(g(a)+g(b))\int^b_a g(t) dt \approx \frac{b-a}{2}(g(a) + g(b)) を使うと, un+1=un+h2(f(tn,un)+f(tn+1,un+1))u_{n+1} = u_n + \frac{h}{2}(f(t_n, u_n) + f(t_{n+1}, u_{n+1})) となる。これは2次近似で、un+1u_{n+1}が両辺に現れるため、Newton法などで非線形方程式を解く必要があるが、安定性が高い(ただしBackward Euler法よりは低い)。
  • 中点法 abg(t)dt(ba)g(a+b2)\int^b_a g(t) dt \approx (b-a)g\left(\frac{a+b}{2}\right) を使うと, un+1=un+hf(tn+h2,u(tn+h2)?)u_{n+1} = u_n + h f\left(t_n + \frac{h}{2}, \underbrace{u(t_n + \frac{h}{2})}_{?}\right) となる。u(tn+h2)u(t_n + \frac{h}{2})は未知なので、例えばun+un+12\frac{u_n + u_{n+1}}{2}などで置き換える。したがって un+1=un+hf(tn+h2,un+un+12)u_{n+1} = u_n + h f\left(t_n + \frac{h}{2}, \frac{u_n + u_{n+1}}{2}\right) となり、これも非線形方程式を解く必要があるが、安定性が高い(ただしBackward Euler法よりは低い)。

3. 修正子法

先の方法は, 右辺にもun+1u_{n+1}が現れるため、非線形方程式を解く必要があったが、修正子法は右辺のun+1u_{n+1}unu_nなどの既知の値を使ったEuler法等の近似で置き換えることで、非線形方程式を解く必要をなくしたものである。例えば以下のようなものがある。

Euler修正子を用いた中点法

Euler法で中点の点を

un+12=un+h2f(tn,un)u_{n+\frac{1}{2}} = u_n + \frac{h}{2}f(t_n, u_n)

で近似することで、更新式が

un+1=un+hf(tn+h2,un+12)u_{n+1} = u_n + h f\left(t_n + \frac{h}{2}, u_{n+\frac{1}{2}}\right)

とexplicitになる。

Euler修正子を用いた台形則

Euler法で右辺のun+1u_{n+1}

un+1=un+hf(tn,un)u^*_{n+1} = u_n + h f(t_n, u_n)

と近似することで、更新式が

un+1=un+h2(f(tn,un)+f(tn+1,un+1))u_{n+1} = u_n + \frac{h}{2}(f(t_n, u_n) + f(t_{n+1}, u^*_{n+1}))

とexplicitになる。

4段4次Runge-Kutta法

求積法のSimpson則

abg(t)dtba6(g(a)+4g(a+b2)+g(b))\int^b_a g(t) dt \approx \frac{b-a}{6}(g(a) + 4g\left(\frac{a+b}{2}\right) + g(b))

ステップn+1/2n+1/2n+1n+1の両方を修正子で近似してexplicitにする。更新式は

k1=f(tn,un)k2=f(tn+h2,un+h2k1)(f(u(tn+h2)))k3=f(tn+h2,un+h2k2)(f(u(tn+h2)))k4=f(tn+h,un+hk3)(f(u(tn+h)))un+1=un+h6(k1+2k2+2k3+k4)\begin{aligned} k_1 &= f(t_n, u_n) \\ k_2 &= f\left(t_n + \frac{h}{2}, u_n + \frac{h}{2}k_1\right) \quad \left(\approx f\left(u\left(t_n + \frac{h}{2}\right)\right)\right)\\ k_3 &= f\left(t_n + \frac{h}{2}, u_n + \frac{h}{2}k_2\right) \quad \left(\approx f\left(u\left(t_n + \frac{h}{2}\right)\right)\right)\\ k_4 &= f(t_n + h, u_n + hk_3) \quad \left(\approx f\left(u\left(t_n + h\right)\right)\right)\\ u_{n+1} &= u_n + \frac{h}{6}(k_1 + 2k_2 + 2k_3 + k_4) \end{aligned}

となる。これは4次近似で、安定性も高いが、計算コストも今までの低次の方法より高い。

4. 格子点の多項式補間で近似

上までは常にunu_nを使ってun+1u_{n+1}を求める方法であった(中間の点を補間することで次数を上げてた)。しかし、un1,un2,u_{n-1}, u_{n-2},\cdotsなどのより過去の点を使った多段的な解法が存在し、 ここでは多項式補間を用いて導出される代表的な線形多段法として、Adams系とBDFを紹介する。

Adams系

Adams系はtn,tn1,t_n, t_{n-1}, \cdotsにおける微分方程式の右辺ffの値fn,fn1,f_n, f_{n-1}, \cdotsを使ってffを補間する多項式p(t)p(t)を作り、

yn+1=yn+tntn+1p(t)dty_{n+1} = y_n + \int_{t_n}^{t_{n+1}} p(t) dt

と積分する。陽解法がAdams-Bashforth法、fn+1f_{n+1}を使う陰解法がAdams-Moulton法である。

  • Adams-Bashforth法は、Newton補間多項式を使う。まずは差分商を定義すると、 f[tn,tn1]=fnfn1tntn1f[tn,tn1,tn2]=f[tn,tn1]f[tn1,tn2]tntn2\begin{aligned} f[t_n, t_{n-1}] &= \frac{f_n - f_{n-1}}{t_n - t_{n-1}} \\ f[t_n, t_{n-1}, t_{n-2}] &= \frac{f[t_n, t_{n-1}] - f[t_{n-1}, t_{n-2}]}{t_n - t_{n-2}} \\ \end{aligned} つまり差分商f[tn,tn1]f[t_n, t_{n-1}]は (ffの変化量) / (ttの変化量)、f[tn,tn1,tn2]f[t_n, t_{n-1}, t_{n-2}]f[tn,tn1]f[t_n, t_{n-1}]f[tn1,tn2]f[t_{n-1}, t_{n-2}]の差分商である。(それぞれ、幾何的には傾きと曲率に対応する。) これを使って、ffのNewton補間多項式を作ると1 pk(t)=fn+f[tn,tn1](ttn)+f[tn,tn1,tn2](ttn)(ttn1)++f[tn,tn1,,tnk+1](ttn)(ttn1)(ttnk+1).\begin{aligned} p_k(t) = f_n + f[t_n, t_{n-1}](t - t_n) + f[t_n, t_{n-1}, t_{n-2}](t - t_n)(t - t_{n-1}) + \cdots\\ + f[t_n, t_{n-1}, \cdots, t_{n-k+1}](t - t_n)(t - t_{n-1})\cdots(t - t_{n-k+1}). \end{aligned} これを、step幅が定数hhであることを使って積分すると、un+1u_{n+1}を求める式が得られる。 例えば、
    • 2段 (k=2k=2) の場合 un+1=un+h2(3fnfn1)u_{n+1} = u_n + \frac{h}{2}(3f_n - f_{n-1})
    • 3段 (k=3k=3) の場合 un+1=un+h12(23fn16fn1+5fn2)u_{n+1} = u_n + \frac{h}{12}(23f_n - 16f_{n-1} + 5f_{n-2})
  • Adams-Moulton法は、fn+1f_{n+1}を使う陰解法である。多項式は pk(t)=fn+1+f[tn+1,tn](ttn+1)+f[tn+1,tn,tn1](ttn+1)(ttn)++f[tn+1,tn,,tnk+1](ttn+1)(ttn)(ttnk+2).\begin{aligned} p_k(t) = f_{n+1} + f[t_{n+1}, t_n](t - t_{n+1}) + f[t_{n+1}, t_n, t_{n-1}](t - t_{n+1})(t - t_n) + \cdots\\ + f[t_{n+1}, t_n, \cdots, t_{n-k+1}](t - t_{n+1})(t - t_n)\cdots(t - t_{n-k+2}). \end{aligned} これを刻み幅hhとして積分すると、un+1u_{n+1}を求める式が得られる。 例えば、
    • 2段 (k=2k=2) の場合 un+1=un+h12(5fn+1+8fnfn1)u_{n+1} = u_n + \frac{h}{12}(5f_{n+1} + 8f_n - f_{n-1})
    • 3段 (k=3k=3) の場合 un+1=un+h24(9fn+1+19fn5fn1+fn2)u_{n+1} = u_n + \frac{h}{24}(9f_{n+1} + 19f_n - 5f_{n-1} + f_{n-2})

Backward Differentiation Formula, BDF法 (後退差分法)

これも多項式補間だが、微分方程式の右辺のffを補間するのではなく、数値解u(t)u(t)を補間する(un+1u_{n+1}を節点に含める)。 補間した多項式p(t)p(t)を微分して、tn+1t_{n+1}で評価する、つまり

p(tn+1)=f(tn+1,un+1)p'(t_{n+1}) = f(t_{n+1}, u_{n+1})

という方程式を作り、これを解くことでun+1u_{n+1}を求める。 例えば2段(k=2k=2)のBDF2の場合、un+1,un,un1u_{n+1}, u_n, u_{n-1}を通る多項式p(t)p(t)を作り、これを微分して

p(tn+1)=3un+14un+un12hp'(t_{n+1}) = \frac{3u_{n+1} - 4u_n + u_{n-1}}{2h}

を得る。したがって

3un+14un+un12h=f(tn+1,un+1)\frac{3u_{n+1} - 4u_n + u_{n-1}}{2h} = f(t_{n+1}, u_{n+1})

を解くことでun+1u_{n+1}を求める。BDF法は安定性が高いが、非線形方程式を解く必要がある。

5. 未定係数法

Adams系やBDFを含む線形多段法 (Linear Multistep Method, LMM) は、一般に

un+1+α0un++αk1unk+1=h(β1fn+1+β0fn++βk1fnk+1)u_{n+1} + \alpha_0 u_n + \cdots + \alpha_{k-1} u_{n-k+1} = h (\beta_{-1} f_{n+1} + \beta_0 f_n + \cdots + \beta_{k-1} f_{n-k+1})

の形で表される。ここでαi,βi\alpha_i, \beta_iは各メソッド固有の係数である。 Approach 4では、補完多項式を積分 or 微分して係数を求めたが、未定係数法では、まずこの形を仮定し、u(t)u(t)をテイラー展開して、un+1u_{n+1}tnt_nの周りで展開することで、係数αi,βi\alpha_i, \beta_iを決定する。

手法の分類

以上でアプローチを挙げたが、複数の観点からそれらをグループ分けできる。

  1. 陽解法と陰解法:
    • 陽解法: un+1=u_{n+1}= \ldots の右辺にun+1u_{n+1}が現れない陽解法は計算コストが低いが安定性が低い。
    • 陰解法: 方程式をNewton法などで毎回解く必要があるので計算コストが高いが安定性が高い。
  2. 単段法と多段法:
    • 単段法: un+1u_{n+1}を求めるのに、unu_nのみを使う。安定性が高い。
    • 多段法: un+1u_{n+1}を求めるのに、さらにun1,un2,u_{n-1}, u_{n-2}, \cdotsなどの過去の点を使う。効率が良いが安定性に欠ける。余談だが、多段法は最初の数ステップは単段法で計算する必要がある。
  3. 線形と非線形:
    • 線形: un+1u_{n+1}が過去のuuの線形結合で表される。Adams系やBDF法と入った線形多段法など。
    • 非線形: 修正子を使うRunge-Kutta法などはffの値をffの引数に入れるため、一般に非線形である。

References

Footnotes

  1. Lagrange補間多項式も同値だが、点数kkが増えても、Lagrangeの場合は係数を全て更新する必要があるが、Newtonの場合は既存の補間多項式に新しい高次の項を追加するだけで済む。

コメント