我是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
答案 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[]
- 索引来进一步提高可读性。