Воведување на карантин¶
Во ова поглавје ќе имплементираме минимална промена: да речеме дека повторно го користиме SEIRD моделот, на кој дополнуваме ден \(L\) ден; ден од кој се воведува строг карантин, во кој \(R_0\) се редуцира од почетната вредност на помала.
Во овие пресметки го користиме \(\beta\) за согледување на промената наместо \(R_0\), но знаеме дека \(R_0 = \frac{\beta}{\gamma}\), од која следува дека
Еве неколку графикони со различни вредности за \(L\) со почетни вредности:
\(R_0 = 5\rightarrow\) се почнува со почетно \(R_0\) да е 5 меѓутоа при промена на вредноста за карантинот (\(L\)) се менува вредноста од 5 на 1 после \(L-\)иот ден
\(N = 1 000 000 \rightarrow\) 1 милион вкупна популација
\(D = 4 \rightarrow\) една заразена личност може 4 денови да ја чува во себе заразата и истата да ја шири
\(\gamma = \frac{1}{D} = \frac{1}{4} \rightarrow\) четвртина од заразени личности заздравуваат на ден
\(\delta = \frac{1}{5} \rightarrow\) инкубациски период од 5 дена
\(\alpha = 0.2 \rightarrow\) 20% смрттна стапка (лошо за модел бидејќи се разликува за возрасти, повеќе за ова подоцна)
\(\rho = \frac{1}{9} \rightarrow\) 9 денови од заразата до смрт
\(S(0)=N-1, E(0)=1, I(0)=0, R(0)=0, D(0)=0 \rightarrow\) една личност изложена на заразата на 0 ден
# Python3 imports
from scipy.integrate import odeint
import numpy as np
import math
import plotly.graph_objects as go
import plotly.tools as tls
from plotly.offline import plot, iplot, init_notebook_mode
from IPython.core.display import display, HTML
init_notebook_mode(connected = True)
config={'showLink': False, 'displayModeBar': False}
def deriv(y, t, N, beta, gamma, delta, alpha, rho):
S, E, I, R, D = y
dSdt = -beta(t) * S * I / N
dEdt = beta(t) * S * I / N - delta * E
dIdt = delta * E - (1 - alpha) * gamma * I - alpha * rho * I
dRdt = (1 - alpha) * gamma * I
dDdt = alpha * rho * I
return dSdt, dEdt, dIdt, dRdt, dDdt
data = []
for i in range(40, 80, 1):
L = i
N = 1_000_000
D = 4.0 # infections lasts four days
gamma = 1.0 / D
delta = 1.0 / 5.0 # incubation period of five days
def R_0(t):
return 5.0 if t < L else 1.0
def beta(t):
return R_0(t) * gamma
alpha = 0.2 # 20% death rate
rho = 1/9 # 9 days from infection until death
S0, E0, I0, R0, D0 = N-1, 1, 0, 0, 0 # initial conditions: one exposed
t = np.linspace(0, 99, 100) # Grid of time points (in days)
y0 = S0, E0, I0, R0, D0 # Initial conditions vector
# Integrate the SIR equations over the time grid, t.
ret = odeint(deriv, y0, t, args=(N, beta, gamma, delta, alpha, rho))
S, E, I, R, D = ret.T
# Plot Model using plotly
figc = go.Figure()
data_1 = go.Scatter(x = t,
y = S,
mode = 'lines',
visible = False,
line=dict(color="blue",
width=2),
name = "Подлежни; <i>S(t)</i>",
hovertemplate = '<i> %{y:.0f} </i> луѓе')
data_2 = go.Scatter(x = t,
y = E,
mode = 'lines',
visible = False,
line=dict(color="#CCCC00",
width=2),
name = "Изложени; <i>E(t)</i>",
hovertemplate = '<i> %{y:.0f} </i> луѓе')
data_3 = go.Scatter(x = t,
y = I,
mode = 'lines',
visible = False,
line=dict(color="red",
width=2),
name = "Заразени; <i>I(t)</i>",
hovertemplate = '<i> %{y:.0f} </i> луѓе')
data_4 = go.Scatter(x = t,
y = R,
mode = 'lines',
visible = False,
line=dict(color="green",
width=2),
name = "Оздравени; <i>R(t)</i>",
hovertemplate = '<i> %{y:.0f} </i> луѓе')
data_5 = go.Scatter(x = t,
y = D,
visible = False,
mode = 'lines',
line=dict(color="#696969",
width=2),
name = "Починати; <i>D(t)</i>",
hovertemplate = '<i> %{y:.0f} </i> луѓе')
data_6 = go.Scatter(x = t,
y = list(S+E+I+R+D),
mode = 'lines',
visible = False,
line=dict(color="#ade6e6",
width=2,
dash="dash"),
name = "Вкупно",
hovertemplate = '<i> %{y:.0f} </i> луѓе')
data.append(data_1)
data.append(data_2)
data.append(data_3)
data.append(data_4)
data.append(data_5)
data.append(data_6)
# Toggle frist slice to be visible
data[0]['visible'] = True
data[1]['visible'] = True
data[2]['visible'] = True
data[3]['visible'] = True
data[4]['visible'] = True
data[5]['visible'] = True
# Create steps and slider
steps = []
for i in range(0, 40, 1):
step = dict(
method = 'restyle',
args = ['visible', [False]*240],
label = str(i+40))
for j in range(0,6):
step['args'][1][i*6+j] = True # Toggle i, i+1, i+2 trace to "visible"
steps.append(step)
sliders = [dict(
active = 0,
currentvalue = {'prefix':
"<i>L</i> = <b>",
'suffix':
" денови"},
pad = {"t": 80, "b": 10},
steps = steps
)]
# Setup the layout of the figure
layout = go.Layout(title = "Карантин после <i>L</i> денови",
title_x = 0.5,
xaxis_title='<i>Време (t)</i>',
xaxis=dict(range=[0,100],
mirror=False,
ticks='outside',
showline=True,
tickvals = [0, 20, 40, 60, 80, 100],
linecolor='#000',
tickfont = dict(size=11)),
yaxis_title='Број на луѓе',
yaxis=dict(range=[0,1100000],
mirror=False,
ticks='outside',
showline=True,
showspikes = True,
linecolor='#000',
tickvals = [0, 200000, 400000, 600000, 800000, 1000000],
tickfont = dict(size=11)),
plot_bgcolor='#fff',
hovermode = 'x unified',
width = 700,
height = 350,
sliders = sliders,
font = dict(size = 10),
margin=go.layout.Margin(l=50,
r=50,
b=60,
t=35))
# Plot function saves as html or with ipplot
fig4 = dict(data=data, layout=layout)
plot(fig4, filename = 'fig4.html', config = config)
display(HTML('fig4.html'))
Од графикот може да се заклучи дека неколку денови прават енормна разлика во ширењето на заразата доколку мерките се спроведат на време!
Меѓутоа и ова програмирање на \(R_0\), да скока од една вредност на друга (да скока од 5 на 1 во денот кога е спроведен карантинот) е повоторнод далеку од реално сценарио.