在 DeSolve 中随着时间步长的变化在特定时间涌入

Influx at specific time with changing time step in DeSolve

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

dn1dt=influx - mortality

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

涌入可以实现为时间相关输入(也称为“强制”,持续特定时间,例如一天)或事件,其中状态变量立即改变。这里是一个使用矩形信号作为强制的示例。时间的插值是用 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 帮助页面或 this page.

找到更多内容