在 Java 中区分 SEIR 模型

differentiating the SEIR model in Java

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

其中 gamma γ 是感染率,beta β 是 reovery/death 率。

我以前使用过 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 是死亡率,delta 是出生率,a 是潜伏期。我已经尝试使用类似的方法来为 SEIR 工作,但我完全没有成功地模拟它。这实际上不是变量的问题,而是作为一个整体来区分这些复杂的方程式。想知道是否有人可以帮助,谢谢。

真的应该早点意识到这一点,但是通过随意更改符号,发现除了 'newS' 之外的所有内容都需要获取前一天的数字和 plussing新的 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};
}