Modelo SIR con Nacimientos y Muertes en Python

El modelo SIR con nacimientos y muertes es un sistema de tres ecuaciones diferenciales no lineales en el que se modelo el comportamiento de un virus en un conjunto de personas N en el inicio del modelo respectivo.

$${\Large \begin{align*} \frac{dS}{dt} &= -aSI + c(N - S) \hspace{1.2cm},\hspace{0.2cm} S(0) = S_{0} \\ \frac{dI}{dt} &= aSI - bI - cI \hspace{1.2cm},\hspace{0.2cm} I(0) = I_{0} \\ \frac{dR}{dt} &= bI - cR \hspace{1.2cm},\hspace{0.2cm} R(0) = R_{0} \end{align*} }$$

Donde:

S = Personas Susceptibles
I = Personas Infectadas
R =  Personas Recuperadas
t = tiempo
N = $S_{0} + I_{0} + R_{0}$ 
a = Tasa de transmisión de la enfermedad
b = Tasa de recuperación de las personas infectadas
c = Tasa de muerte de las personas infectadas

El sistema de ecuaciones diferenciales anterior no tiene solución analítica. Por consiguiente se necesita del análisis numérico para poder resolverse.

Antes de crear el código fuente es necesario que se importan algunas librerías correspondientes para compilar este código.

import numpy as np
import matplotlib.patches as mpatches
import matplotlib.pyplot as plt

Ahora iniciaremos el código respectivamente


Código Fuente del Modelo SIR con Nacimientos y Muertes

def epid(t0, tn, x0, y0, z0, n, a, b, c):
    
    """ t0 = es el tiempo inicial
        tn 0 es el tiempo final
        n es el número de pasos
        [x0, y0, z0] es la condicion inicial, x0 es mucho mayor 
                     que y0 y z0 comunmente es 0
        [a,b,c] son las constantes del modelo Sir con nacimientos
                y muertes, cuando c = 0 el modelo es Sir sin nacimientos 
                y muertes """
    
    f1 = lambda t,x,y,z: -a*x*y + c*(x0 + y0 + z0 - x)
    f2 = lambda t,x,y,z: a*x*y - b*y - c*y
    f3 = lambda t,x,y,z: b*y - c*
    
    f4 = lambda t,u,v,w: -a*u*v 
    f5 = lambda t,u,v,w: a*u*v - b*
    f6 = lambda t,u,v,w: b*
    
    t = np.linspace(t0, tn, n+1)
    x = np.zeros(n+1)
    y = np.zeros(n+1)
    z = np.zeros(n+1)
    u = np.zeros(n+1)
    v = np.zeros(n+1)
    w = np.zeros(n+1)
    
    x[0= x0
    y[0= y0
    z[0= z0
    
    u[0= x0
    v[0= y0
    w[0= z0
    
    h = (tn-t0)/n
    
    for i in range(1,n+1):
        x[i] = x[i-1] + h*f1(t[i-1], x[i-1], y[i-1], z[i-1])
        y[i] = y[i-1] + h*f2(t[i-1], x[i-1], y[i-1], z[i-1])
        z[i] = z[i-1] + h*f3(t[i-1], x[i-1], y[i-1], z[i-1])
        u[i] = u[i-1] + h*f4(t[i-1], u[i-1], v[i-1], w[i-1])
        v[i] = v[i-1] + h*f5(t[i-1], u[i-1], v[i-1], w[i-1])
        w[i] = w[i-1] + h*f6(t[i-1], u[i-1], v[i-1], w[i-1])
    
    fig, ((ax1, ax2)) = plt.subplots(1,2)
    fig.set_size_inches(16,8)
    
    ax1.plot(t, x, lw = 3, color = 'r', label = "Susceptibles")
    ax1.plot(t, y, lw = 3, color = 'b', label = "Infectados")
    ax1.plot(t, z, lw = 3, color = 'g', label = "Recuperados")
    ax1.set_xlabel('Tiempo', size = 20
    ax1.set_title("SIR con Nacimientos y Muertes", size=20)
    ax1.legend(fontsize = 15)
    ax1.grid()

    ax2.plot(t, u, lw = 3, color = 'r', label = "Susceptibles")
    ax2.plot(t, v, lw = 3, color = 'b', label = "Infectados")
    ax2.plot(t, w, lw = 3, color = 'g', label = "Recuperados")
    ax2.set_xlabel('Tiempo', size = 20
    ax2.set_title("SIR sin Nacimientos y Muertes", size=20)
    ax2.legend(fontsize = 15)
    ax2.grid()    

    plt.suptitle('Modelos Epidemiológicos', fontsize=25, size=30)
    plt.tight_layout()
    plt.show()

    return epid

Aplicación del código fuente

$${\Large \begin{align*} \frac{dS}{dt} &= -(0.0022)SI + 0.05(1100 - S) \hspace{1.2cm},\hspace{0.2cm} S(0) = 1000 \\ \frac{dI}{dt} &= (0.0022)SI - (0.4477)I - (0.05)I \hspace{1.2cm},\hspace{0.2cm} I(0) = 100 \\ \frac{dR}{dt} &= (0.4477)I - (0.05)R \hspace{1.2cm},\hspace{0.2cm} R(0) = 0 \end{align*} }$$


epid(0, 30, 1000, 100, 0, 10000, 0.0022, 0.4477, 0.05)


Comentarios