sir Module#

SIR compartmental epidemic model.

The classic SIR model divides the population into: - **S**usceptible - **I**nfectious - **R**ecovered (immune)

Equations#

\[\begin{split}\\frac{dS}{dt} &= -\\frac{\\beta S I}{N} \\\\ \\frac{dI}{dt} &= \\frac{\\beta S I}{N} - \\gamma I \\\\ \\frac{dR}{dt} &= \\gamma I\end{split}\]

where: - \(\\beta\) = transmission rate (day⁻¹) - \(\\gamma\) = recovery rate (day⁻¹) - \(R_0 = \\beta / \\gamma\)

Class#

class episia.models.sir.SIRModel(parameters)[source]#

Bases: CompartmentalModel

SIR epidemic model.

Parameters:

parameters (SIRParameters) – SIRParameters instance.

Example:

from episia.models import SIRModel
from episia.models.parameters import SIRParameters

params = SIRParameters(
    N=1_000_000,
    I0=10,
    beta=0.3,
    gamma=0.1,
    t_span=(0, 200),
)
model = SIRModel(params)
result = model.run()

print(model.summary())
result.plot().show()
__init__(parameters)[source]#
Parameters:

parameters (SIRParameters)

property compartment_names: List[str]#

Ordered list of compartment names, e.g. [‘S’, ‘I’, ‘R’].

Examples#

Basic usage:

from episia.models import SIRModel
from episia.models.parameters import SIRParameters

# COVID-19-like parameters
params = SIRParameters(
    N=1_000_000,
    I0=10,
    beta=0.3,      # Transmission rate
    gamma=0.1,      # Recovery rate (10 days infectious period)
    t_span=(0, 200)
)

model = SIRModel(params)
result = model.run()

print(f"Peak infections: {result.peak_infected:,.0f}")
print(f"Peak day: {result.peak_time:.0f}")
print(f"Final size: {result.final_size:.1%}")

result.plot().show()

Multiple runs with different R₀:

import numpy as np
from episia.models import SIRModel
from episia.models.parameters import SIRParameters

for r0 in [1.5, 2.5, 3.5]:
    gamma = 0.1
    beta = r0 * gamma
    params = SIRParameters(N=1e6, I0=10, beta=beta, gamma=gamma)
    result = SIRModel(params).run()
    print(f"R₀={r0:.1f}: peak={result.peak_infected:,.0f} at t={result.peak_time:.0f}")