======2階常微分方程式 ====== ===== 共通部分 ===== $z=y'=\frac{{\rm d}}{{\rm d}x}y$と置くのでこの部分はすべて共通。 double dydx(double x, double y, double z) { return z; } ===== 問題によって変更する部分 ===== $x, y, y'(=z), y''$で書かれた式を$y''=\cdots$の形に直して、その右辺の式を計算する関数をここに定義する。 例は、$y''+2y'+y=1$すなわち$y''=1-2y'-y=1-2z-y$の場合の例になっている。 double dzdx(double x, double y, double z) { double ret; ret = 1.0 - 2.0*z - y; return ret; } また、問題や用途によって「繰り返し回数」、「初期値」、「刻み幅」は適当なものに適宜変更せよ。 int i, n = 100; /* 繰り返し回数 */ double x = 0.0, y = 0.0, z = 0.0; /* 初期値 */ double dx = 0.01; /* 刻み幅 */ ===== オイラー法-2階版 ===== #include #include double dydx(double x, double y, double z); double dzdx(double x, double y, double z); int main(void) { int i, n = 100; /* 繰り返し回数 */ double x = 0.0, y = 0.0, z = 0.0; /* 初期値 */ double dx = 0.01; /* 刻み幅 */ double dy, dz; printf("%f %f %f\n", x, y, z); for (i=0; i ===== 修正オイラー法-2階版 ===== #include #include double dydx(double x, double y, double z); double dzdx(double x, double y, double z); int main(void) { int i, n = 100; /* 繰り返し回数 */ double x = 0.0, y = 0.0, z = 0.0; /* 初期値 */ double dx = 0.01; /* 刻み幅 */ double dy1, dy2, dz1, dz2; printf("%f %f %f\n", x, y, z); for (i=0; i ===== ルンゲ・クッタ法-2階版 ===== #include #include double dydx(double x, double y, double z); double dzdx(double x, double y, double z); int main(void) { int i, n = 100; /* 繰り返し回数 */ double x = 0.0, y = 0.0, z = 0.0; /* 初期値 */ double dx = 0.01; /* 刻み幅 */ double dy1, dy2, dy3, dy4, dz1, dz2, dz3, dz4; printf("%f %f %f\n", x, y, z); for (i=0; i