Skip to content
/ maemod Public

A user friendly compartmental modelling enviroment in R

Notifications You must be signed in to change notification settings

slphyx/maemod

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

50 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

#maemod A user friendly compartmental modelling environment in R

###Install maemod

library("devtools")
install_github("slphyx/maemod")

###Using maemod

####Ex1

#define the system
mysystem <- "
!MAEMOD_Begin
STARTTIME <- 0
STOPTIME <- 600
DT <- 0.1

!Equations
dX <- bonemarrow - deathuninfected*X - infectionrate*X*S
dY <- infectionrate*X*S - deathinfected*Y
dS <- deathinfected*Y*nmerozoites - deathmerozoite*S - infectionrate*X*S
U <- X+Y

!Parameters   
bonemarrow = 1,
deathuninfected = 0.00833,
infectionrate = 0.1,
deathinfected = 0.2,
nmerozoites = 16,
deathmerozoite = 72

!Inits 
X=120, Y=0, S=0

!Outputs 
U=U


!Plots

!MAEMOD_End
"
#use maemod.ode to solve the system
out <- maemod.ode(input.text = mysystem)

head(out)
     time        X Y S        U
[1,]  0.0 120.0000 0 0 120.0000
[2,]  0.1 120.0000 0 0 120.0000
[3,]  0.2 120.0001 0 0 120.0001
[4,]  0.3 120.0001 0 0 120.0001
[5,]  0.4 120.0002 0 0 120.0002
[6,]  0.5 120.0002 0 0 120.0002

####Ex2

#define the system in a text file (test.txt)
#
##### test.txt
!MAEMOD_Begin
STARTTIME <- 0
STOPTIME <- 20*pi
DT <- 0.1
!Equations
 dY1<-Y2
 dY2<-a*sin(Y1)+sin(t)
 
!Parameters
 a= -1.0
 
!Inits
 Y1=0,Y2=0
 
!Outputs
 
!Plots

!MAEMOD_End

###
out<-maemod.ode(input.filename = "test.txt")
plot(out[,c(2,3)],col="red")

###Ex3


lorenz<-"
 ! MAEMOD_Begin
 STARTTIME <- 0
 STOPTIME <- 30
 DT <- 0.01
 
 !Equations
 dx<-sigma*(y-x)
 dy<-x*(rho-z)-y
 dz<-x*y-beta*z
 
 !Parameters
 sigma=10, beta=2.66666, rho=28
 
 !Inits
 x=-10, y=-12, z=30.05
 
 !Outputs
 
 !Plots
 
 !MAEMOD_End
 "

lorenzout<-maemod.ode(input.text = lorenz)

library(scatterplot3d)
scatterplot3d(lorenzout[,c(2,3,4)],type = 'l')

###Ex4 using maemod with manipulate


#####
# mysystem1.txt
#####
!MAEMOD_Begin
STARTTIME <- 0
STOPTIME <- 500
DT <- 1/30

!Equations
mr<-1*(t>startmig)*(t<(startmig+durmig))
    
    Nh <- Sh+Es+Ia+Ic+Tr+Tnr+R+Er
    Nm <- Sm+Em+Im
    inc <- (1-Ka)*Es*(pr*pt)*p
    prev <- {(pr*pt)*Ic*p+(1-pr)*pt*Ic*p}*Es
    miSh<- 1-miIa-miIc
    moSh<- 1-moIa-moIc

    
dSh<- -b*Im*Sh/Nh   + w*R + a*Nh+ mr*miSh*Nh - mr*moSh*Nh    -a*Sh 
dEs<- b*Im*Sh/Nh - v*Ka*Es  -(1-Ka)*v*Es  -a*Es
dIa <- -  p1*Ia  + mr*miIa*Nh-mr*moIa*Nh     + v*Ka*Es    +p3*(1-pt)*Ic+ Ke*v*Er  - a*Ia
dIc <- + mr*miIc*Nh-mr*moIc*Nh   + (1-Ka)*v*Es  - p3*(1-pt)*Ic  - (pr*pt)*Ic*p -(1-pr)*pt*Ic*p  + v*(1-Ke)*Er - a*Ic 
dTr <-  -Tr*p2  +  (pr*pt)*Ic*p -Tr*a
dTnr <- -Tnr*p2+(1-pr)*pt*Ic*p   -Tnr*a
dR <-   + p1*Ia  -w*R     +Tr*p2       +Tnr*p2  - b*(Ia+Ic)*R/Nh   -a*R 
dEr <- b*(Ia+Ic)*R/Nh -Ke*v*Er- v*(1-Ke)*Er     - a*Er

 
dSm <- -b*(Ia+Ic)*Sm/Nm + am*Nm - am*Sm
dEm <- b*(Ia+Ic)*Sm/Nm-vm*Em - am*Em
dIm <- vm*Em  - am*Im


!Parameters   
a = 21.5/1000/365,
           v = 1/10, 
           p = 1/4, 
           p1 =  1/60, 
           p2 = 1/10,
           p3 = 1/14, 
           Ka = .2, 
           Ke = .2,
           pr =.9, 
           pt =.8, 
           w= 1/30, 
           b= .6, 
           startmig = 10,
           durmig=20,
           miIa = 0.03, 
           miIc = 0.05, 
           moIa = 0.03, 
           moIc = 0.05,
           am= 1/10,
           vm=30
           
!Inits      
Sh=98900, 
Es=0,
Ia=100, 
Ic=10, 
Tr=0, 
Tnr=0, 
R=0, 
Er=0,
Sm=100000000,
Em=0,
Im=1000

!Outputs    
Nh=Nh,Nm=Nm,Inc=inc, prev=prev

!Plots

!MAEMOD_End


#####

library(deSolve)
library(maemod)
library(manipulate)

#where is your system file
path<-"D:\\works\\abiodun"
setwd(path)

#create the function from the system file
maemod.gensysfunction(input.filename = "mysystem1.txt")

#write a wrapper function for plotting the results
plotresults<-function(a,v,p,p1,p2,p3,Ka,Ke,pr,pt,w,b,startmig,durmig,
                      miIa,miIc,moIa,moIc,am,vm){
  parameters<-c(
    a = a,
    v = v, 
    p = p, 
    p1 =  p1, 
    p2 = p2,
    p3 = p3, 
    Ka = Ka, 
    Ke = Ke,
    pr = pr, 
    pt = pt, 
    w= w, 
    b= b, 
    startmig = startmig,
    durmig=durmig,
    miIa = miIa, 
    miIc = miIc, 
    moIa = moIa, 
    moIc = moIc,
    am= am,
    vm= vm
  )
  
  init<-initstate  #initstate is already generated from maemod.gensysfunction
  #solve the equations
  output<-ode(y=init,times = timegrid, func = MaemodSYS,parms=parameters)
  
  #plot the results
  plot(output,select=c("Nh","Nm","Inc","prev"))
  
}


manipulate(
  
  plotresults(a=21.5/1000/365,v=1/10,p=1/4,p1=1/60,p2=1/10,
              p3=1/14,Ka=0.2,Ke=0.2,pr=0.9,pt=0.8,
              w=1/30,b=0.6,startmig=10,durmig=20,
              miIa,miIc,moIa,moIc,am=1/10,vm=30)
  ,

  miIa = slider(0,1,initial = 0.03,step=0.001), 
  miIc = slider(0,1,initial = 0.05,step=0.001), 
  moIa = slider(0,1,initial = 0.03,step=0.001), 
  moIc = slider(0,1,initial = 0.05,step=0.001)

)


using maemod with the array equations the state variable has to be named 'A' and the array parameter has to be 'k' in this version.

# Example from Berkeley Madonna
# for using Array
# METHOD RK4
#
# STARTTIME = 0
# STOPTIME = 20
# DT = 0.02
#
# d/dt (A[1]) = -k[1]*A[1]
# d/dt (A[2..n-1]) = k[i-1]*A[i-1]-k[i]*A[i]
# d/dt (A[n]) = k[n-1]*A[n-1]
#
# init A[1] = 100
# init A[2..n]=0
#
# k[1..n] =1
# n = 14
#
#

arrayEx <-'
!MAEMOD_Begin
STARTTIME <- 0
STOPTIME <- 20
DT <- 0.02
n<-14

!Equations
dA <-rep(0,n)
dA[1] <- -k[1]*A[1]
#ArrayB
"dA[i.indx] <- k[i.indx-1] *
       A[i.indx-1]-k[i.indx]*A[i.indx]"%@@%list("i.indx"%=>%2:(n-1))
#ArrayE
dA[n] <- k[n-1]*A[n-1]

!Parameters
1,1,1,1,1,1,1,1,1,1,1

!Inits
100,0,0,0,0,0,0,0,0,0,0,0,0,0

!Outputs

!Plots

!MAEMOD_End
'
out<-maemod.ode(input.text = arrayEx ,sys.template = Maemod_Array)
plot(out[,c(1,2)],type = 'l')
cols<-rainbow(14)
for(i in 3:n) lines(out[,c(1,i)],col=cols[i])