Есть ли способ реализовать конвейерную (дискретную) задержку с помощью решателя ODE в пакете desolve в R?
В рамках попытки реализовать динамическую модель системы в R с использованием пакета DeSolve я хотел бы знать, есть ли способ встроить конвейер (дискретную задержку) в мою модель.
Примером конвейерной задержки может быть процесс распространения, например, когда пакет Amazon покидает склад в момент времени X и занимает 2 дня, чтобы добраться до меня, т.е. весь пакет достигает меня по истечении фиксированной продолжительности 2 дня.
Я знаю, что более популярные пакеты моделирования, такие как Vensim и т. Д., Имеют фиксированные функции (Delay Fixed и т. Д.), Чтобы справиться с этим, но я ищу руководство о том, как это может быть реализовано в R (включая основные уравнения для быть в состоянии сделать это).
Если мы используем простой пример того, что я пытаюсь сделать - у нас есть модель с:
A. Одна экзогенная переменная 1. Желаемая скорость роста = 10%
Б. Два запаса:
задержка
- Приток в этот запас составляет 10% от стоимости актива (см. Ниже) в любой данный период
- Отток должен быть притоком из двух периодов назад
Актив
- Приток в этот запас должен быть оттоком из запаса задержки
- Нет оттока / распада с этого запаса
По сути, я говорю следующее: если я делаю инвестиции в активы в момент времени t=0, это должно быть реализовано и отражено в стоимости активов через 3 периода времени в конце t=2.
Вы увидите, что в моем коде R я застрял в строке, где мне нужно определить уравнение вывода задержки - математически, чтобы достичь желаемой задержки, мне нужно вычесть текущее значение задержки из инвестиций, сделанных один раз назад - но я понятия не имею, как вызывать эти запаздывающие значения - я изучал использование dede, а не ode, но не уверен, что это делает то, что мне нужно.
Я также знаю, что мог бы достичь задержки первого порядка, поделив значение Задержки на 3 в приведенном выше уравнении, но это означало бы, что я получаю треть выгоды от моих инвестиций немедленно в текущем времени, что не является результатом ищу достижения.
library(deSolve)
Start <- 0
Finish <- 10
Step <- 1
simtime <- seq(Start, Finish, by=Step)
stocks <- c(sAssets=10,sDelay=0)
auxs <- c(aDesired.Growth=0.10)
model <- function(time, stocks, auxs) {
with(as.list(c(stocks,auxs)),
{
f.Delay.Input <- sAssets * aDesired.Growth
f.Delay.Output <- sDelay - [f.Investment #from one time period ago]
f.Asset.Input <- f.Delay.Output
da_dt <- f.Asset.Input
dd_dt <- f.Delay.Input - f.Delay.Output
return(list(c(da_dt, dd_dt),
Delay.Input=f.Delay.Input,
Delay.Output=f.Delay.Output,
Investment.in.Assets=f.Asset.Input,
))
})
}
o <- data.frame(ode(y=stocks, times=simtime, func=model, parms=auxs,
method="euler"))
summary(o)
Мой ожидаемый результат оттока акций Delay заключается в следующем. Обратите внимание, что притоки составляют, так как в реальной модели значения будут колебаться в каждом периоде:
Time Delay Inflow Outflow
`0 0 200 0`
`1 200 180 0`
`2 380 80 200 ---> 380 (current delay) -180 (previous inflow)`
`3 260 176 180 ---> 260-80 `
`4 256 288 80 ---> 256-176`
`5 464 XXX 176 ---> 464-288`
..и так далее.
Спасибо, что нашли время, чтобы прочитать, и если вопрос уже был задан в другом месте, я был бы признателен, если бы вы указали мне правильное направление, так как я не смог найти ответ.