Domanda

Sto cercando di creare un programma di simulazione semplice del SIR-epidemie modello in Java.

Fondamentalmente, SIR è definito da un sistema di tre equazioni differenziali:
S '(t) = - l (t) * S (t)
I '(t) = l (t) * S (t) - g (t) * I (t)
R '(t) = g (t) * I (t)

S - suscettibile di persone, I - persone infette, R -. Recuperato persone

l (t) = [c * x * I (t)] / N (T)

c - numero di contatti, x - infettività (probabilità di ammalarsi dopo il contatto con la persona malata), N (t) -. Popolazione totale (che è costante)

Come posso risolvere tali equazioni differenziali in Java? Io non credo di sapere alcun modo utile per farlo, quindi la mia implementazione produce rifiuti.

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

}

Io apprezzo molto di aiuto, molte grazie in anticipo!

È stato utile?

Soluzione

equazioni differenziali Time-serie possono essere simulati numericamente prendendo dt = un piccolo numero, e utilizzando uno dei vari numerico tecniche di integrazione es di Eulero metodo , o Runge-Kutta . il metodo di Eulero può essere primitivo, ma funziona bene per alcune equazioni ed è abbastanza semplice che si potrebbe fare un tentativo. per esempio:.

  

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

La parte più difficile è capire quanti passi da utilizzare. Si consiglia di leggere uno degli articoli che ho legati a. Più sofisticati differenziali risolutori equazioni impiegare dimensioni passo variabile che si adattano alla precisione / stabilità per ogni passaggio.

Vorrei davvero consiglia di utilizzare software di calcolo numerico come R o Mathematica o Matlab o Octave, in quanto comprendono risolutori ODE e che non avrebbe bisogno di andare a tutti i problemi da soli. Ma se avete bisogno di fare questo come parte di una più ampia applicazione Java, almeno provare prima con il software per la matematica, quindi ottenere un senso di ciò che gli incrementi sono e quali risolutori di lavoro.

In bocca al lupo!

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top