【ルンゲクッタ法】アルゴリズム・プログラム

ルンゲクッタ法のアルゴリズムとプログラムの実装方法について解説します。

ルンゲクッタ法

ルンゲクッタ法(Runge Kutta Method)とは、数値計算的に常微分方程式の近似解を求めるアルゴリズムの1つです。
このアルゴリズムを使うことで、例えばRLC回路の過渡応答や、マスダンパバネ系の応答の計算をプログラミングで行うことができます。

アルゴリズム

オイラー法では、計算回数nを増やす(細かく分割する)ことで誤差は小さくなりますが、処理が遅くなってしまいます。
そこで、ルンゲクッタ法では、計算回数nを増やすのではなく、xiとx{i+1}の中間値を計算し、それらの重み付き平均を用いることで計算誤差を小さくします。

常微分方程式を初期条件x(t0)=x0、区間[t0, tn]の下で解くことを考えます。
このとき、ルンゲクッタ法の計算の流れは次のようになります。

アルゴリズムの流れ
1 点(x0, t0)で傾きf(x0,t0)でhだけ進むとyはd1だけ変化します。
2 ①の線上の点(x0+h/2, y0+d1/2)で傾きを計算し、(x0, t0)からhだけ進むとyはd2だけ変化します。
3 同様に(x0, t0)から傾き(x0+h/2,y0+d2/2)でhだけ進むとd3だけ変化します。
4 (x0, t0)から傾き(x0+h, y0+d3)でhだけ進むとd4だけ変化します。
5 以上の計算結果の加重平均して点(x1, t1)を計算します。
6 ①~⑤をxn, tnまで繰り返す

漸化式

上記を漸化式に直すと次のようになります。

(1)   \begin{eqnarray*} d_1=f(t_n, x_n) \end{eqnarray*}

(2)   \begin{eqnarray*} d_2=f(t_n+h/2, x_n+h d_1/2) \end{eqnarray*}

(3)   \begin{eqnarray*} d_3=f(t_n+h/2, x_n+h d_2/2) \end{eqnarray*}

(4)   \begin{eqnarray*} d_4=f(t_n+h, x_n+h k_3) \end{eqnarray*}

(5)   \begin{eqnarray*} x_{n+1}=x_{n}+\frac{h(d_1+2d_2+2d_3+d_4)}{6} \end{eqnarray*}

これは、x=x0におけるx(t0+h)の4次のテイラー展開と同じになります。
この漸化式をプロプラムで実装します。

プログラムの実装例

プログラミングによる実装例は下記事で紹介しています。

プログラムの実装例

プログラミングによる実装例は下記事で紹介しています。

【C言語】ルンゲクッタ法のプログラム
C言語でルンゲクッタ法(Runge Kutta Method)により常微分方程式の解を求めるプログラムについてソースコード付きで解説します。
【Python】ルンゲクッタ法のプログラム
この記事では、Python言語でルンゲクッタ法(Runge Kutta Method)により常微分方程式の解を求めるプログラムについてソースコード付きで解説します。
【Java】ルンゲクッタ法のプログラム
この記事では、Java言語でルンゲクッタ法(Runge Kutta Method)により常微分方程式の解を求めるプログラムについてソースコード付きで解説します。
【C#】ルンゲクッタ法のプログラム
この記事では、C#言語でルンゲクッタ法(Runge Kutta Method)により常微分方程式の解を求めるプログラムについてソースコード付きで解説します。
【Javascript】ルンゲクッタ法のプログラム
この記事では、Javascript言語でルンゲクッタ法(Runge Kutta Method)により常微分方程式の解を求めるプログラムについてソースコード付きで解説します。

コメント