R中循环内的ODE
我是编程新手,特别是R。我发现有时候事情比Matlab更容易实现,但要给出的东西更复杂。我正在尝试重新创建一个循环,我已经在一个“script.m”中创建了这个循环,但是我还没有在R上得到任何东西。 有谁能告诉我如何运行以下三次吗 提前感谢您提供的任何帮助R中循环内的ODE,r,R,我是编程新手,特别是R。我发现有时候事情比Matlab更容易实现,但要给出的东西更复杂。我正在尝试重新创建一个循环,我已经在一个“script.m”中创建了这个循环,但是我还没有在R上得到任何东西。 有谁能告诉我如何运行以下三次吗 提前感谢您提供的任何帮助 pars <- c(...) times <- seq(ti, tf, delta) state <- c(S = 50, X = 20, P = 0.5) SOLVE <- function(pars)
pars <- c(...)
times <- seq(ti, tf, delta)
state <- c(S = 50, X = 20, P = 0.5)
SOLVE <- function(pars) {
derivs <- function(time, state, pars) {
with(as.list(c(state, pars)), {
.
.
.
return(list(c(St, Xt, Pt)))
})
}
return(as.data.frame(ode(y = state, times = times, func = derivs, parms = pars)))
}
for(i in seq(ti, tf-span, span)) {
times <- seq(i, i+span, delta)
out <- SOLVE(pars)
state <- c(state[1], tail(out[3], 1), tail(out[4], 1))
}
pars注释太长。尝试:
state <- c(state[1], tail(out[[3]], 1), tail(out[[4]], 1))
您生成的是一个列表,而不是一个数字,这是导致错误的原因
如果引用,例如,out[[3]]
则返回一个向量,其中的元素是out
的第三列。这是因为,在R中,data.frame根据定义是一个向量列表,因此out[[3]]
返回该列表中的第三个元素(向量)。我假设它至少在一次循环迭代中工作正常,然后在尝试更新状态后被破坏?您应该cat()
打开循环中的状态,以查看它被分配给了什么。亲爱的jlhoward,感谢您的解释。现在,在“out”中,我得到了上一次迭代的值,您现在能知道如何得到所有三次迭代的所有值,以绘制从0到12的整个日期吗?例如,(i在seq(ti,tf span,span))中,{次您的问题中没有足够的信息来回答这个问题。您没有定义ti
,tf'
或span
,或delta
,例如。注释中的代码将为循环的每次迭代生成一个图。期望的结果以何种方式不同?
c(state[1],tail(out[3],1),...)