オイラー法
このページの目標
前進オイラー法の漸化式と接線近似の幾何学的意味を理解し、誤差のオーダー、安定性、陰的方法の概念を学ぶ。
前提知識
- 第9章: 打ち切り誤差
- 常微分方程式の基礎(初期値問題)
- テイラー展開の基礎
1. 問題設定
初期値問題(IVP: Initial Value Problem)を考える:
\begin{equation} \dfrac{dy}{dx} = f(x, y), \qquad y(x_0) = y_0 \label{eq:ivp} \end{equation}両辺を $x_n$ から $x_{n+1}$ まで積分すると、
$$y(x_{n+1}) = y(x_n) + \displaystyle\int_{x_n}^{x_{n+1}} f\bigl(x,\, y(x)\bigr)\, dx$$となる。右辺の積分表示は厳密であるが、被積分関数の中に未知関数 $y(x)$ が含まれるため、一般にはこの式だけから直接値を計算することはできない(線形や変数分離形など解析解を持つ方程式も多いが、それは別の手段による)。そこで、この積分を何らかの方法で近似することが数値解法の基本的な考え方である。
解析的に解を求められない場合、数値的に近似解を構成する必要がある。区間 $[x_0, x_0 + L]$ を等間隔に分割し
$$x_n = x_0 + nh, \quad n = 0, 1, 2, \dots, N, \qquad h = \dfrac{L}{N}$$として、各格子点 $x_n$ における $y(x_n)$ の近似値 $y_n$ を逐次的に求める。
2. 前進オイラー法(陽的オイラー法)
初期値 $y_0$ から出発し、以下の漸化式で $y_1, y_2, \dots$ を順次計算する:
$$y_{n+1} = y_n + h \cdot f(x_n, y_n)$$2.1 導出
テイラー展開から導出できる。厳密解 $y(x)$ に対して
$$y(x_{n+1}) = y(x_n) + h \, y'(x_n) + \dfrac{h^2}{2} y''(x_n) + O(h^3) = y(x_n) + h \, f(x_n, y(x_n)) + O(h^2)$$$O(h^2)$ の項を無視すれば前進オイラー法の漸化式が得られる。
積分の観点からも同じ結果が得られる。第1節の積分形において、被積分関数 $f(x, y(x))$ を区間 $[x_n, x_{n+1}]$ で左端の値 $f(x_n, y(x_n))$ で一定と近似し(左端矩形公式)、さらに未知の $y(x_n)$ を近似値 $y_n$ で置き換えて $f(x_n, y_n)$ とすると、
$$\displaystyle\int_{x_n}^{x_{n+1}} f(x,\, y(x))\, dx \approx h \cdot f(x_n, y_n)$$となり、前進オイラー法の漸化式が得られる。つまり前進オイラー法は、$f$ を各小区間で階段状に近似して積分していることに相当する。
2.2 幾何学的解釈
上の積分の観点を幾何学的に言い換えると、次のようになる。式 $\eqref{eq:ivp}$ より $f(x, y) = dy/dx$ であったから、$f(x_n, y_n)$ は点 $(x_n, y_n)$ におけるベクトル場(傾きの場)の値であり、その点を通る解曲線の接線の傾きである。近似値 $y_n$ は一般に厳密解の値 $y(x_n)$ と異なるので、この解曲線は初期値問題の厳密解そのものではなく、点 $(x_n, y_n)$ を通る解曲線であることに注意する($n = 0$ では両者は一致する)。したがって「$f$ を左端の値で一定とみなす」とは、その点を通る解曲線を接線で置き換えて直進することにほかならない。
つまり前進オイラー法は、点 $(x_n, y_n)$ における接線に沿って刻み幅 $h$ だけ進み、到達した点を次の近似値 $y_{n+1}$ とする方法である。$x$ 方向に $h$ 進むと $y$ 方向に $h \cdot f(x_n, y_n)$ だけ変化する。
図3で注意すべき点がある。青い各線分の傾きは、厳密解(緑の曲線)の傾きではなく、近似値 $y_n$ から計算した傾き $f(x_n, y_n)$ である。最初の区間 $[x_0, x_1]$ では $y_0 = y(x_0)$ なので両者は一致するが、2区間目以降は近似値 $y_n$ が厳密解 $y(x_n)$ からずれているため、青い線分の傾きも厳密解の傾きとは異なる。ただし最初の区間でも、接線で有限の区間を直線近似すること自体による誤差(局所打ち切り誤差、第3.1節)は生じている。この「接線で区間を近似する誤差」と、2区間目以降の「ずれた近似点で傾きを評価する誤差」が重なって、大域誤差として蓄積する。
2.3 計算例
$y' = y$, $y(0) = 1$(厳密解 $y = e^x$)を $h = 0.5$ で $x = 2$ まで計算する。
| $n$ | $x_n$ | $y_n$(オイラー) | $y(x_n)$(厳密) | 誤差 |
|---|---|---|---|---|
| 0 | 0.0 | 1.0000 | 1.0000 | 0.0000 |
| 1 | 0.5 | 1.5000 | 1.6487 | 0.1487 |
| 2 | 1.0 | 2.2500 | 2.7183 | 0.4683 |
| 3 | 1.5 | 3.3750 | 4.4817 | 1.1067 |
| 4 | 2.0 | 5.0625 | 7.3891 | 2.3266 |
$h = 0.5$ では誤差が大きいが、$h$ を小さくすれば改善する。ステップ幅を変えたときの $x = 2$ での誤差を比較すると:
| $h$ | ステップ数 | $y_N$(オイラー) | 誤差 |
|---|---|---|---|
| 0.5 | 4 | 5.0625 | 2.3266 |
| 0.1 | 20 | 6.7275 | $6.6 \times 10^{-1}$ |
| 0.01 | 200 | 7.3160 | $7.3 \times 10^{-2}$ |
| 0.001 | 2,000 | 7.3817 | $7.4 \times 10^{-3}$ |
| 0.0001 | 20,000 | 7.3883 | $7.4 \times 10^{-4}$ |
$h$ を10分の1にすると誤差もほぼ10分の1になる(表の1行目から2行目は $h$ が $0.5 \to 0.1$ の5分の1なので、誤差の比も約 3.5 にとどまる)。これはオイラー法が1次精度($O(h)$)であることを反映している。ただしこれは $h \to 0$ での漸近的な性質であり、後述する安定領域の外にある粗い $h$ では成り立たない(第5.3節)。
$h$ は小さいほどよいか? 打ち切り誤差の観点では $h$ を小さくするほど精度が上がるが、実際には限界がある。
- 丸め誤差の蓄積:$h$ が極端に小さいとステップ数が膨大になり、浮動小数点の丸め誤差が蓄積する。ある点で打ち切り誤差の減少と丸め誤差の増大が釣り合い、それ以上 $h$ を小さくしても精度は改善しない。目安は打ち切り誤差 $\sim Ch$ と丸め誤差 $\sim \varepsilon\sqrt{L/h}$($\varepsilon$ は計算機イプシロン)が釣り合う $h$ で、この節の例では倍精度なら $h \sim 10^{-11}$ 程度、単精度なら $h \sim 10^{-5}$ 程度である。倍精度で通常使う範囲の $h$ では、この頭打ちより先に計算時間の方が問題になる。
- 計算時間:$h$ を半分にすると計算量は2倍になる。精度と計算コストのバランスが重要である。
高い精度が必要な場合は、$h$ をむやみに小さくするのではなく、ルンゲ=クッタ法のような高次精度の方法を使う方が効率的である。
3. 誤差解析
3.1 局所打ち切り誤差
局所打ち切り誤差(local truncation error)とは、1ステップで導入される誤差であり、厳密解からの出発を仮定して定義する:
$$\tau_n = y(x_{n+1}) - \bigl[y(x_n) + h f(x_n, y(x_n))\bigr] = \dfrac{h^2}{2} y''(\xi_n) = O(h^2)$$テイラー展開の $O(h^2)$ の項が打ち切られるため、局所打ち切り誤差は $O(h^2)$ である。
3.2 大域誤差
大域誤差(global error)は $e_n = y(x_n) - y_n$ で定義される。以下は、$f$ が $y$ についてリプシッツ連続(定数 $L_f$)で、解 $y$ が有限区間 $[x_0, x_0 + L]$ 上で2回連続微分可能な場合の話である(第3.1節の $\tau_n = \tfrac{h^2}{2} y''(\xi_n)$ にも $y \in C^2$ が要る)。このとき $N = L/h$ ステップの蓄積により
$$|e_N| \le C \cdot h$$すなわち大域誤差は $O(h)$ である。これをオイラー法は1次精度の方法であるという。直観的には、$O(h^2)$ の局所誤差が $N = O(1/h)$ ステップ蓄積して $O(h^2) \times O(1/h) = O(h)$ となる。ただし局所誤差は単純に足し合わされるのではなく、以後のステップで増幅を受けながら蓄積する。定数 $C$ は $\dfrac{\max|y''|}{2L_f}\bigl(e^{L_f L} - 1\bigr)$ の形で、区間長 $L$ とリプシッツ定数 $L_f$ に対して指数的に効くため、区間が長いと $C$ 自体が非常に大きくなりうる。実際、第2.3節の例($y' = y$, $[0, 2]$, $h = 0.001$)で局所誤差の総和と大域誤差を比べると、大域誤差は総和の約 2.3 倍になる。
一般に、誤差の伝播が安定な1段法では、1ステップの局所打ち切り誤差が $O(h^{p+1})$ であることが大域誤差 $O(h^p)$($p$ 次精度)につながる。局所誤差の次数だけでは十分ではなく、誤差の伝播が安定であること(上のリプシッツ条件など)が要る。
4. 後退オイラー法(陰的オイラー法)
$y_{n+1} = y_n + h \cdot f(x_{n+1}, y_{n+1})$
積分の観点では、前進オイラー法が左端矩形公式(区間の左端の値で $f$ を一定と近似)であったのに対し、後退オイラー法は右端矩形公式(区間の右端の値 $f(x_{n+1}, y_{n+1})$ で一定と近似)に相当する:
$$\displaystyle\int_{x_n}^{x_{n+1}} f(x,\, y(x))\, dx \approx h \cdot f(x_{n+1}, y_{n+1})$$右辺に未知の $y_{n+1}$ が現れるため、一般の非線形な $f$ では各ステップで $y_{n+1}$ に関する非線形方程式を解く必要がある(通常はニュートン法などの反復法を用いる)。$f$ が $y$ について線形なら線形方程式で済み、テスト方程式のように陽に解けることもある。計算コストは前進オイラー法より高いが、安定性に優れる。
4.1 なぜ安定性に優れるのか?
直観的な理由を、減衰する解 $y' = \lambda y$($\lambda < 0$)で見てみよう。厳密解は $y = e^{\lambda x} \to 0$ と減衰する。
前進オイラー法は「古い情報」$y_n$ に基づいて次の値を決める:
$$y_{n+1} = (1 + h\lambda)\, y_n$$$\lambda < 0$ のとき、$h$ が大きすぎると $|1 + h\lambda| > 1$ となり、減衰するはずの解が振動・発散してしまう。例えば $\lambda = -10$ で $h = 0.3$ とすると $1 + h\lambda = 1 - 3 = -2$ であり、$|y_n|$ は毎ステップ2倍に増大する。
後退オイラー法は「行き先の情報」$y_{n+1}$ を使って自分自身を決める:
$$y_{n+1} = y_n + h\lambda\, y_{n+1} \implies y_{n+1} = \dfrac{y_n}{1 - h\lambda}$$$\lambda < 0$, $h > 0$ のとき、$1 - h\lambda = 1 + h|\lambda| > 1$ であるから、$|y_{n+1}| < |y_n|$ が常に成り立つ。刻み幅 $h$ をどんなに大きくしても解は減衰し、発散しない。これが後退オイラー法の安定性の本質である。ただしこれは安定性の性質であって、$h$ を大きくしても精度が保たれるという意味ではない(第5.3節)。
言い換えれば、前進オイラー法は急激に変化する場面で「古い傾き」のまま大きく飛び出してしまうが、後退オイラー法は「到着点での傾き」で自動的にブレーキがかかる。この性質が特に重要になる硬い(stiff)方程式については第5.3節で述べる。
5. 安定性解析
安定性を調べるためにテスト方程式 $y' = \lambda y$($\mathrm{Re}(\lambda) < 0$)を用いる。厳密解は $y = e^{\lambda x} \to 0$($x \to \infty$)であり、数値解もこの減衰を再現することが望ましい。
5.1 前進オイラー法
$y_{n+1} = (1 + h\lambda) y_n$ であるから、増幅因子は $R(z) = 1 + z$($z = h\lambda$)。$|y_n| \to 0$ となるためには
$$|1 + z| < 1$$が必要である。これは複素平面で中心 $(-1, 0)$、半径 $1$ の円の内部であり、安定領域と呼ばれる。$\lambda$ が実の大きな負の値の場合、$h < 2/|\lambda|$ という刻み幅の制限を受ける。
5.2 後退オイラー法
$y_{n+1} = \dfrac{1}{1 - z} y_n$ であるから、安定条件は $|1/(1-z)| < 1$ すなわち $|1 - z| > 1$ である。$\mathrm{Re}(\lambda) < 0$ ならばこの条件は $h > 0$ のすべてで満たされる。すなわち後退オイラー法の安定領域は複素左半平面 $\{z : \mathrm{Re}(z) < 0\}$ 全体を含み、このような方法をA安定という。A安定はテスト方程式に対して「$\mathrm{Re}(\lambda) < 0$ なら任意の $h > 0$ で安定」という性質であり、任意の非線形問題での安定性や精度を保証する概念ではない。
5.3 硬い(stiff)方程式と後退オイラー法の利点
時定数の大きく異なる成分が混在し、精度の上では大きな刻み幅でよいのに、速く減衰する成分のせいで陽的方法の刻み幅が安定性から強く制限される方程式を硬い(stiff)方程式と呼ぶ。硬さは係数の大きさそのものではなく、この「安定性が刻み幅を縛る」状況として現れる。例えば $y_1' = -y_1,\ y_2' = -1000 y_2$ では、遅い成分 $y_1$ を追うには $x$ が 1 のオーダーの区間が必要だが、前進オイラー法は速い成分 $y_2$($\lambda = -1000$)のために $h < 2/|\lambda| = 0.002$ を要求される。$h = 0.002$ ちょうどでは発散はしないが $\pm 1$ の振動が永久に残って減衰を再現せず、これより大きい $h$ では発散してしまう。1成分の $y' = -1000y$ でも、追いたい時間スケール($x \sim 1$)に比べて減衰が速すぎる場合には同じ困難が起きる。
一方、後退オイラー法はどんな大きな $h$ でも安定に計算できる。計算コストは1ステップあたり高くても、刻み幅を大きく取れるため総ステップ数を大幅に削減でき、結果的に効率が良くなる。これが硬い方程式に対する後退オイラー法(および陰的方法一般)の利点である。ただし後退オイラー法の精度は前進オイラー法と同じ1次($O(h)$)なので、$h$ を大きく取れるのは「解が発散しない」という意味であって「必要な精度が出る」という意味ではない。例えば $y' = -10y$, $y(0) = 1$ を $h = 1$ で $x = 1$ まで1ステップ進めると、値は $1/11 \approx 0.091$ で発散はしないが、厳密解 $e^{-10} \approx 4.5 \times 10^{-5}$ の約 2000 倍である。刻み幅は最終的に精度の要求で決まる。
また第3.2節の大域誤差 $O(h)$ は $h \to 0$ の漸近的な主張であり、$h$ が安定領域の外にある間は成り立たない。$y' = -1000y$ を $x = 0.01$ まで解くと、$h$ が安定境界 $0.002$ を下回ってもしばらくは「$h$ を半分にすると誤差も半分」にならず($h = 1.25 \times 10^{-3}$ を半分にすると誤差はむしろ増える)、誤差の比が 1.9 を超えて 2 に近づくのは $h$ が $3 \times 10^{-5}$ 程度より小さくなってからである。
6. 改良オイラー法(ホイン法)
以下の2段階で $y_{n+1}$ を計算する:
$$\tilde{y}_{n+1} = y_n + h \, f(x_n, y_n) \qquad \text{(予測子:前進オイラー)}$$ $$y_{n+1} = y_n + \dfrac{h}{2} \bigl[f(x_n, y_n) + f(x_{n+1}, \tilde{y}_{n+1})\bigr] \qquad \text{(修正子:台形則)}$$積分の観点では、$f$ を左端と右端の平均で近似する台形公式の考え方を用いている。ただし右端の値には未知の $y_{n+1}$ ではなく予測子 $\tilde{y}_{n+1}$ を使う:
$$\displaystyle\int_{x_n}^{x_{n+1}} f(x,\, y(x))\, dx \approx \dfrac{h}{2}\bigl[f(x_n, y_n) + f(x_{n+1}, \tilde{y}_{n+1})\bigr]$$右端の値に $y_{n+1}$ そのものを使うと陰的台形法(A安定・2次)という別の方法になる。ホイン法は $y_{n+1}$ を予測子 $\tilde{y}_{n+1}$ で置き換えることで陽的にしており、そのぶん A安定性は失われる(第7節の表を参照)。
矩形近似より曲線によく沿うため、精度が向上する:
- 局所打ち切り誤差:$O(h^3)$
- 大域誤差:$O(h^2)$(2次精度)
改良オイラー法は2段2次のルンゲ=クッタ法(RK2)の一種であり、陽的方法でありながら前進オイラー法の2倍の精度次数を持つ。計算コストは1ステップあたり $f$ の評価が2回(前進オイラー法の2倍)であるが、同じ精度を達成するために必要な刻み幅を大幅に粗くできるため、総合的な効率は改良オイラー法が優れることが多い。
7. 各方法の比較
ここに述べた3つの方法(前進オイラー法、後退オイラー法、改良オイラー法=ホイン法)と、別ページで解説する ルンゲ=クッタ法 のうち古典的な4段4次の方法(RK4)の特性を比較すると次表のようになる。ルンゲ=クッタ法は方法の族であり、次数・段数・安定性は方式ごとに異なる。表の値は RK4 のものである。
| 方法 | 局所誤差 | 大域誤差 | $f$ 評価/step | A安定 |
|---|---|---|---|---|
| 前進オイラー | $O(h^2)$ | $O(h)$ | 1 | No |
| 後退オイラー | $O(h^2)$ | $O(h)$ | 1 + 求解 | Yes |
| 改良オイラー | $O(h^3)$ | $O(h^2)$ | 2 | No |
| 古典的4次ルンゲ=クッタ法(RK4) | $O(h^5)$ | $O(h^4)$ | 4 | No |
上の表にある4つの方法について、刻み幅 $h$ と大域誤差の関係を対数スケールで比較すると、各手法の精度次数の違いが明確にわかる。
この図では $y' = y$($\lambda = 1$、解が増大する方程式)を用いているため、前進・後退オイラー法の精度はほぼ同等に見える。後退オイラー法の主な利点は精度次数ではなく安定性にあり、硬い方程式では陽的方法より大きな刻み幅を選べる(第5.3節参照)。
8. よくある質問
Q1. オイラー法の誤差はなぜ $O(h)$ になるのか
オイラー法の1ステップで生じる局所打ち切り誤差は $O(h^2)$ である(第3.1節)。区間 $[x_0, x_0 + L]$ を刻み幅 $h$ で進むと総ステップ数は $N = L/h = O(1/h)$ となり、直観的には $O(h^2)$ の局所誤差が $O(1/h)$ ステップ分現れるため、最終的な大域誤差は $O(h^2) \times O(1/h) = O(h)$ となる。厳密には、$f$ のリプシッツ条件のもとで誤差の伝播(増幅)を評価することで大域誤差 $O(h)$ が示される(第3.2節)。したがってオイラー法は1次精度であり、$h$ が十分小さい範囲では刻み幅 $h$ を半分にすると誤差もおよそ半分になる(第2.3節の数値実験を参照)。
Q2. オイラー法の局所打ち切り誤差と大域誤差の違いは何か
局所打ち切り誤差(LTE)は「厳密解の上から出発して1ステップだけ進めたときに生じる誤差」で、オイラー法では $\tau_n = \tfrac{h^2}{2} y''(\xi_n) = O(h^2)$ である。一方大域誤差(GTE)は「初期値から $N$ ステップ計算した最終的な誤差」$e_n = y(x_n) - y_n = O(h)$ を指す。局所打ち切り誤差が全ステップにわたって蓄積した結果が大域誤差であり、安定な1段法を有限区間で用いる場合、局所打ち切り誤差 $O(h^{p+1})$ は通常、大域誤差 $O(h^p)$ に対応する(オーダーが1つ下がる)。詳しくは打ち切り誤差を参照。
Q3. オイラー法の誤差を小さくするにはどうすればよいか
大域誤差が $O(h)$ なので、刻み幅 $h$ を小さくすれば誤差は比例して減る。ただし $h$ を極端に小さくするとステップ数が膨大になり丸め誤差が蓄積し、ある点で精度が頭打ちになる(第2.3節の注記を参照)。高い精度が必要な場合は $h$ をむやみに小さくするより、改良オイラー法(大域誤差 $O(h^2)$)やルンゲ=クッタ法($O(h^4)$)など高次精度の方法を用いる方が効率的である。
Q4. オイラー法とは何か
オイラー法は常微分方程式 $y' = f(x, y)$ の最も基本的な数値解法であり、漸化式 $y_{n+1} = y_n + h \, f(x_n, y_n)$ で近似解を計算する(第2節)。幾何学的には、各近似点 $(x_n, y_n)$ でその点を通る解曲線の接線(傾き $f(x_n, y_n)$)を引き、その接線に沿って刻み幅 $h$ だけ進んで次の近似値を求める方法である(第2.2節)。積分の観点では、$f$ の積分を左端矩形公式で近似することに相当する(第2.1節)。
Q5. 前進オイラー法と後退オイラー法の違いは何か
前進オイラー法(陽的)は $y_{n+1} = y_n + h \, f(x_n, y_n)$ で、既知の値のみから次の値を直接計算する(左端矩形公式に対応)。後退オイラー法(陰的)は $y_{n+1} = y_n + h \, f(x_{n+1}, y_{n+1})$ で、未知の $y_{n+1}$ が右辺にも現れるため、各ステップで $y_{n+1}$ に関する方程式(一般の非線形な $f$ では非線形方程式)を解く必要がある(右端矩形公式に対応)。後退オイラー法は A安定で、硬い(stiff)方程式にも適用できる(第4節・第5節)。
Q6. オイラー法の精度はどの程度か
オイラー法の局所打ち切り誤差は $O(h^2)$(1ステップあたり)、大域誤差は $O(h)$(1次精度)である(第3節)。すなわち $h$ が十分小さい範囲では、刻み幅を半分にすると誤差もおよそ半分になる。実用上は精度が低いため、より高精度な古典的4次ルンゲ=クッタ法(RK4、大域誤差 $O(h^4)$)などが多く使われるが、オイラー法は理論の基礎として重要である(第7節)。
参考文献
- J. C. Butcher, Numerical Methods for Ordinary Differential Equations, 3rd ed., Wiley, 2016.
- E. Hairer, S. P. Nørsett, G. Wanner, Solving Ordinary Differential Equations I: Nonstiff Problems, 2nd ed., Springer, 1993.
- U. M. Ascher, L. R. Petzold, Computer Methods for Ordinary Differential Equations and Differential-Algebraic Equations, SIAM, 1998.
- Euler method — Wikipedia(英語)
- オイラー法 — Wikipedia(日本語)
まとめ
この記事のポイント
- 前進オイラー法:$y_{n+1} = y_n + hf(x_n, y_n)$(接線近似)
- 局所打ち切り誤差 $O(h^2)$、大域誤差 $O(h)$(1次精度)
- 後退オイラー法(陰的):一般には各ステップで方程式を解く必要があり、安定領域が左半平面を含むA安定な方法
- 安定性はテスト方程式 $y' = \lambda y$ と増幅因子 $R(z)$($z = h\lambda$)で解析し、絶対安定領域は $|R(z)| \le 1$ を基準に考える
- 改良オイラー法(ホイン法):2次精度で前進オイラー法より高精度