微分方程组的欧拉方法
Euler Method for system of differential equations
我正在尝试按照 here 所述重新创建 SIR 模型的计算,并进行额外的中点计算。但由于某种原因,在欧拉计算期间实际上没有值发生变化。
#include <iostream>
using namespace std;
int main(){
double s[100];
double i[100];
double r[100];
double bb = 1/2;
double kk = 1/3;
s[0] = 1;
i[0] = 1.27e-6;
r[0] = 0;
int h = 1;
int max = 20;
for (int j = 0; j < max; j += h){
s[j + 1] = s[j] - h*(bb * s[j] * i[j]);
i[j + 1] = i[j] + h*(bb * s[j] * i[j] - kk * i[j]);
r[j + 1] = r[j] + h*(kk * i[j]);
cout << j << "\t" << s[j] << "\t" << i[j] << "\t" << r[j] << "\n";
/*
s[j + 1] = s[j] - 0.5*h*(bb * s[j] * i[j] + bb * s[j+1] * i[j+1]);
i[j + 1] = i[j] + 0.5*h*(bb * s[j] * i[j] - kk * i[j] + bb * s[j+1] * i[j+1] - kk * i[j+1]);
r[j + 1] = r[j] + 0.5*h*(kk * i[j] + kk * i[j+1]);
*/
}
}
由于整数除法,您的变量 bb
和 kk
均为零。始终使用双文字:
double bb = 1.0/2.0;
double kk = 1.0/3.0;
我正在尝试按照 here 所述重新创建 SIR 模型的计算,并进行额外的中点计算。但由于某种原因,在欧拉计算期间实际上没有值发生变化。
#include <iostream>
using namespace std;
int main(){
double s[100];
double i[100];
double r[100];
double bb = 1/2;
double kk = 1/3;
s[0] = 1;
i[0] = 1.27e-6;
r[0] = 0;
int h = 1;
int max = 20;
for (int j = 0; j < max; j += h){
s[j + 1] = s[j] - h*(bb * s[j] * i[j]);
i[j + 1] = i[j] + h*(bb * s[j] * i[j] - kk * i[j]);
r[j + 1] = r[j] + h*(kk * i[j]);
cout << j << "\t" << s[j] << "\t" << i[j] << "\t" << r[j] << "\n";
/*
s[j + 1] = s[j] - 0.5*h*(bb * s[j] * i[j] + bb * s[j+1] * i[j+1]);
i[j + 1] = i[j] + 0.5*h*(bb * s[j] * i[j] - kk * i[j] + bb * s[j+1] * i[j+1] - kk * i[j+1]);
r[j + 1] = r[j] + 0.5*h*(kk * i[j] + kk * i[j+1]);
*/
}
}
由于整数除法,您的变量 bb
和 kk
均为零。始终使用双文字:
double bb = 1.0/2.0;
double kk = 1.0/3.0;