diffeq_rungekutta プログラム仕様

cms.diffeq_rungekutta.diffeq_euler(diff1func, t0, x0, dt)[ソース]

オイラー法を用いて次の時間ステップの x の値を予測します。

概要:

オイラー法 (Euler method) を適用して、与えられた初期値から次の時間ステップ t0 + dt における x の値を計算します。

詳細説明:

x_new = x_old + dt * f(t_old, x_old) の単純な一次近似によって、 次のステップの x の値を予測します。精度は低いですが、最も基本的な数値積分法です。

パラメータ:
  • diff1func -- function: dx/dt = f(t, x) の右辺を計算する関数。 この関数は (t, x) を引数にとり、f(t, x) を返します。

  • t0 -- float: 現在の時間 t の値。

  • x0 -- float: 現在の変数 x の値。

  • dt -- float: 時間ステップ幅。

戻り値:

float: 時間 t0 + dt における x の予測値。

cms.diffeq_rungekutta.diffeq_heun(diff1func, t0, x0, dt)[ソース]

ホイン法(修正オイラー法)を用いて次の時間ステップの x の値を予測します。

概要:

ホイン法 (Heun's method) または修正オイラー法を適用して、 与えられた初期値から次の時間ステップ t0 + dt における x の値を計算します。

詳細説明:

オイラー法による予測値 (k0) を計算した後、その予測値を用いてより正確な 傾き (k1) を計算し、それらの平均を用いて x を更新します。 x_new = x_old + (k0 + k1) / 2.0。これにより、オイラー法よりも高い精度が得られます。

パラメータ:
  • diff1func -- function: dx/dt = f(t, x) の右辺を計算する関数。 この関数は (t, x) を引数にとり、f(t, x) を返します。

  • t0 -- float: 現在の時間 t の値。

  • x0 -- float: 現在の変数 x の値。

  • dt -- float: 時間ステップ幅。

戻り値:

float: 時間 t0 + dt における x の予測値。

cms.diffeq_rungekutta.dxdt(t, x)[ソース]

積分対象となる常微分方程式 dx/dt = f(t, x) の右辺を定義します。

概要:

一次常微分方程式 dx/dt = f(t, x) の右辺 f(t, x) を計算します。

詳細説明:

この例では、f(t, x) = -x*x という具体的な関数を実装しています。

パラメータ:
  • t -- float: 時間 t の値。

  • x -- float: 変数 x の値。

戻り値:

float: t`と`x`における `dx/dt の値。

cms.diffeq_rungekutta.fsolution(t)[ソース]

与えられた時間 t における常微分方程式の厳密解を計算します。

概要:

定義された常微分方程式の厳密解 x の値を時間 t に対して計算します。

詳細説明:

本例で対象とする dx/dt = -x*x (初期条件 x(0)=1.0) の厳密解は x = 1.0 / (1.0 + t) です。この関数はこの厳密解を返します。

パラメータ:

t -- float: 時間 t の値。

戻り値:

float: 時間 t における厳密解 x の値。

cms.diffeq_rungekutta.main(x0, dt, nt)[ソース]

三段階三次のルンゲクッタ法で常微分方程式を解き、結果を出力するメインルーチン。

概要:

与えられた初期値、時間ステップ幅、総ステップ数に基づき、 三段階三次のルンゲクッタ法を用いて常微分方程式の数値解を計算し、結果を表示します。

詳細説明:

この関数は、まず初期値を設定し、最初のステップの x 値をホイン法(またはオイラー法)で予測します。 その後、指定されたステップ数 nt にわたって三段階三次のルンゲクッタ法を繰り返し適用し、 x の値を更新していきます。 iprint_interval で指定された間隔で、現在の時間 t、計算された x の値、 および厳密解 x_exact をコンソールに出力し、数値解の精度を評価できるようにします。

パラメータ:
  • x0 -- float: 初期時刻 t=0 における x の初期値。

  • dt -- float: 時間ステップ幅。各積分ステップで時間が dt だけ進みます。

  • nt -- int: シミュレーションの総ステップ数。nt 回の積分が実行されます。

戻り値:

None: 計算結果を標準出力に表示します。