R deSolve: как интерпретируются аргументы и параметры?

Я строю модели хищник-жертва на основе производных Lotka-Volterra в 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))

person Tingolfin    schedule 02.04.2019    source источник


Ответы (1)


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

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

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

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

person tpetzoldt    schedule 02.04.2019