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)
我究竟做错了什么?
这是对您的功能的非常简单的修改。如果您有兴趣知道自己做错了什么,可以查看以下内容。
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?