产出保持不变,实际上应该不断变化
Output remains constant which actually should keep changing
我正在开发一种称为SIR模型的流行病模型,其中t表示执行时的时间应该保持从0到10的时间变化,但我的输出保持恒定在10。我在下面的代码做错了什么?
#include<iostream>
#include<cmath>
using namespace std;
class SIR
{
private:
double t,susceptible,infected,recover,states[3];
double diffstate[3],dt;
double b,k;
double time;
public:
SIR();
SIR(double bCurr, double kCurr, double deltat, double sCurr, double iCurr, double maxtime);
~SIR();
void stepStates(double states[3]);
void Runge_Kutta();
void printResult();
};
SIR::SIR(double bCurr, double kCurr, double deltat, double sCurr,double iCurr, double maxtime)
{
b = bCurr;
k =kCurr;
dt = deltat;
susceptible=sCurr;
infected = iCurr;
recover = 1 - susceptible - infected;
time = maxtime;
}
SIR::~SIR(){}
void SIR::stepStates(double states[3])
{
diffstate[0] = - b*states[0]*states[1];
diffstate[1] = b*states[0]*states[1] - k*states[1];
diffstate[2] = k*states[1];
}
void SIR::Runge_Kutta()
{
int i= 0;
double y1[3], y2[3], y3[3], y4[3];
double x[3], initialStates[3];
initialStates[0]=susceptible; initialStates[1]=infected; initialStates[2]=recover;
stepStates(initialStates);
for(i=0;i<3;i++)
{
y1[i]=diffstate[i];
x[i]=initialStates[i]+dt*y1[i]/2;
}
stepStates(x);
for(i=0;i<3;i++)
{
y2[i]=diffstate[i];
x[i]=initialStates[i]+dt*y2[i]/2;
}
stepStates(x);
for(i=0;i<3;i++)
{
y3[i]=diffstate[i];
x[i]=initialStates[i]+dt*y3[i];
}
stepStates(x);
for(i=0;i<3;i++)
{
y4[i]=diffstate[i];
x[i]=initialStates[i]+(y1[i]/6 + y2[i]/3 + y3[i]/3 + y4[i]/6)* dt;
}
susceptible = x[0];
infected = x[1];
recover = x[2];
}
void SIR::printResult()
{
t=0;
cout <<"t S I R n"<<endl;
do
{
Runge_Kutta();
t+=dt;
cout<<time<<" "<<susceptible<<" "<<infected<<" "<<recover<<" "<<endl;
}while(t<time);
}
int main(int argc, char** argv)
{
double bCurr = 1.0/2.0;
double sCurr = 9999999.0/10000000.0;
double iCurr = 1.0/10000000.0;
double rCurr = 0.0;
double kCurr = 1.0/3.0;
double deltat = 0.01/((bCurr*kCurr)*sCurr);// small step size in time
std::cout << "time S I R n" << std::endl;
double maxtime = 10;
SIR mySIR(bCurr, kCurr, deltat ,sCurr, iCurr , maxtime);
mySIR.printResult();
return(0);
}
你正在设置maxtime = 10;然后用它来设定时间。但是这个值在任何地方都不会改变。所以,这个值仍然是10。
在构造函数中将time
初始化为maxTime
,然后再也不碰它。这实际上是唯一一次修改time
的值。在你的printResult()
中,你有你的do/while循环,但在t < time
上运行。
底线是将time
初始化为10,然后不修改该值。在你所有的代码中不能有一个time -= 1
或time +=1
。
试着这样做:
void printResult()
{
cout <<"t S I R n"<<endl;
while (time > 0)
{
Runge_Kutta();
time -=dt;
cout<<time<<" "<<susceptible<<" "<<infected<<" "<<recover<<" "<<endl;
}
相关文章:
- C++取消引用指针.为什么会发生变化
- 为什么在读取文件大小时文件IO速度会发生变化
- 如何确认我的constexpr表达式实际上已经在编译时执行
- 为什么我的删除节点函数实际上没有删除节点?
- 为什么cudaMemGetInfo报告设备内存总量的变化
- 其中降频广播实际上是有用的
- 如何避免LED在循环状态变化中闪烁?
- 当 I2C 值在C++中发生变化时收到通知
- Gtkmm 会不断检查 Gtk::日历上的所选日期是否发生变化
- "delete"在 C++ 中实际上做了什么?
- 当我调用对象的方法时,对象的成员会发生变化
- 为什么向量内部的指针在从函数返回时会发生变化?
- C++:实际上不是从二进制文件中读取
- 在这里,当我们比较 if(vc[i]==vc1[i]) 时,它是向量数组. 实际上比较的值是多少,
- 如何在 c++ 中循环中使用频率变化的声音?
- 为什么 C++ 中的零会发生变化
- 为什么我的全局变量似乎没有变化?
- 使用 IMFSinkWriter 编码的视频的播放速度会根据宽度而变化
- 您好,我实际上想了解以下代码.有人可以详细说明代码它到底在做什么吗?为什么它会在第 31 行崩溃
- 产出保持不变,实际上应该不断变化