在 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
实现的。通量函数可以简单地作为附加参数添加到 ode
和 model
:
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.
找到更多内容
我正在使用 lsoda 方法在 DeSolve 中使用 ODE 和 DDE 制作人口分布模型。 在这个模型中,我希望在特定时间(特定日期)有大量人口涌入。 一个很简单的例子:
dn1dt=influx - mortality
流入 (x) 需要发生在时间 (t) = y(以天为单位)。如果不是第 y 天,我不想涌入。
目前我已将涌入写为 influx=function(t,y,x){ifelse((t==y), x, 0))
,但由于我使用的方法 (lsoda),我 运行 陷入了时间步长变化的问题。由于时间步长的变化,我不会达到触发涌入的具体时间 (y)。
我刚刚开始使用不断变化的时间步长,所以我不确定如何处理这个问题。如果有任何不清楚的地方,请告诉我。
涌入可以实现为时间相关输入(也称为“强制”,持续特定时间,例如一天)或事件,其中状态变量立即改变。这里是一个使用矩形信号作为强制的示例。时间的插值是用 approxfun
实现的。通量函数可以简单地作为附加参数添加到 ode
和 model
:
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.