[英]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.