微分方程式の数値解析の仕組み|Pythonのodeint

スポンサーリンク

odeintの例

以前、Pythonのodeintを使って1階微分方程式と2階微分方程式を解きました。

その時は訳も分からずodeintを使っていただけなので、odeintの内部でどのようにして微分方程式を解いているのかを考察します。

1階微分方程式

位置\(x\)を時間の関数として

$$x = x(t)$$

と置きます。

そして、1階微分方程式は\(x'(t)\)が \(x(t)\)の関数になっており、 下のように書けます。

$$x'(t) = f(x(t))$$

Pythonのodeintで微分方程式を解くときは、初期値の\(x(t_0)\)と\(t\)の範囲及び、 \(t\) のステップ数 \( \Delta t\) を指定しました。

それではodeintの中ではどのように計算しているのでしょうか。

初期値\(t = t_0\)の時

  1. 値の代入
    $$x'(t_0) = f(x(t_0))$$
  2. \(x(t_1)\)の計算
    \(x(t)\)は\(t=t_0\)において傾き\(x'(t_0)\)の直線で近似されます。
    その直線の式は
    $$x(t) = x'(t_0)(t – t_0) + x(t_0)$$
    です。
    \(t=t_1\)を代入して、\(t_1 – t_0 = \Delta t\)と置き換えると
    $$x(t_1) = x'(t_0) \Delta t + x(t_0)$$

これらを繰り返すことで\(x(t)\)が数値的に求められそうです。

漸化式ちっくに一般化してみます。

\(t = t_n\)の時

  1. 値の代入
    $$x'(t_n) = f(x(t_n))$$
  2. \(x(t_{n+1})\)の計算
    \(x(t)\)は\(t=t_n\)において傾き\(x'(t_n)\)の直線で近似されます。
    その直線の式は
    $$x(t) = x'(t_n)(t – t_n) + x(t_n)$$
    です。
    \(t=t_{n+1}\)を代入して、\(t_{n+1} – t_n = \Delta t\)と置き換えると
    $$x(t_{n+1}) = x'(t_n) \Delta t + x(t_n)$$

一般化してすっきりしました。

これらの操作を繰り返すことで微分方程式を数値的に解けそうです。

この方法だと

$$x'(t) = x(t)^2$$

なども簡単に解けそうですね。

2階微分方程式

2階微分方程式は物理ではよく登場します。

1番最初に学ぶのは、ばねの振動の微分方程式ではないでしょうか。

そして、2階微分方程式は\(x”(t)\)が \(x(t)\)と \(x'(t)\) の関数になっており、 下のように書けます。

$$x”(t) = f(x(t), x'(t))$$

1階微分方程式の時と同様にPythonのodeintで微分方程式を解くときは、初期値の\(x(t_0)\)と \(x'(t_0)\)、\(t\)の範囲及び、 \(t\) のステップ数 \( \Delta t\) を指定しました。

それではodeintの中ではどのように計算しているのでしょうか。

初期値\(t = t_0\)の時

  1. 値の代入
    $$x”(t_0) = f(x(t_0),x'(t_0))$$
  2. \(x'(t_1)\)の計算
    \(x'(t)\)は\(t=t_0\)において傾き\(x”(t_0)\)の直線で近似されます。
    その直線の式は
    $$x'(t) = x”(t_0)(t – t_0) + x'(t_0)$$
    です。
    \(t=t_1\)を代入して、\(t_1 – t_0 = \Delta t\)と置き換えると
    $$x'(t_1) = x”(t_0) \Delta t + x'(t_0)$$
  3. \(x(t_1)\)の計算
    \(x(t)\)は\(t=t_0\)において傾き\(x'(t_0)\)の直線で近似されます。
    その直線の式は
    $$x(t) = x'(t_0)(t – t_0) + x(t_0)$$
    です。
    \(t=t_1\)を代入して、\(t_1 – t_0 = \Delta t\)と置き換えると
    $$x(t_1) = x'(t_0) \Delta t + x(t_0)$$

これらを繰り返すことで\(x(t)\)と\(x'(t)\)が数値的に求められそうです。

2階微分方程式では\(x(t)\)を求めるために\(x'(t)\)が必要で、 その\(x'(t)\)を求めるために\(x”(t)\)を使うというように2段階構成になっています。

漸化式ちっくに一般化してみます。

\(t = t_n\)の時

  1. 値の代入
    $$x'(t_n) = f(x(t_n))$$
  2. \(x'(t_{n+1})\)の計算
    \(x'(t)\)は\(t=t_n\)において傾き\(x”(t_n)\)の直線で近似されます。
    その直線の式は
    $$x'(t) = x”(t_n)(t – t_n) + x'(t_n)$$
    です。
    \(t=t_{n+1}\)を代入して、\(t_{n+1} – t_n = \Delta t\)と置き換えると
    $$x'(t_{n+1}) = x”(t_n) \Delta t + x'(t_n)$$
  3. \(x(t_{n+1})\)の計算
    \(x(t)\)は\(t=t_n\)において傾き\(x'(t_n)\)の直線で近似されます。
    その直線の式は
    $$x(t) = x'(t_n)(t – t_n) + x(t_n)$$
    です。
    \(t=t_{n+1}\)を代入して、\(t_{n+1} – t_n = \Delta t\)と置き換えると
    $$x(t_{n+1}) = x'(t_n) \Delta t + x(t_n)$$

一般化してすっきりしました。

これらの操作を繰り返すことで2階微分方程式も数値的に解けそうです。

この仕組みが分かっていればodeintで同様にn階微分方程式も解けることが分かりました。

コメント

タイトルとURLをコピーしました