Runge-Kutta法による数値解析

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