【发布时间】:2019-08-21 22:39:36
【问题描述】:
我想在数值方案的每一步提取状态变量的值。
deSolve R 包中的 ode() 函数使用已实现的 ODE 求解器之一对常微分方程组进行数值求解。为此,它使用基于每次积分结束时局部截断误差值的动态调整积分步骤。用户基本上指定了定义时间步长网格的所需输出时间,其步长可以等于或小于输出时间。
如果我们以 Lotka Volterra Predator-Prey 模型(有后勤猎物)为例:
LVmod <- function(Time, State, Pars) {
with(as.list(c(State, Pars)), {
Ingestion <- rIng * Prey * Predator
GrowthPrey <- rGrow * Prey * (1 - Prey/K)
MortPredator <- rMort * Predator
dPrey <- GrowthPrey - Ingestion
dPredator <- Ingestion * assEff - MortPredator
return(list(c(dPrey, dPredator)))
})
}
参数和状态变量定义为:
pars <- c(rIng = 0.2, # /day, rate of ingestion
rGrow = 1.0, # /day, growth rate of prey
rMort = 0.2 , # /day, mortality rate of predator
assEff = 0.5, # -, assimilation efficiency
K = 10) # mmol/m3, carrying capacity
yini <- c(Prey = 1, Predator = 2)
以及每日时间步长请求的输出:
times <- seq(0, 200, by = 1)
out <- ode(yini, times, LVmod, pars)
diagnostics(out)
查看诊断信息,我们可以看到求解器总共使用了 282 步,而输出生成了 200 步(在时间对象中设置)。
对于我正在运行的模型而言,这种差异要大得多,并且要对系统的稳定性进行完整分析,我需要每个集成步骤的输出以及步骤的大小。有没有办法从 ode 中提取这些信息?
【问题讨论】:
-
您可以在
ode()中使用method = "euler"作为额外参数,这样您将有200 个步骤(因为您的时间步长为1)。不是一个好的答案,但也许是第一次尝试。