java - Java 中的微分方程

标签 java math ode differential-equations

我正在尝试在 java 中创建一个简单的 SIR 流行病模型模拟程序。

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

S - 易感人群,I - 感染者,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 = 一个小数,并使用几个 numerical integration techniques 中的一个来进行数值模拟。例如Euler's method , 或 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 应用程序的一部分来执行,至少先使用数学软件进行尝试,然后了解步长是多少以及求解器的工作原理。

祝你好运!

关于java - Java 中的微分方程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4357061/

相关文章:

java - 将文字分配给 Float 时出现类型不匹配错误

java - Android:如何在内存中创建和保存 map View 以供所有 Activity 使用

java - 如何使用龙格-库塔法 (RK4) 求解牛顿冷却定律

image - 元素 x, y, width, height 转换到不同维度

python - Pyomo 在时间序列缺失值的 ODE 系统中的参数估计

java - 使用 JSF 下载文件?

java - 如何在后台使用PHP/HTML作为界面,使用Java/Python作为功能?

简单平方的算法

java - 如何用 Java 求解 ODE?

python - 为 Scipy 的 "odeint"的边界条件指定不同的时间点?