knitr::opts_chunk$set( collapse = TRUE, comment = "#>" )
Behind the scenes, ecoevoapps
uses the wonderful deSolve
package to solve the differential equations in R
. If you want to explore how this package works so that you can simulate the dynamics of your own favorite model or tweak existing models in ecoevoapps
, read on!
To use deSolve
, we first need to write a function that describes the differential equations, which we can then solve using the function deSolve::ode()
.
If we want to run the Lotka-Volterra competition model in R, we first write a function using the syntax as follows:
# Hand-coding the Lotka-Volterra competition model lotka_volterra_competition <- function(time, init, params) { with (as.list(c(time, init, params)), { # description of parameters # r1 = per capita growth rate of species 1 # N1 = population size of species 1 # K1 = carying capacity of species 1 # a = relative per capita effect of species 2 on species 1 # r2 = per capita growth rate of species 2 # N2 = population size of species 2 # K2 = carrying capacity of species 2 # b = relative per capita effect of species 1 on species 2 # Differential equations dN1 <- r1*N1*(1 - (N1 + a*N2)/K1) dN2 <- r2*N2*(1 - (N2 + b*N1)/K2) # Return dN1 and dN2 return(list(c(dN1, dN2))) }) }
With this function defined, we can now define the parameter values, initial values, and time over which we want to run a simulation:
# define vectors of initial population sizes, time, and parameters # define initial population sizes for the two species init <- c(N1 = 10, N2 = 30) time <- seq(0,500, by = 0.1) # define the parameter vector -- note that the names should match # the parameter names we used in the lotka_volterra_competition function above params <- c(r1 = .2, r2 = .1, K1 = 500, K2 = 600, a = .9, b = 1.1)
We are now ready to simulate the dynamics as follows:
lv_out <- deSolve::ode(func = lotka_volterra_competition, y = init, times = time, parms = params) # Plot model output plot(lv_out[,"N1"]~lv_out[,"time"], type = "l", ylim = c(0, 700)) lines(lv_out[,"N2"]~lv_out[,"time"], type = "l", col = 2)
This example shows how the same approach can be used to simulate the Lotka-Volterra predator-prey model with logistic growth in the prey species:
# Define the function lv_predprey_logPrey <- function(time,init,pars) { with (as.list(c(time,init,pars)), { # description of parameters: # r = per capita growth rate (prey) # a = attack rate # e = conversion efficiency # d = predator death rate # K = carrying capacity of the prey dH = r*H*(1 - H/K) - (a*H*P) dP = e*(a*H*P) - d*P return(list(c(dH = dH, dP = dP))) }) } # Define parameters and initial conditions time <- seq(0, 250, 0.1) init <- c(H = 10, P = 10) params <- c(r = 1, K = 250, a = 0.1, e = 0.2, d = 0.25) # Now, we are ready to run the mode: predprey_out <- deSolve::ode(func = lv_predprey_logPrey, y = init, times = time, parms = params) # Plot model output plot(predprey_out[,"H"]~predprey_out[,"time"], type = "l", ylim = c(0,16)) lines(predprey_out[,"P"]~predprey_out[,"time"], type = "l", col = 2)
We also strongly recommend that you explore some deSolve tutorials to understand the workflow. (ex. 1; ex. 2; there's also an example specifically on the Lotka-Volterra predator-prey models!). The package also includes the function deSolve::dede()
, which we use in ecoevoapps
to simulate the delayed-differential model for logistic growth (see run_logistic_model()
).
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.