Examples taken from https://arxiv.org/pdf/1803.06934.pdf (see page 11 for stochastic simulations).
Examples are performed on an SIR model.
$\frac{dS}{dt} = -\beta S I $
$\frac{dI}{dt} = \beta S I - \gamma I$
$\frac{dR}{dt} = \gamma I$
In [1]:
import pygom
import pkg_resources
print('PyGOM version %s' %pkg_resources.get_distribution('pygom').version)
In [2]:
from pygom import Transition, TransitionType, SimulateOde
import numpy as np
# construct model
states = ['S', 'I', 'R']
params = ['beta', 'gamma', 'N']
transitions = [Transition(origin='S', destination='I', equation='beta*S*I/N',
transition_type=TransitionType.T),
Transition(origin='I', destination='R', equation='gamma*I',
transition_type=TransitionType.T)]
model_p = SimulateOde(states, params, transition=transitions)
In [14]:
# initial conditions
N = 7781984.0
in_inf = round(0.0000001*N)
init_state = [N - in_inf, in_inf, 0.0]
# time
t = np.linspace (0 , 50 , 101)
# deterministic parameter values
param_evals = [('beta', 3.6), ('gamma', 0.2), ('N', N)]
In [4]:
# define parameter distributions
from pygom.utilR import rgamma
d = dict()
d['beta'] = (rgamma, {'shape':3600.0, 'rate':1000.0})
d['gamma'] = (rgamma, {'shape':1000.0, 'rate':500.0})
d['N'] = N
In [5]:
model_p.parameters = d
model_p.initial_values = (init_state, t[0])
In [6]:
# solve for 10 parameter sets
Ymean, Yall = model_p.simulate_param(t[1::], iteration=10, full_output=True)
In [9]:
# plot solutions
import matplotlib.pyplot as plt
plt.rcParams['figure.figsize'] = [12, 6]
fig, (ax1, ax2, ax3) = plt.subplots(1,3)
for i in range(np.shape(Yall)[0]):
ax1.plot(t, Yall[i][:,0])
ax2.plot(t, Yall[i][:,1])
ax3.plot(t, Yall[i][:,2])
ax1.plot(t, Ymean[:,0], linewidth=3,color='k')
ax2.plot(t, Ymean[:,1], linewidth=3,color='k')
ax3.plot(t, Ymean[:,2], linewidth=3,color='k')
ax1.ticklabel_format(style='sci', axis='y', scilimits=(0,0))
ax2.ticklabel_format(style='sci', axis='y', scilimits=(0,0))
ax3.ticklabel_format(style='sci', axis='y', scilimits=(0,0))
ax1.set_title('Susceptible')
ax2.set_title('Infected')
ax3.set_title('Removed')
Out[9]:
In [8]:
#!TODO Add legend with beta and gamma parameter
In [16]:
# construct model
model_j = SimulateOde(states, params, transition=transitions)
model_j.parameters = param_evals
model_j.initial_values = (init_state, t[0])
In [ ]:
# run 10 simulations
simX, simT = model_j.simulate_jump(t[1::], iteration=10, full_output=True)
In [ ]: