2.5 数値解法 -- Euler法とRunge-Kutta法

ここでは1階正規系の常微分方程式の初期値問題

  $\displaystyle x'(t)=f(x(t),t),$ (2.7)
  $\displaystyle x(t_0)=x_0$ (2.8)

に対する近似解法である Euler 法と、Runge-Kutta 法を説明する。

このうち実用性があるのは Runge-Kutta法である。 Euler法は効率が良くないが (普通にやると精度が低く、 精度を上げようとすると必要な計算量が爆上がりになる) 、 原理が理解しやすいため説明されることが多い。 一方、Runge-Kutta 法は原理が分かりにくい。 ここでは、Euler法を効率が良くなるように改良したものである、 ということを理解してもらえれば良い。


\begin{yodan}
Runge-Kutta 法はコーディングがほどほどに簡単な...
...かもしれない、
と私は考えるようになった。 \qed
\end{yodan}


$ t$ について、有限の範囲 $ [t_0,T]$ で解くことにする ($ t_0$, $ T$ は適当に定めた実数である)。


以下に提示するサンプル・プログラム (euler.c, euler.py, runge-kutta.c) は、 Malthus の方程式で $ a=1$, $ t_0=0$, $ x_0=1$ の場合を、 $ t$ について $ [t_0,T]=[0,1]$ の範囲で解くことにしている。つまり

  $\displaystyle x'(t)=x(t)$   ($ 0<t<1$)$\displaystyle ,$ (2.9)
  $\displaystyle x(0)=1.$ (2.10)

この初期値問題の解は $ x(t)=e^t$ である。


: 数値計算をする場合に得られるのは近似解であるが、 そのときもとの微分方程式の解のことを(誤解のないように) 厳密解 (exact solution) と呼んで区別することがある 7

これは簡単で特殊な問題であるが、 ここで説明する計算手順自体はより一般の問題にそのまま適用できる。


常微分方程式の数値解法の理論的なことは、 まずは桂田 [2] を見よ。



Subsections

桂田 祐史