HW4a Supplementary Material

Problem 1

<br data-mce-bogus="1">
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt

#numerical parameters
n = 31 #length of array
dt = 10. #time step

#Verhulst parameters
alpha = .1 #growth rate
K = 1000. #carrying capacity

#create arrays
N_numerical = np.zeros((n,3)) #make N arrray
N_analyical = np.zeros((n,1)) #make N arrray
t = np.linspace(0,(float(n)-1.)*dt,num=n) #make t array at constant interval

#initial condition
N_initial = 1.0

###FUNCTIONS
#Verhulst Analytical Solution
def verhulst_analytical(alpha,K,N_initial,t):
    N = (K * N_initial * np.exp(alpha*t))/(K+N_initial*(np.exp(alpha*t)-1.))
    return N

#Verhulst Numerical Integrator
def verhulst_rate(N,alpha,K):
    rate = alpha * N * (1.0 - N / K)
    return rate

#Euler
def euler(Nini,tini,alpha,K,dt,n):
    N = np.zeros((n))
    N[0] = Nini
    for i in xrange(1,n):
        rate = dt * verhulst_rate(N[i-1],alpha,K)
        N[i] = N[i-1] + rate
    return N

#2nd order runga kutta
def runga_kutta_2(Nini,tini,alpha,K,dt,n):
    N = np.zeros((n))
    N[0] = Nini
    for i in xrange(1,n):
        k1 = dt * verhulst_rate(N[i-1],alpha,K)
        k2 = dt * verhulst_rate((N[i-1]+k1/2.0),alpha,K)
        N[i] = N[i-1] + k2
    return N

#4th order runga kutta
def runga_kutta_4(Nini,tini,alpha,K,dt,n):
    N = np.zeros((n))
    N[0] = Nini
    for i in xrange(1,n):
        k1 = dt * verhulst_rate(N[i-1],alpha,K)
        k2 = dt * verhulst_rate((N[i-1]+k1/2.0),alpha,K)
        k3 = dt * verhulst_rate((N[i-1]+k2/2.0),alpha,K)
        k4 = dt * verhulst_rate((N[i-1]+k3),alpha,K)
        N[i] = N[i-1] + k1/6.0 + k2/3.0 + k3/3.0 + k4/6.0
    return N

#euler
N_numerical[:,0] = euler(N_initial,0,alpha,K,dt,n)

#2nd order runga kutta    
N_numerical[:,1] = runga_kutta_2(N_initial,0,alpha,K,dt,n)

#4th order runga kutta    
N_numerical[:,2] = runga_kutta_4(N_initial,0,alpha,K,dt,n)
    
#analytical soln
N_analytical = verhulst_analytical(alpha,K,N_initial,t)

plt.figure(1,facecolor = 'white')
plt.plot(t,N_numerical[:,0],label='Euler Method')
plt.plot(t,N_numerical[:,1],label=r'$2^{nd}$ Order Runga Kutta')
plt.plot(t,N_numerical[:,2],label=r'$4^{th}$ Order Runga Kutta')
plt.plot(t,N_analytical,label='Analytical Solution',ls='--',lw = 2)
plt.legend(loc='best')
plt.xlim(0,250)
plt.xlabel('time [T]')
plt.ylabel('populations [# of individuals]')
plt.savefig('Euler_and_2_4Runga.png')
plt.show()

Problem 2

<br data-mce-bogus="1">
%matplotlib inline
import numpy as np
import matplotlib.pyplot as plt
import random

#Verhulst parameters
alpha = .1 #growth rate
K = 1000. #carrying capacity

#initial condition
N_initial = 1.0
runs = 100
num = int(K)-int(N_initial)+1

N = np.linspace(N_initial,K,num)
T = np.zeros((num,runs))
rnd = np.random.rand(num,runs)

T_avg = np.zeros((int(K)-int(N_initial)+1))

plt.figure(1,facecolor='white')

for i in xrange(0,runs):
    rate = alpha * N[1:] * (1.0 - N[1:] / K)
    dt = - np.log(1.0 - rnd[1:,i]) / rate
    T[1:,i] = np.cumsum(dt)
    T_avg += T[:,i]
    plt.plot(T,N,color ='b',alpha=0.1,lw = .5)
    
T_avg = T_avg / float(runs)
plt.plot(T_avg,N,color ='k',label ='Averaged Solution',lw =2)
N_analytical = (K * N_initial * np.exp(alpha*T_avg))/(K+N_initial*(np.exp(alpha*T_avg)-1.))    
plt.plot(T_avg,N_analytical,label='Analytical Solution',ls='--',lw = 2,color ='r')
plt.xlabel('t [days]')
plt.ylabel('N [population]')
plt.savefig('random.png')
plt.show()