R deSolve:如何解释参数和参数?
R deSolve: how are arguments en thus parameters interpreted?
我正在使用包 deSolve 在 R 中基于 Lotka-Volterra 导数构建捕食者-猎物模型。我定义参数、初始状态和时间步长以及模型函数。然后我在使用时滞时使用 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))
观察到的行为是正确的。简短说明:
'parms'是模型函数中的局部变量,而'parameters'是工作空间中的全局变量。这对 deSolve 来说没什么特别的,它是 R 工作的一般方式。在大多数情况下,首选方法是使用局部变量。
对于各州来说,这确实是不同的。这里外部值 'init' 是开始时的初始值,而局部值 'y' 是时间步长的当前值。
dede参数类似。 init 是起点,y 是瞬时值,times 是所有时间步长的全局向量,time 是实际时间步长。
我正在使用包 deSolve 在 R 中基于 Lotka-Volterra 导数构建捕食者-猎物模型。我定义参数、初始状态和时间步长以及模型函数。然后我在使用时滞时使用 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))
观察到的行为是正确的。简短说明:
'parms'是模型函数中的局部变量,而'parameters'是工作空间中的全局变量。这对 deSolve 来说没什么特别的,它是 R 工作的一般方式。在大多数情况下,首选方法是使用局部变量。
对于各州来说,这确实是不同的。这里外部值 'init' 是开始时的初始值,而局部值 'y' 是时间步长的当前值。
dede参数类似。 init 是起点,y 是瞬时值,times 是所有时间步长的全局向量,time 是实际时间步长。