在 Java 中区分 SEIR 模型
differentiating the SEIR model in Java
我正在尝试模拟 SEIR 流行病模型。
它包含四个部分:
- 易感者(non-infected)
- 暴露(已感染但尚未传染)
- Infectious(感染和感染)
- 已删除(recovered/dead)
其中 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};
}
我正在尝试模拟 SEIR 流行病模型。 它包含四个部分:
- 易感者(non-infected)
- 暴露(已感染但尚未传染)
- Infectious(感染和感染)
- 已删除(recovered/dead)
其中 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};
}