首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R deSolve:如何解释参数中的参数?

R deSolve:如何解释参数中的参数?
EN

Stack Overflow用户
提问于 2019-04-02 22:32:59
回答 1查看 114关注 0票数 0

我正在使用deSolve包在R中构建基于Lotka-Volterra导数的捕食者-猎物模型。我定义了参数、初始状态和时间步长以及模型函数。然后,当使用时间延迟时,我使用ode()dede()来解决所有问题。

我注意到输出会有很大的不同,这取决于你如何定义模型函数中的参数,我真的不明白为什么。您可以通过以下两种方式提取参数:通过参数:parms['r']调用它们,或者通过我传递给参数:parameters['r']的前面定义的对象。这两种情况的结果是相同的。

这不同于初始状态:调用参数:y[1]y['N'],与通过传递给参数:init[1]init['N']的对象调用完全不同的结果。

此外,在DDE中:time - tautimes - tau以及ylag <- yylag <- init之间也存在差异。

为什么参数和对象的初始状态和时间的结果不同,而参数的结果不同?我需要很好地理解这一点,以便在稍后阶段使用FME包,所以我希望有人能解释这种行为。

我的代码:

代码语言:javascript
复制
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))
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-04-02 22:43:16

观察到的行为是正确的。一个简短的解释:

“‘parms”是模型函数中的局部变量,而“parameters”是工作区中的全局变量。这对deSolve来说没什么特别的,这是R工作的一般方式。在大多数情况下,首选方法是使用局部变量。

对于各州来说,这确实是不同的。在这里,外部值'init‘是开始时的初始值,而局部'y’是时间步长的当前值。

dede参数是类似的。init是开始,y是瞬时值,次是所有时间步长的全局向量,时间是实际时间步长。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55477331

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档