Java中的微分方程

Ser*_*i G 10 java math ode differential-equations

我试图在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); 
    }
}
Run Code Online (Sandbox Code Playgroud)

}

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

Jas*_*n S 15

时间序列微分方程可以通过取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;
}
Run Code Online (Sandbox Code Playgroud)

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

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

祝好运!