線型多段法

提供: miniwiki
移動先:案内検索

線型多段法(linear multistep method)は常微分方程式数値解法の一つである。

概要

常微分方程式の数値解法では、初期値から始めて微小な刻み幅の分だけ時間を進め、次の点での解を求める。このステップを繰り返せば解曲線が得られる。

過去の[math] s [/math]個の時刻における値を用いて次の値を算出する方法を、[math] s [/math]段法または[math] s [/math]次の多段法という。特に[math] s [/math]が1の場合は1段法または単段法と呼ばれる。

1段法(single-step method)の例として、オイラー法ルンゲ=クッタ法が挙げられる。オイラー法では、過去の1時刻での値のみを用いて最新の値を決定する。ルンゲ=クッタ法では、間にある複数のステップ(例えば中点)の値を用いることで良い近似値を得ているが、2番目のステップの値を得る前に過去の情報を全て捨てている。

多段法では、過去の情報を捨てずに保持して用いることで有効な値を得る。すなわち、多段法では過去の複数の時刻での値を用いる。線型多段法の場合は、それらの線型結合が用いられる。

定義

常微分方程式とその初期値問題を次のように定める。

[math] y' = f(t,y), \quad y(t_0) = y_0. [/math]

離散的な時間[math] t_i [/math]における[math] y(t) [/math]の値は次のようになる。

[math] t_i = t_0 + i h [/math]
[math] y_i = y(t_i) = y(t_0 + i h) [/math]
[math] y_i' = f(t_i, y_i) [/math]

ここで[math] h [/math]は時間の刻み幅であり、[math] \Delta t [/math]とも書かれる。

線型多段法では、求める[math] y [/math]の値を計算するために[math] y_i [/math][math] y_i' [/math]の線型結合を用いる。[math] s [/math]段法では次の値を計算するため、過去の[math] s [/math]個の値[math] y_n, \ldots, y_{n+s-1} [/math]を用いる。そのため、求める最新の値は[math] y_{n+s} [/math]となる。

線型多段法は次の形で表される。

[math] \begin{align} & y_{n+s} + a_{s-1} y_{n+s-1} + a_{s-2} y_{n+s-2} + \cdots + a_0 y_n \\ & \qquad {} = h \bigl( b_s f(t_{n+s},y_{n+s}) + b_{s-1} f(t_{n+s-1},y_{n+s-1}) + \cdots + b_0 f(t_n,y_n) \bigr), \end{align} [/math]

[math] 2s + 1 [/math]個の係数[math] a_0, \ldots, a_{s-1} [/math][math] b_0, \ldots, b_s [/math]がこの方法を定める。各係数は使用者が決めるが、多くの係数がゼロとされることがよくある。[math] y(t) [/math][math] n [/math]次の多項式であれば、使用者はこれを厳密に補間するように係数を選ぶのが一般的である。

特徴

準備

上記のように、[math] s [/math]段法では過去の[math] s [/math]個の時刻における値が必要となる。初期値として1時刻の値のみが与えられている場合は、1段法を[math] s-1 [/math]回実行するなどして必要な値を用意しておく。

陽公式と陰公式

[math] b_s = 0 [/math]であればこの方法は陽公式と呼ばれる。陽公式は[math] y_{n+s} [/math]を直接算出できる。

[math] b_s [/math]の値がゼロでなければ、[math] y_{n+s} [/math]の値は[math] f(t_{n+s}, y_{n+s}) [/math]の値に依存する。この方法は陰公式と呼ばれ、[math] y_{n+s} [/math]を求めるための式があらかじめ解かれていなければならない。陰公式を解くためにはニュートン法のような反復法がよく用いられる。

陽公式は[math] y_{n+s} [/math]の値を「予測」するために用いられることがある。陽公式から求めた[math] y_{n+s} [/math]の値(予測子)を陰公式の[math] f(t_{n+s}, y_{n+s}) [/math]に代入すれば、より正確な[math] y_{n+s} [/math]に「修正」できる。これが予測子修正子法である。

2次のアダムス・バッシュフォース法

これは簡単な線型2段法の一つである。

[math] y_{n+2} = y_{n+1} + \tfrac32 hf(t_{n+1},y_{n+1}) - \tfrac12 hf(t_n,y_n). [/math]

この方法では2つの値[math] y_n [/math][math] y_{n+1} [/math]を用いて[math] y_{n+2} [/math]を計算する。しかし初期値問題は値を1時刻分しか提供しないため、[math] y_1 [/math]のみオイラー法で求めるなどの方法が取られる。

外部リンク