11

JavaでSIRエピデミックモデルの簡単なシミュレーションプログラムを作成しようとしています。

基本的に、SIRは次の3つの微分方程式のシステムによって定義されます
。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); 
    }
}

}

よろしくお願いします。よろしくお願いします。

4

1 に答える 1

16

時系列微分方程式は、dt =少数を取り、オイラー法ルンゲクッタ法などのいくつかの数値積分手法の1つを使用して数値的にシミュレートできます。オイラー法は原始的かもしれませんが、いくつかの方程式では問題なく機能し、試してみるのに十分簡単です。例えば:

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;
}

難しいのは、使用するステップの数を把握することです。私がリンクした記事の1つを読む必要があります。より洗練された微分方程式ソルバーは、各ステップの精度/安定性に適応する可変ステップサイズを使用します。

実際には、R、Mathematica、MATLAB、Octaveなどの数値ソフトウェアを使用することをお勧めします。これらにはODEソルバーが含まれており、すべての問題に自分で取り組む必要はありません。ただし、より大きなJavaアプリケーションの一部としてこれを行う必要がある場合は、少なくとも最初に数学ソフトウェアで試してから、ステップサイズとソルバーが機能することを理解してください。

幸運を!

于 2010-12-05T03:11:20.073 に答える