Andrea Amantini / Oct 11 2021
Observable Python SIR
SIR Model
import numpy as npimport matplotlib.pyplot as pltfrom scipy.integrate import odeintN = 1       # Size of the population (so everything in proportions)I0 = 0.01   # Initial proportion of the population infectedS0 = N - I0 # Initial proportion of the population susceptibleR0 = 0.0    # Initial proportion of the population recoveredmaxT = 25   # max number of periods in simulationbeta = 0.5  # transmission rategamma = 0.1 # recovery ratedef SIR(y, t, beta, gamma):    '''the SIR model'''    S, I, R = y    dSdt = -beta*S*I    dIdt = beta*S*I - gamma*I    dRdt = gamma*I    return([dSdt, dIdt, dRdt])SIR model config
1.7s
def plotSIR(beta = beta, gamma = gamma, maxT = maxT):    '''Solve differential equations in SIR and plot'''    t = np.linspace(0, maxT, 1000)    soln = odeint(SIR, [S0,I0,R0], t, args=(beta, gamma))    soln = np.array(soln)    plt.figure(figsize=[8,6])    plt.plot(t, soln[:,0], linewidth=3, label = 'S(t)')    plt.plot(t, soln[:,1], linewidth=3, label = 'I(t)')    plt.plot(t, soln[:,2], linewidth=3, label = 'R(t)')    plt.title("SIR model")    plt.xlabel("Time"); plt.ylabel("proportions")    plt.grid(); plt.legend()0.0s
from IPython.display import display, HTML# display(HTML("<h1>hello</h1>"))1230.0s
plotSIR(Beta:0.5, Gamma:0.5, MaxT:55)0.3s
controls = {  const form = html`<form style="font: 12px var(--sans-serif);"><span><em>SIR model parameters</em></span>  <label style="display: block;">    <input name=beta type=range min=0.0 max=1.0 step=0.05 style="width:180px;"/>    β = <output name=obeta></output>  </label><label style="display: block;">    <input name=gamma type=range min=0.0 max=1.0 step=0.05 style="width:180px;"/>    γ = <output name=ogamma></output>  </label><label style="display: block;">    <input name=maxt type=range min=5 max=100 step=5 style="width:180px;"/>    maxT = <output name=omaxt></output></label></form>`;  form.oninput = () => {    form.obeta.value = form.beta.valueAsNumber;    form.ogamma.value = form.gamma.valueAsNumber;    form.omaxt.value = form.maxt.valueAsNumber;  };  form.oninput();  return form;}Control Generators
Generators.input(controls.beta)Beta
Generators.input(controls.gamma)Gamma
Generators.input(controls.maxt)MaxT