Pregunta

Estoy intentando crear un sencillo programa de simulación del modelo SIR-epidemias en Java.

Básicamente, SIR se define por un sistema de tres ecuaciones diferenciales:
S '(t) = - l (t) * S (t)
I '(t) = l (t) * S (t) - g (t) * I (t)
R '(t) = g (t) * I (t)

S - susceptibles gente, - las personas infectadas, R -. Personas recuperado

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

c - número de contactos, x - infecciosidad (probabilidad a enfermar después del contacto con la persona enferma), N (t) -. Población total (que es constante)

¿Cómo puedo resolver este tipo de ecuaciones diferenciales en Java? No creo que conozco ninguna manera útil de hacer eso, por lo que mi aplicación produce basura.

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

}

Le agradecería cualquier ayuda, muchas gracias de antemano!

¿Fue útil?

Solución

ecuaciones diferenciales de series de tiempo se pueden simular numéricamente tomando dt = un número pequeño, y el uso de uno de varios numérico técnicas de integración por ejemplo, método de Euler, o de Runge-Kutta . el método de Euler puede ser primitiva, pero funciona bien para algunas ecuaciones y es bastante simple que es posible darle una oportunidad. por ejemplo:.

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 difícil es encontrar la manera de muchos pasos para usar. Debe leer uno de los artículos que he vinculados a. Más sofisticados resolvedores de ecuaciones diferenciales utilizan tamaños de paso variables que se adaptan a la precisión / estabilidad para cada paso.

De hecho, me recomendaría el uso de software numérico del tipo R o Mathematica o MATLAB o de octava, ya que incluyen solucionadores ODE y no tendrían que ir a todos los problemas usted mismo. Pero si lo que necesita hacer esto como parte de una aplicación más grande de Java, al menos probarlo primero con el software de matemáticas, entonces tener una idea de lo que los tamaños de paso son y lo solucionadores de trabajo.

Buena suerte!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top