用Java区分SEIR模型

问题描述

我正在尝试模拟SEIR流行模型。 它包含四个部分:

  • 易感(未感染)
  • 暴露(已感染但尚未感染)
  • 传染性(感染性和传染性)
  • 删除(已恢复/已死)

其中,γ是感染率,ββ是复发/死亡率。

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

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

double dS = (beta * S.get(day) * I.get(day) / N);
double newS = (S.get(day) - dS);
double newI = (I.get(day) + dS - gamma * I.get(day));
double newR = (R.get(day) + gamma * I.get(day));

使用欧拉方法可以很好地工作。但是,我尝试操纵它以尝试拟合SEIR模型(具有以下等式:)

其中u是死亡率,del是出生率,a是潜伏期。我已经尝试尝试使用类似的方法来为SEIR工作,但是我完全无法成功模拟它。这实际上不是变量的问题,但总体上可以区分这些复杂的方程式。想知道是否有人可以提供帮助,谢谢。

解决方法

真的应该早一点意识到这一点,但要避免乱搞随机的符号变化,要弄清除“ newS”外的所有内容都需要获取前一天的编号并新的dS,而不是减法它。我的SIR代码已经做到了。真的不知道我怎么想念这个。.

新的工作代码:

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};
}