======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