2015-10-01 58 views
1

我是编程新手,特别是R。我发现有时比Matlab更容易获得更复杂的东西。我试图重新创建一个我已经在“script.m”中有一个循环,但我一直没有得到任何东西R. 任何人都可以请解释我如何运行以下三次这个?.. 。ODE在循环中R

预先感谢任何帮助提供

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)) 

} 

我得到的错误是:

错误checkInput(Y,时间,FUNC,RTOL,蒂,jacfunc,TCRIT,HMIN ,: `y'必须是数字

+0

我假设这工作正常,至少有一个循环迭代,然后在你试图更新'状态'后损坏?你应该在循环中调用cat()来处理它被分配的内容。 – devmacrile

回答

1

太长的评论。请尝试:

state <- c(state[1], tail(out[[3]], 1), tail(out[[4]], 1)) 

您设置的方式,out是一个data.frame。 out[3]返回一列数据。 tail(out[3],1)返回一个一行一列的data.frame(但仍然是一个data.frame)。当你把这些用,例如,

c(state[1],tail(out[3],1),...) 

你生成一个列表,而不是一个数字,这是造成错误。

如果您参考,例如,out[[3]]您将返回矢量哪些元素是out的第三列。这是因为,在R中,data.frame定义为向量列表,所以out[[3]]返回该列表中的第三个元素(向量)。

+0

亲爱的jlhoward, 谢谢你的解释。现在,在“out”中,我得到了最后一次迭代的值,现在你将如何获得所有三次迭代的所有值,以绘制从0到12的整个日期?对于(i in seq(ti,tf-span,span)){ ){#seq(i,i + span,delta)#采样时间。 (S = state [[1]],X = tail(out [[3]],1),P = tail(out [[4 ]],1)) X0 < - state [[2]] plot(out $ time,out $ S) points(out $ time,out $ X) points(out $ time,out $ P) } – Julz

+0

您的问题中没有足够的信息来回答这个问题。例如,您没有定义“ti”,“tf”或“span”或“delta”。评论中的代码将为循环的每次迭代生成一个图。期望的结果以何种方式不同? – jlhoward