R deSolve: как аргументы en таким образом интерпретируют параметры? - PullRequest
0 голосов
/ 02 апреля 2019

Я строю модели хищников-жертв на основе производных Лотки-Вольтерры в R с использованием пакета deSolve.Я определяю параметры, начальное состояние и временные шаги и функцию модели.Затем я решаю все, используя ode() или dede() при использовании временной задержки.

Я заметил, что есть большая разница в выводе в зависимости от того, как вы определяете параметры В функции модели, и я действительно не понимаюЗачем.Вы можете извлечь параметры, вызвав их через аргумент: parms['r'] или через ранее определенный объект, который я передал аргументу: parameters['r'].В обоих случаях один и тот же результат.

Это отличается от исходного состояния, хотя: вызов аргумента: y[1] или y['N'], дает совершенно другой результат, чем вызов его через объект, переданный аргументу: init[1] или init['N'].

Также в DDE: есть разница в time - tau против times - tau и ylag <- y против ylag <- init.

Почему есть другой результатдля аргумента против объекта для начального состояния и времени, а не для параметров?Мне нужно хорошо это понять, чтобы использовать пакет FME на более позднем этапе, поэтому я надеюсь, что кто-то может объяснить это поведение.

Мой код:

library(deSolve)

## Parameters
parameters <- c(r = 0.25, K = 200, a = 0.01, c = 0.01, m = 1, tau = 7)
init <- c(N = 20, P = 2)
time <- seq(0, 100, by = 0.01)

## Ordinary DE
PreyPred <- function(times, y, parms){ #chose same argument names as ode()

  N <- y['N'] #y[1] works as well
  P <- y['P']
  #N <- init['N'] #(or init[1]) gives a totally different result!
  #P <- init['P']

  r <- parms['r'] #growth rate prey      parameters['r'] gives same result
  K <- parms['K'] #carrying capacity prey
  a <- parms['a'] #attack rate predator
  c <- parms['c'] #assimilation rate (?) predator
  m <- parms['m'] #mortality predator

  dN <- r * N * (1-N/K) - a * N * P
  dP <- c * N * P - m * P

  return(list(c(dN, dP)))
}

oderesult <- ode(func = PreyPred, parms = parameters, y = init, times = time)
plot(oderesult, lwd = 2, mfrow = c(1,2))

## Delayed DE
PreyPredLag <- function(times, y, parms){

  N <- y['N']
  P <- y['P']
  #N <- init['N']
  #P <- init['P']

  r <- parms['r'] #growth rate prey
  K <- parms['K'] #carrying capacity prey
  a <- parms['a'] #attack rate predator
  c <- parms['c'] #assimilation rate (?) predator
  m <- parms['m'] #mortality predator
  tau <- parms['tau'] #time lag

  tlag <- times - tau
  #tlag <- time - tau #different result
  if (tlag < 0)
    ylag <- y
    #ylag <- init
  else
    ylag <- lagvalue(tlag)

  # dede
  dN <- r * N * (1-N/K) - a * N * P
  dP <- c * ylag[1] * ylag[2] - m * P

  return(list(c(dN, dP), lag = ylag))
}

dederesult <- dede(func = PreyPredLag, parms = parameters, y = init, times = time)
plot(dederesult, lwd = 2, mfrow = c(2,2))

1 Ответ

0 голосов
/ 02 апреля 2019

Наблюдаемое поведение правильное. Краткое объяснение:

'parms' - локальная переменная в функции модели, а 'параметры' - глобальная переменная в рабочей области. Для deSolve в этом нет ничего особенного, это общий способ работы R. В большинстве случаев предпочтительным способом является использование локальной переменной.

Для штатов это действительно другое. здесь внешнее значение init является начальным значением в начале, а локальное y является текущим значением для временного шага.

Параметры dede аналогичны. init - начало, y мгновенное значение, times - глобальный вектор всех временных шагов, а time - фактический временной шаг.

...