2015-10-01 93 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