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

スポンサーリンク

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

スポンサーリンク

ルンゲクッタ法

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

アルゴリズム

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

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

アルゴリズムの流れ

①点(x0, t0)で傾きf(x0,t0)でhだけ進むとyはd1だけ変化します。
②①の線上の点(x0+h/2, y0+d1/2)で傾きを計算し、(x0, t0)からhだけ進むとyはd2だけ変化します。
③同様に(x0, t0)から傾き(x0+h/2,y0+d2/2)でhだけ進むとd3だけ変化します。
④(x0, t0)から傾き(x0+h, y0+d3)でhだけ進むとd4だけ変化します。
⑤以上の計算結果の加重平均して点(x1, t1)を計算します。
⑥①~⑤を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言語】ルンゲクッタ法のプログラム
【Python】ルンゲクッタ法のプログラム
【Java】ルンゲクッタ法のプログラム
【C#】ルンゲクッタ法のプログラム
【JavaScript】ルンゲクッタ法のプログラム

スポンサーリンク

シェア&フォローお願いします!