Java中的微分方程

我试图在java中创建一个简单的SIR-epidemics模型模拟程序。

基本上,SIR由三个微分方程组定义:
S’(t)= – l(t)* S(t)
I’(t)= l(t)* S(t) – g(t)* I(t)
R’(t)= g(t)* I(t)

S – 易感人群,我 – 感染了人,R – 恢复了人。

l(t)= [c * x * I(t)] / N(T)

c – 接触次数,x – 感染性(与病人接触后生病的概率),N(t) – 总人口(不变)。

如何在Java中解决这些微分方程? 我不认为我知道有任何有用的方法,所以我的实现会产生垃圾。

public class Main { public static void main(String[] args) { int tppl = 100; double sppl = 1; double hppl = 99; double rppl = 0; int numContacts = 50; double infectiveness = 0.5; double lamda = 0; double duration = 0.5; double gamma = 1 / duration; for (int i = 0; i < 40; i++) { lamda = (numContacts * infectiveness * sppl) / tppl; hppl = hppl - lamda * hppl; sppl = sppl + lamda * hppl - gamma * sppl; rppl = rppl + gamma * sppl; System.out.println (i + " " + tppl + " " + hppl + " " + sppl + " " + rppl); } } 

}

我非常感谢任何帮助,非常感谢提前!

时间序列微分方程可以通过取dt =一个小数,并使用几种数值积分技术之一,例如Euler方法或Runge-Kutta来 数值模拟 。 欧拉的方法可能是原始的,但它适用于某些方程式,并且它很简单,你可以尝试一下。 例如:

S’(t)= – l(t)* S(t)

I’(t)= l(t)* S(t) – g(t)* I(t)

R’(t)= g(t)* I(t)

 int N = 100; double[] S = new double[N+1]; double[] I = new double[N+1]; double[] R = new double[N+1]; S[0] = /* initial value */ I[0] = /* initial value */ R[0] = /* initial value */ double dt = total_time / N; for (int i = 0; i < 100; ++i) { double t = i*dt; double l = /* compute l here */ double g = /* compute g here */ /* calculate derivatives */ double dSdt = - I[i] * S[i]; double dIdt = I[i] * S[i] - g * I[i]; double dRdt = g * I[i]; /* now integrate using Euler */ S[i+1] = S[i] + dSdt * dt; I[i+1] = I[i] + dIdt * dt; R[i+1] = R[i] + dRdt * dt; } 

困难的部分是弄清楚要使用多少步骤。 您应该阅读我链接到的其中一篇文章。 更复杂的微分方程求解器使用可变步长,以适应每个步骤的精度/稳定性。

我实际上建议使用像R或Mathematica或MATLAB或Octave这样的数字软件,因为它们包括ODE求解器,你不需要自己解决所有问题。 但是如果你需要在大型Java应用程序中执行此操作,至少首先使用数学软件进行尝试,然后了解步长是什么以及解算器的工作原理。

祝你好运!