diffeq_simpson プログラム仕様

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

オイラー法を用いて1階常微分方程式を1ステップ進めます。

詳細説明:

x(t+dt) = x(t) + dt * f(t, x(t)) の式に基づき、 次の時刻における x の値を計算します。

パラメータ:
  • diff1func (callable) -- 評価対象となる微分方程式の右辺を計算する関数 (f(t, x) の形式)。

  • t0 (float) -- 現在の時刻 t

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

  • dt (float) -- 時間刻み幅。

戻り値:

次の時刻 t + dt における x の値。

戻り値の型:

float

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

ホイン法(修正オイラー法)を用いて1階常微分方程式を1ステップ進めます。

詳細説明:

オイラー法で求めた予測値と、その予測値を用いて再計算した傾きの平均を取ることで、 より精度の高い次の時刻の x の値を計算します。

パラメータ:
  • diff1func (callable) -- 評価対象となる微分方程式の右辺を計算する関数 (f(t, x) の形式)。

  • t0 (float) -- 現在の時刻 t

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

  • dt (float) -- 時間刻み幅。

戻り値:

次の時刻 t + dt における x の値。

戻り値の型:

float

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

シンプソン法(に似た重みを持つRunge-Kutta法)を用いて1階常微分方程式を1ステップ進めます。

詳細説明:

3つの傾き k0, k1, k2 を計算し、シンプソン則の重み (1/3, 4/3, 1/3) に似た 加重平均 (k0 + 4*k1 + k2) / 3 を用いて、次の時刻における x の値を計算します。 この実装はRunge-Kutta法のバリアントとして、シンプソン則の重み付けを適用しています。

パラメータ:
  • diff1func (callable) -- 評価対象となる微分方程式の右辺を計算する関数 (f(t, x) の形式)。

  • t0 (float) -- 現在の時刻 t

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

  • dt (float) -- 時間刻み幅。

戻り値:

次の時刻 t + dt における x の値。

戻り値の型:

float

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

評価対象となる微分方程式 dx/dt = -x^2 の右辺を計算します。

詳細説明:

時刻 t と変数 x の値を受け取り、微分方程式の右辺である -x*x を計算します。

パラメータ:
  • t (float) -- 時刻 t

  • x (float) -- 変数 x の値。

戻り値:

微分方程式の右辺 dx/dt の値。

戻り値の型:

float

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

微分方程式 dx/dt = -x^2 の解析解を計算します。

詳細説明:

初期条件 x(0)=1.0 の場合の解析解 x = 1 / (1 + t) を返します。

パラメータ:

t (float) -- 時刻 t

戻り値:

時刻 t における解析解 x の値。

戻り値の型:

float

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

1階常微分方程式をシンプソン法で数値的に解き、解析解と比較して結果を表示します。

詳細説明:

シミュレーションパラメータに基づいて、時刻 t、数値計算結果 x(cal)、 および解析解 x(exact) をコンソールに出力します。 初期値と時間刻み幅を用いて、ループ内でシンプソン法により x を更新していきます。 iprint_interval で指定された間隔で結果を出力します。

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

  • dt (float) -- 時間刻み幅。

  • nt (int) -- 総ステップ数。

戻り値:

None

戻り値の型:

None