Приток в определенное время с изменением временного шага в DeSolve
Я создаю модель распределения населения с ODE и DDE в DeSolve с помощью метода lsoda. В этой модели я хочу иметь приток населения в определенное время (в определенный день). Очень простой пример:
dn1dt=influx - mortality
Приток (x) должен произойти во время (t) = y (в днях). Если это не день у, я не хочу притока. На данный момент я написал приток как
influx=function(t,y,x){ifelse((t==y), x, 0))
, но я столкнулся с проблемой изменения временного шага из-за используемого метода (lsoda). Из-за изменяющегося временного шага я не буду указывать конкретное время (y), которое вызовет приток. Я только начинаю работать с изменяющимся временным шагом, поэтому не знаю, как справиться с этой проблемой. Пожалуйста, дайте мне знать, если что-то неясно.
1 ответ
Приток может быть реализован как зависящий от времени ввод (также называемый «форсированием», который длится определенное время, например день) или как событие, при котором переменная состояния изменяется немедленно. Вот пример использования прямоугольного сигнала в качестве форсирования. Интерполяция времени реализована с помощью
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
странице помощи или на этой странице .