0

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

4

1 回答 1

1

真的应该早点意识到这一点,但是从乱七八糟的符号变化中发现,除了“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};
}
于 2020-09-29T15:16:25.580 回答