LoginSignup
0
0

More than 5 years have passed since last update.

Runge-Kutta法による数値解析

Last updated at Posted at 2018-02-08

Runge-Kutta法とは

Runge-Kutta法とは、常微分方程式における数値解析の1種である。Euler法では、シミュレーション時間を刻み幅で分割し、刻み幅を用いて数値解を算出していた。この刻み幅において、Euler法では演算を1回行い、その結果を次の数値解としていたが、Runge-Kutta法では、任意の回数だけ刻み幅の単位時間に演算を行い、次の数値解を算出している。従って、一般的にEuler法よりも精度は高くなる。しかし、次元を大きくしていくに従って、計算処理量が多くなってしまう。よって、Runge-Kutta法の演算次元は4次までとしていることが多い。今回、対象とする常微分方程式は、RC回路のコンデンサ電圧における回路方程式とします。この回路では、直流電源を用いるとします。

Cによるソースコード

#include<stdio.h>
#include<math.h>

double func(double t, double Vc) {

    return 100000 - 1000 * Vc;

}

int main(void) {

    double Vc, t, step, R, C, end;
    double k1, k2, k3, k4;
    int error;
    FILE *fi;

    R = 10;
    C = 0.0001;
    step = ((R*C) / 100.0)*100;
    Vc = 0.0;
    end = 0.01;

    if ((error = fopen_s(&fi, "Runge_Kutta_data_100.txt", "w")) != 0) {

        printf("\nThis file can't opened \n\n");

        return 0;

    }

    for (t = 0.0; t <= end; t = t + step) {

        fprintf(fi, "%f %f\n", t, Vc);

                //Runge-Kutta法による演算
        k1 = step*func(t, Vc);
        k2 = step*func(t + step*0.5, Vc + k1*0.5); 
        k3 = step*func(t + step*0.5, Vc + k2*0.5);
        k4 = step*func(t + step, Vc + k3);
        Vc = Vc + (k1 + 2.0*k2 + 2.0*k3 + k4) / 6.0;


    }

    fclose(fi);

    return 0;
}


上記のソースコードを実行すると、時間領域におけるRC回路のコンデンサ電圧の値がtextファイルとして出てきます。
この出てきたファイルをgunuplotで実行させるとRC回路のコンデンサ電圧におけるEuler法を用いた数値解をプロットする事が出来ます。

以下に、簡単なGunuplotのソースコードを示します。


se grid
se xrange [0:0.01]
se yrange [0:110]
se xlabel "s[sec]"
se ylabel "Vc[V]"
plot "Euler_data.txt" using 1:2 with lines



0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0