R - 使用package deSolve,如何克服此对象错误?

时间:2015-03-23 22:11:14

标签: r ode

我是R和deSolve的新手。我试图用给定的初始参数和状态变量值来求解方程。但是,由于我的参数没有对象,最后会出现错误。我该如何克服这个问题?我是否为每个参数创建了一个新对象?

以下是该模型的语法:

myfn <- function(times, y, parms) {

dy <- numeric(6)
dy[1] <- a - b*y[4] - c*y[1]
dy[2] <- y[5]*dy[1]*(1+y[6]) - e*y[2] - (f*y[3]*y[4]*y[1] - g)
dy[3] <- h - i*y[2]
dy[4] <- y[6]*dy[1] - j*y[4] + k*(f*y[3]*y[4]*y[1] - g) + d
dy[5] <- 1.0 - y[5]*(y[1] + y[4] + 1)
dy[6] <- 1.0 - y[6]*(y[1] + 1)

return(list(dy))

}

parms <-c(a= 2.0, b = 0.1, c = 0.1, d = 1.0, e = 1.0, f = 1.0, g = 0.15, h = 1.0, i = 1.0, j = 1.0, k = 0.5)
yini <-c(Y1 = 1, Y2 = 1, Y3 = 1, Y4 = 1, Y5 = 1, Y6 = 1)
times <-seq(1, 60, 1)

out <- ode(y = yini, times = times, func = myfn, parms = parms)
plot(out)

以下是我收到的错误:

> out <- ode(y = yini, times = times, func = myfn, parms = parms)
Error in func(time, state, parms, ...) : object 'a' not found
> plot(out)
Error in plot(out) : object 'out' not found

1 个答案:

答案 0 :(得分:0)

一种解决方案是使用with(),例如:

myfn <- function(times, y, parms) {

   dy <- with(as.list(parms),
       c(a - b*y[4] - c*y[1],
         y[5]*dy[1]*(1+y[6]) - e*y[2] - (f*y[3]*y[4]*y[1] - g),
         h - i*y[2],
         y[6]*dy[1] - j*y[4] + k*(f*y[3]*y[4]*y[1] - g) + d,
         1.0 - y[5]*(y[1] + y[4] + 1),
         1.0 - y[6]*(y[1] + 1)))

   return(list(dy))  
}

(尚未测试过 - 在错误的地方可能会有一些括号。)

如果您还为状态向量命名,则可以使用with(as.list(c(parms,y)),...并使用状态名称而不是y[] - 索引来进一步提高可读性。