作为尝试使用 DeSolve 包在 R 中实现系统动力学模型的一部分,我想知道是否有办法在我的模型中构建管道(离散延迟)。
管道延迟的一个示例可能是配送过程,例如,亚马逊包裹在时间 X 离开仓库并需要 2 天才能到达我手中,即整个包裹在 2 天的固定持续时间后到达我手中。
我知道更流行的模拟包,如 Vensim 等具有固定功能(延迟固定等)来处理这个问题,但我正在寻找如何在 R 中实现它的指导(包括底层方程)能够这样做)。
如果我们使用我正在尝试做的那种事情的简单示例 - 我们有一个模型:
A. 一个外生变量 1. 期望增长率 = 10%
B. 两只股票:
延迟
- 在任何给定期间,流入该股票的资金为资产股票价值的 10%(见下文)
- 流出应该是两个时期前的流入
资产
- 流入这个股票应该是从延迟股票流出
- 该股票没有流出/衰减
基本上我要说的是 - 如果我在时间 t=0 对资产进行投资,这应该在 t=2 结束时的 3 个时间段后实现并反映在资产的价值中。
你会在我的 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)
我对延迟库存流出的预期结果如下。请注意,流入是由实际模型构成的,因为在每个时期内,这些值都会波动:
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`
..等等。
感谢您花时间阅读,如果问题已经在其他地方提出过,如果您能指出我正确的方向,我将不胜感激,因为我无法找到答案。