Runge-Kutta法のまとめ

差分法 (オイラー法) とからめてRunge-Kutta法についてまとめてみた。近似次数とか刻み幅制御とかは省いている。

差分法

一階微分方程式の近似解を求めることを考える。

前進差分法

hが十分小さい場合

\[ f’(x) \approx \frac{f (x+h) - f(x)}{h} \]

と近似することができる。これを用いると

\[ f (x+h) \approx f (x) + h f’(x) \]

と近似することができる。例えば \(f’ (x) = f (x),f (0) = 1\) の場合

\[ f (x+h) \approx (1 + h)f (x) \]

となるので \(f (nh) \approx (1+h)^n\) となる。厳密解の \(f (x) = e^x\) と比較してplotするとこんな感じになる。

[[][]]

後退差分法

$f’$は
\[ f’(x) \approx \frac{f (x) - f(x-h)}{h} \]
と近似することもできる。これを用いると

\[ f (x+h) \approx f (x) + h f’(x+h) \]

と近似することができる。例えば$f’ (x) = f (x),f (0) = 1$の場合

\[ f (x+h) \approx \frac{1}{1-h}f (x) \]

となる。この場合は容易に解けるが、右辺に$(x+h)$に依存した項が出てくるので一般には連立方程式を解く必要がある。このような解法を陰的解法と呼ぶ。逆に前進差分法の様に順々に代入していけば求まる解法を陽的解法と呼ぶ。

Runge-Kutta法

差分法では傾きを一次で近似した解法であった。 (テイラー展開と比較すると示せる。)更に良い精度で傾きを近似する方法として (一般の) Runge-Kutta法がある。
Runge-Kutta法は、$f (x,y) = y’(x)$としたときにパラメタとして$s$次行列\(A\),$s$次ベクトル$\mathbf{b},\mathbf{c}$を与えて

\[\begin{align*} y (x_0 + (n + 1)h) &= y (x_0 + nh) + h \sum_{i=1}^{s} b_i k_i\ k_i &= f (x_n + c_ih,y_n + h\sum_{j=1}^{s}a_{ij}k_j) \end{align*}\]

として近似する方法である。通例$c_i = ∑j=1sa_ij,∑i=1sb_i = 1$となるようにする。Butcher配列

\[\begin{equation*} \begin{array}{c | c} \mathbf{c}& A\ \hline & \mathbf{b}\ \end{array} \end{equation*}\]
を用いてRunge-Kutta法を表わすことができる。

例えば前進差分法は

\[\begin{equation*} \begin{array}{c | c} 0& 0\ \hline & 1\ \end{array} \end{equation*}\]

であり、後退差分法は

\[\begin{equation*} \begin{array}{c | c} 1& 1\ \hline & 1\ \end{array} \end{equation*}\]

である。

RK4 (古典的Runge-Kutta法)

Runge-Kutta法のなかでも4次のRunge-Kutta法

\[\begin{equation*} \begin{array}{c | c c c c} 0& 0 &0 &0 &0\\\ \frac{1}{2} & \frac{1}{2}& 0& 0& 0\ \frac{1}{2} & 0&\frac{1}{2}& 0& 0\\\ 1& 0& 0& 1& 0\\hline & \frac{1}{6}& \frac{1}{3}& \frac{1}{3}& \frac{1}{6} \end{array} \end{equation*}\]

精度が良く一般に良く用いられる。

RK4のように$A$が狭義下三角行列になる場合陽的に解くことができるので陽的Runge-Kutta法と呼ばれる。そうでない場合を陰的Runge-Kutta法と呼ぶ。陰的Runge-Kutta法の方が陽的Runge-Kutta法よりも計算は煩雑だが少ない段数でより近似精度が良いという事実が知られている。