## =========================================
## Example1: Pred-Prey Lotka-Volterra model
## =========================================
LVmod <- function(Time, State, Pars)
{
with(as.list(c(State, Pars)),
{
Ingestion <- rIng * Prey*Predator
GrowthPrey <- rGrow * Prey*(1-Prey/K)
MortPredator <- rMort * Predator
dPrey <- GrowthPrey - Ingestion
dPredator <- Ingestion*assEff -MortPredator
return(list(c(dPrey, dPredator)))
})
}
pars <- c(rIng = 0.2, # /day, rate of ingestion
rGrow = 1.0, # /day, growth rate of prey
rMort = 0.2 , # /day, mortality rate of predator
assEff = 0.5, # -, assimilation efficiency
K = 10 ) # mmol/m3, carrying capacity
yini <- c(Prey = 1, Predator = 2)
times <- seq(0, 200, by = 1)
out <- as.data.frame(ode(func = LVmod, y = yini,
parms = pars, times = times))
matplot(out$time,out[,2:3],type = "l",xlab = "time",ylab = "Conc",
main = "Lotka-Volterra",lwd = 2)
legend("topright", c("prey", "predator"), col = 1:2, lty = 1:2)
## ==========================================================
## Example2: Resource-producer-consumer Lotka-Volterra model
## ==========================================================
## Note:
## 1. parameter and state variable names made
## accessible via "with" statement
## 2. function sigimp passed as an argument (input) to model
## (see also lsoda and rk examples)
lvmodel <- function(t, x, parms, input) {
with(as.list(c(parms, x)), {
import <- input(t)
dS <- import - b*S*P + g*K # substrate
dP <- c*S*P - d*K*P # producer
dK <- e*P*K - f*K # consumer
res <- c(dS, dP, dK)
list(res)
})
}
## The parameters
parms <- c(b = 0.0, c = 0.1, d = 0.1, e = 0.1, f = 0.1, g = 0.0)
## vector of timesteps
times <- seq(0, 100, length = 101)
## external signal with rectangle impulse
signal <- as.data.frame(list(times = times,
import = rep(0, length(times))))
signal$import[signal$times >= 10 & signal$times <= 11] <- 0.2
sigimp <- approxfun(signal$times, signal$import, rule = 2)
## Start values for steady state
xstart <- c(S = 1, P = 1, K = 1)
## Solve model
out <- as.data.frame(ode(y = xstart,times = times,
func = lvmodel, parms, input = sigimp))
plot(out$P,out$K,type = "l",lwd = 2,xlab = "producer",ylab = "consumer")
Run the code above in your browser using DataLab