簡體   English   中英

Java中的微分方程

[英]Differential Equations in 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應用程序中執行此操作,至少首先使用數學軟件進行嘗試,然后了解步長是什么以及解算器的工作原理。

祝好運!

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM