如何解决用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};
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。