MATH111: Applied Mathematical Modelling I

Maple code for endemic diseases


This page contains a maple code for the course: MATH 111 Applied Mathematical Modelling I --- Maple Assignment V.

# endemic.maple   Maple code to integrate a simple SIR model for an
# 14.10.03        endemic disease with vaccination.
# 10.10.07        Revised to run on maple 10.
# 24.12.15        Minor revisions to emphasis the final output point.
#
with(linalg):
with(plots):

R  :=10.0;   # the basic reproductive number.
vac:= 0.00;    # the fraction of the population that is vaccinated.

tstart := 0;    # the initial value for time.
tend   := 10;   # the final value for time.

# define the differential equations
de1 := diff(u(t),t) = b/(b+c)*(1-vac-u(t)) -R*u(t)*v(t);
de2 := diff(v(t),t) = (R*u(t)-1)*v(t);
de3 := diff(w(t),t) = b*vac/(b+c) +c/(c+b)*v(t) -b/(b+c)*w(t);

interval := 5.0:      # number of points calculated per unit of time.
susceptibles := 0.98; # initial fraction of population that are susceptibles.

ic1 := u(0) = susceptibles;   # initial pop'n fraction that are susceptibles.
ic2 := v(0) = 1-susceptibles; # initial pop'n fraction that are infected.
ic3 := w(0) = 0;              # initial pop'n fraction that are immune.

deqs := {de1,de2,de3}:        # define the system of DEs.
ics  := {ic1,ic2,ic3}:        # define the initial conditions.
vars := {u(t),v(t),w(t)}:     # define the dependent variables.

b := 10.0;                    # per-capita birth rate.
c := 10*b;                    # the rate at which invected people recover
                              # from the disease.

# define the values of time at which the output is calculated.
ans := array([seq(i/interval,i=tstart..(interval*tend))]):
# integrate the system of differential equations
#
solnum := dsolve(deqs union ics,vars, \
                     type=numeric, output=ans, maxfun=300000):

# Print the values of the independent and dependent variables at the final 
# integration point (tend).  NOTE that the output is NOT necessarily in the 
# format u(t), v(t), w(t).
#
# The next command pulls out an array that contains the time and the
# solution points.
solmatrix := eval(solnum[2,1]):
rowsize   := rowdim(solmatrix):

print("Print the output at the final integration point - these numbers may be important!");

eval(solnum[1,1]);      # this gives us the output order

# Print the output at the final integration point: important!
row(solmatrix,rowsize); 

# Plot some figures.  You WILL need to play around with these
# commands to get the best possible figures for your report.
#

# Figure One. Plot the solution in the susceptible-invected plane.
odeplot(solnum,[u(t),v(t)],labels=["u(t)","v(t)"]);

# Figure Two. Plot the susceptible-time and invected-time data on the
#             same figure.  Make sure you know which one is which.
p1 := odeplot(solnum,[t,u(t)],colour=BLUE):
p2 := odeplot(solnum,[t,v(t)],colour=RED):
display({p1,p2},title="Susceptibles and Infectives",\
                labels=["time","fractional population"]);

# Figure Three.  Plot the fraction of infected people in the population.
#                You may find it useful to change the `y'-view to
#                clarrify the long-term behaviour: is it heading towards zero?
odeplot(solnum,[t,v(t)],colour=RED,labels=["time","v(t)"],\
        title="Fractional infected population",\
        view=[tstart..tend,0..0.1]);
# Figure Four.  Plot the immune-time data. 
odeplot(solnum,[t,w(t)],labels=["t","w(t)"]);

R := 'R':
b      := 'b':
c      := 'c':
deqs   := 'deqs':
de1    := 'de1':
de2    := 'de2':
de3    := 'de3':
ics    := 'ics':
ic1    := 'ic1':
ic2    := 'ic2':
ic3    := 'ic3':
interval := 'interval':
output := 'output':
p1     := 'p1':
p2     := 'p2':

rowsize := 'rowsize':
solmatrix := 'solmatrix':
solnum := 'solnum':
susceptibles := 'susceptibles':
tend   := 'tend':
tstart := 'tstart':
vac    := 'vac':
vars   := 'vars':


<< Return to my MATH 111 home page. << Return to my teaching home page. << Return to my start page.


Page Created: 15th October 2003.
Last Updated: 8th March 2017.