Marine Regis
2017-Mar-23 21:59 UTC
[R] How to change parameter values as a function to time with the package "deSolve"
Hello, I am trying to solve an ODE in R using deSolve. With the following code, I expected the parameter ?gamma0? takes the values 5 at time step 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 and 10, and 0 otherwise. However, the print(gamma0) shows that ?gamma0? stays at 0. Here is my ODE: param <- c(a = 0.1, b = 1) yini <- c(alpha0 = 0, beta0 = 0) mod <- function(times, yini, param) { with(as.list(c(yini, parameters)), { gamma0 <- ifelse(times %in% seq(0,10,1), 5, 0) # print(gamma0) dalpha0 <- - a*alpha0 + gamma0 dbeta0 <- a*alpha0 - b*beta0 return(list(c(dalpha0, dbeta0))) })} times <- seq(from = 0, to = 10, by = 1/24) out <- ode(func = mod, times = times, y = yini, parms = param) plot(out, lwd = 2, xlab = "day") What am I doing wrong? Thanks in advance for your help! Marine [[alternative HTML version deleted]]
David Winsemius
2017-Mar-24 05:01 UTC
[R] How to change parameter values as a function to time with the package "deSolve"
> On Mar 23, 2017, at 2:59 PM, Marine Regis <marine.regis at hotmail.fr> wrote: > > Hello, > > I am trying to solve an ODE in R using deSolve. With the following code, I expected the parameter ?gamma0? takes the values 5 at time step 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 and 10, and 0 otherwise. However, the print(gamma0) shows that ?gamma0? stays at 0. > > Here is my ODE: > > param <- c(a = 0.1, b = 1) > yini <- c(alpha0 = 0, beta0 = 0) > > mod <- function(times, yini, param) { > > with(as.list(c(yini, parameters)), { > > gamma0 <- ifelse(times %in% seq(0,10,1), 5, 0) > > # print(gamma0) > > dalpha0 <- - a*alpha0 + gamma0 > dbeta0 <- a*alpha0 - b*beta0 > return(list(c(dalpha0, dbeta0))) > > })} > > times <- seq(from = 0, to = 10, by = 1/24) > out <- ode(func = mod, times = times, y = yini, parms = param) > plot(out, lwd = 2, xlab = "day") > > > What am I doing wrong? Thanks in advance for your help!When I execute that code I get: Error in as.list(c(yini, parameters)) : object 'parameters' not found (The mistake seems fairly obvious when you look are the parameter list for your `mod` function.) Additionally: It's not generally good practice to use `with` inside functions, but that's not the problem here. -- David.> Marine > > > [[alternative HTML version deleted]] > > ______________________________________________ > R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code.David Winsemius Alameda, CA, USA
Marine Regis
2017-Mar-24 14:28 UTC
[R] How to change parameter values as a function to time with the package "deSolve"
Thanks very much David for your answer. Sorry ! here is the code without the error: library(deSolve) param <- c(a = 0.1, b = 1) yini <- c(alpha0 = 6, beta0 = 2) mod <- function(times, yini, param) { with(as.list(c(yini, param)), { gamma0 <- ifelse(times %in% seq(0,10,1), 5, 0) ## print(gamma0) dalpha0 <- - a*alpha0 + gamma0 dbeta0 <- a*alpha0 - b*beta0 return(list(c(dalpha0, dbeta0))) })} times <- seq(from = 0, to = 10, by = 1/24) out <- ode(func = mod, times = times, y = yini, parms = param) plot(out, lwd = 2, xlab = "day") Thanks in advance for your help! Marine ________________________________ De : David Winsemius <dwinsemius at comcast.net> Envoy? : vendredi 24 mars 2017 06:01 ? : Marine Regis Cc : r-help at r-project.org Objet : Re: [R] How to change parameter values as a function to time with the package "deSolve"> On Mar 23, 2017, at 2:59 PM, Marine Regis <marine.regis at hotmail.fr> wrote: > > Hello, > > I am trying to solve an ODE in R using deSolve. With the following code, I expected the parameter ?gamma0? takes the values 5 at time step 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 and 10, and 0 otherwise. However, the print(gamma0) shows that ?gamma0? stays at 0. > > Here is my ODE: > > param <- c(a = 0.1, b = 1) > yini <- c(alpha0 = 0, beta0 = 0) > > mod <- function(times, yini, param) { > > with(as.list(c(yini, parameters)), { > > gamma0 <- ifelse(times %in% seq(0,10,1), 5, 0) > > # print(gamma0) > > dalpha0 <- - a*alpha0 + gamma0 > dbeta0 <- a*alpha0 - b*beta0 > return(list(c(dalpha0, dbeta0))) > > })} > > times <- seq(from = 0, to = 10, by = 1/24) > out <- ode(func = mod, times = times, y = yini, parms = param) > plot(out, lwd = 2, xlab = "day") > > > What am I doing wrong? Thanks in advance for your help!When I execute that code I get: Error in as.list(c(yini, parameters)) : object 'parameters' not found (The mistake seems fairly obvious when you look are the parameter list for your `mod` function.) Additionally: It's not generally good practice to use `with` inside functions, but that's not the problem here. -- David.> Marine > > > [[alternative HTML version deleted]] > > ______________________________________________ > R-help at r-project.org mailing list -- To UNSUBSCRIBE and more, see > https://stat.ethz.ch/mailman/listinfo/r-helpR-help Info Page - Homepage - SfS ? Seminar for Statistics<https://stat.ethz.ch/mailman/listinfo/r-help> stat.ethz.ch The main R mailing list, for announcements about the development of R and the availability of new code, questions and answers about problems and solutions using R ...> PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code.David Winsemius Alameda, CA, USA [[alternative HTML version deleted]]