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