产出保持不变,实际上应该不断变化

Output remains constant which actually should keep changing

本文关键字:变化 实际上      更新时间:2023-10-16

我正在开发一种称为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 -= 1time +=1

试着这样做:

void printResult()
{
    cout <<"t    S    I       R n"<<endl;
while (time > 0)
{
    Runge_Kutta();
    time -=dt;
    cout<<time<<"   "<<susceptible<<"   "<<infected<<"   "<<recover<<"   "<<endl;
}