In [66]:
    
%matplotlib inline
import scipy.integrate as spi
import numpy as np
import pylab as pl
    
Set modifier values
In [81]:
    
#Person and Zombie
z_infecting = 0.4
p_killedby_z = 0.1
z_creates_i = 0.25
z_killedby_p = 0.75
#Person and Immune
i_infecting = 0.25
i_creates_i = 0.075
#Zombie no mates
z_starves = 0.05
#Immune and Zombie
i_killedby_z = 0.5
z_killedby_i = 0.2475
    
Set the Population starting parameters. NB: must be a proportion
In [85]:
    
P = 0.8
Z = 0.0
I = 0.2
D = 0.0
if sum([P,Z,I,D]) != 1.0:
    print "Your proportions are wrong"
start_values = (P,Z,I,D)
    
Set time parameters
In [69]:
    
t_start = 0.0
t_end = 100
t_step = 1
    
In [70]:
    
def time_range(t_start, t_end, t_step):
    '''
    Return step range of sampling points for iteration.
    '''
    t_ranges = np.arange(t_start, t_end + t_step, t_step)
    return t_ranges
    
In [71]:
    
t_ranges = time_range(t_start, t_end, t_step)
    
In [72]:
    
def calc_P(P,Z,I,D):
    out_P = - (z_infecting * (P * Z)) - (i_infecting * (P * I)) - (p_killedby_z * (P * Z)) - (z_creates_i * (P * Z)) - (i_creates_i * (P * I))
    return out_P
    
In [73]:
    
def calc_Z(P,Z,I,D):
    out_Z = (z_infecting * (P * Z)) + (i_infecting * (P * I)) - (z_killedby_p * (P * Z)) - (z_killedby_i * (I * Z)) - (z_starves * Z)
    return out_Z
    
In [74]:
    
def calc_I(P,Z,I,D):
    out_I = (z_creates_i * (P * Z)) + (i_creates_i * (P * I)) - (i_killedby_z * (I * Z))
    return out_I
    
In [75]:
    
def calc_D(P,Z,I,D):
    out_D = (p_killedby_z * (P * Z)) + (i_killedby_z * (I * Z)) + (z_killedby_p * (P * Z)) + (z_killedby_i * (Z * I)) + (z_starves * Z)
    return out_D
    
In [76]:
    
def diffeq(INP, t):
    OUT = np.zeros((4))
    mP,mZ,mI,mD = INP
    OUT[0] = calc_P(mP,mZ,mI,mD)
    OUT[1] = calc_Z(mP,mZ,mI,mD)
    OUT[2] = calc_I(mP,mZ,mI,mD)
    OUT[3] = calc_D(mP,mZ,mI,mD)
    return OUT
    
In [86]:
    
RES = spi.odeint(diffeq,start_values,t_ranges)
    
In [78]:
    
def plot_graph(RES):
    pl.close()
    pl.plot(RES[:,0], '-bo', label = 'People')
    pl.plot(RES[:,1], '-ro', label = 'Zombies')
    pl.plot(RES[:,2], '-go', label = 'Immune')
    pl.plot(RES[:,3], '-yo', label = 'Dead')
    pl.legend(loc = 0)
    pl.title('Zombie apocalypse')
    pl.xlabel('Time')
    pl.ylabel('Numbers')
    #pl.savefig('2.5_SIS-high.png', dpi = 900)
    pl.show()
    
In [79]:
    
observed = RES[:,0]
expected = [0.7,0.57582525,0.44145637,0.31872655,0.22099319,0.15023086,0.10178351,0.06947228,0.04806533,0.03381077]
total = 0
for i,item in enumerate(expected):
    total += (item - observed[i]) ** 2
    
print total
    
    
In [87]:
    
plot_graph(RES)plot_graph(RES)