Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
区分Java中的SEIR模型_Java_Arrays_Differential Equations_Eulers Number_Euler Path - Fatal编程技术网

区分Java中的SEIR模型

区分Java中的SEIR模型,java,arrays,differential-equations,eulers-number,euler-path,Java,Arrays,Differential Equations,Eulers Number,Euler Path,我试图对SEIR流行病模型进行模拟。 它包括四个部分: 易感(未感染) 暴露(已感染但尚未感染) 传染性(感染性和传染性) 已移除(恢复/死亡) 其中γγ是感染率,ββ是复发率/死亡率 我之前使用过SIR模型,这是一个更基本的模型,其中E和I结合在一起,它使用以下等式: 从另一个线程中,我使用了一个解决方案来使用以下代码模拟SIR: double-dS=(beta*S.get(天)*I.get(天)/N); 双新闻=(S.get(day)-dS); double newI=(I.get(d

我试图对SEIR流行病模型进行模拟。 它包括四个部分:

  • 易感(未感染)
  • 暴露(已感染但尚未感染)
  • 传染性(感染性和传染性)
  • 已移除(恢复/死亡)
其中γγ是感染率,ββ是复发率/死亡率

我之前使用过SIR模型,这是一个更基本的模型,其中E和I结合在一起,它使用以下等式:

从另一个线程中,我使用了一个解决方案来使用以下代码模拟SIR:

double-dS=(beta*S.get(天)*I.get(天)/N);
双新闻=(S.get(day)-dS);
double newI=(I.get(day)+dS-gamma*I.get(day));
double newR=(R.get(day)+gamma*I.get(day));
使用Euler方法可以很好地实现这一点。然而,我已经试着利用它来拟合SEIR模型(它有以下等式:)


其中u是死亡率,delta是出生率,a是潜伏期。我曾尝试使用类似的方法来为SEIR工作,但根本无法很好地模拟它。这实际上不是变量的问题,但作为一个整体,微分这些复杂的方程。想知道是否有人能帮忙,谢谢。

真的应该早点意识到这一点,但通过随意改变符号,我们发现除了“新闻”之外的所有内容都需要获得前一天的数字,并加上新的dS,而不是减少它。我的长官代码已经做到了。真不知道我怎么会错过这个

新工作守则:

int totalDays = 160; // How many days/times to loop
int N = 1000; // Population
int I0 = 1; // Starting infected/exposed
double beta = 0.2; // Infection rate
double gamma = 1.0/10.0; // recovery time (days to the -1)
double a = 1.0/2.0; // incubation period (days to the -1)
List<Double> S = new ArrayList<>();
List<Double> E = new ArrayList<>();
List<Double> I = new ArrayList<>();
List<Double> R = new ArrayList<>();

private void createData() {
    final int R0 = 0;
    final int S0 = N - E0 - R0;

    S.add((double) S0);
    E.add((double) I0);
    I.add(0.0);
    R.add(0.0);

    for (int day = 1; day < totalDays + 1; day++) {
        double[] derivative = deriv(day);
        S.add(derivative[0]);
        E.add(derivative[1]);
        I.add(derivative[2]);
        R.add(derivative[3]);
    }
}

private double[] deriv(int day) {
    day = day - 1;

    double dS = (beta * S.get(day) * I.get(day)) / N;
    double newS = S.get(day) - (dS);
    double newE = E.get(day) + (dS - (a * E.get(day)));
    double newI = I.get(day) + ((a * E.get(day)) - (gamma * I.get(day)));
    double newR = R.get(day) + (gamma * I.get(day));
    return new double[] {newS, newE, newI, newR};
}
int totalDays=160;//循环多少天/多少次
int N=1000;//人口
int I0=1;//开始感染/暴露
双β=0.2;//感染率
双伽马=1.0/10.0;//恢复时间(到-1的天数)
双a=1.0/2.0;//潜伏期(至-1天)
列表S=新的ArrayList();
列表E=新的ArrayList();
列表I=新的ArrayList();
列表R=新的ArrayList();
私有void createData(){
最终整数R0=0;
最终int S0=N-E0-R0;
S.添加((双)S0);
E.添加((双)I0);
I.add(0.0);
R.add(0.0);
对于(整数天=1;天<总天数+1;天++){
双[]导数=导数(日);
S.add(导数[0]);
E.添加(衍生工具[1]);
I.添加(衍生工具[2]);
R.add(衍生工具[3]);
}
}
私人双[]日(整数日){
天=第1天;
双dS=(beta*S.get(日)*I.get(日))/N;
双新闻=S.get(日)-(dS);
双新=E.get(day)+(dS-(a*E.get(day));
double newI=I.get(day)+(a*E.get(day))-(gamma*I.get(day));
double newR=R.get(day)+(gamma*I.get(day));
返回新的double[]{newS,newE,newI,newR};
}

我有点困惑——确定使用Euler方法(以及类似方法)的全部目的是不必区分任何东西吗?您只需计算出当天每个参数的增量变化,并将该增量添加到起始值。然后冲洗并重复。例如,
dS
已经有了一个表达式,所以我认为您只需要将新模型中的额外术语合并进来。对不起,如果我是哑巴。@KevinBoone肯定不是你哑巴。我用错了符号。。。即使他们在SIR代码中是正确的。我的坏lol