在 deSolve 中的时间步更改参数值

Mar*_*ine 6 parameters r ode differential-equations

我正在尝试使用deSolve. 使用以下代码,我希望参数gamma0在时间步长 0、1、2、3、4、5、6、7、8、9 和 10 处取值为 5,否则为 0。但是,print(gamma0)显示gamma0保持在 0。

这是我的 ODE:

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")
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?

M--*_*M-- 5

这是对您的功能的非常简单的修改。如果您有兴趣知道自己做错了什么,可以查看以下内容。

mod <- function(times, yini, param) { 

  dt = times[2] - times[1]
  with(as.list(c(yini, param)), { 

    gamma0 <- ifelse(times <= 10*dt, 5, 0) 

    ## print(gamma0) 

    dalpha0 <- - a*alpha0 + gamma0 
    dbeta0 <- a*alpha0 - b*beta0 
    return(list(c(dalpha0, dbeta0))) 

  })} 
Run Code Online (Sandbox Code Playgroud)

编辑

与 G5W 的回答相同,问题在于您所比较times的对象。

当你在写作

times %in% seq(0,10,1)
Run Code Online (Sandbox Code Playgroud)

你不是指时间步长。您只需参考 的值times

因此,如果您想在前 10 个时间步骤中使用它,您只需要使用我的代码或任何考虑dt.

但这里有一个问题要问你:

如果您不需要gamma0根据 进行更改times并希望它在前 11 (10) 个时间步长为 5,为什么要将其与 进行比较times?为什么不简单地将这些时间步长设置为 5?