0

我正在使用方法 lsoda 在 DeSolve 中使用 ODE 和 DDE 制作人口分布模型。在这个模型中,我希望在特定时间(特定日期)有大量人口涌入。一个非常简单的例子:

dn1dt=influx - mortality

涌入 (x) 需要在时间 (t) = y(以天为单位)发生。如果不是第 y 天,我不想要大量涌入。目前我已将涌入编写为influx=function(t,y,x){ifelse((t==y), x, 0)),但由于我使用的方法(lsoda),我遇到了时间步长变化的问题。由于时间步长的变化,我不会达到触发流入的具体时间(y)。我刚刚开始使用不断变化的时间步长,所以我不确定如何处理这个问题。如果有任何不清楚的地方,请告诉我。

4

1 回答 1

1

流入可以实现为与时间相关的输入(也称为“强制”,持续一定时间,例如一天)或作为事件,其中状态变量立即改变。这是一个使用矩形信号作为强制的示例。时间插值是用 实现的approxfun。通量函数可以简单地作为附加参数添加到odemodel

library("deSolve")

model <- function(t, y, p, flux) {
  influx <- flux(t)
  dN <- influx - p["d"] * y["N"]
  list(dN, influx = influx)  
}

y0 <- c(N = 1)
p  <- c(d = 0.2)
times <- seq(0, 10, length.out = 100)
flux <- approxfun(x = c(0, 5, 6, 10), 
                  y = c(0, 1, 0,  0), rule = 2, method = "constant")

out <- ode(y = y0, times = times, model, parms = p, 
           flux = flux, method = "lsoda")

plot(out, las=1)

更多信息可以在?forcings帮助页面或此页面上找到

强迫

于 2022-01-27T21:51:54.180 回答