2015-03-23 7 views
1

Я новичок как для R, так и для deSolve. Я пытаюсь решить уравнение с заданными начальными параметрами и значениями переменных состояния. Однако в конце появляется ошибка из-за того, что мои параметры не имеют объектов. Как мне это преодолеть? Создать новый объект для каждого параметра?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

Одним из решений является использование 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[] -индекс.

Смежные вопросы