作为尝试使用DeSolve软件包在R中实现系统动力学模型的一部分,我想知道是否有一种方法可以在我的模型中建立管道(离散延迟)。
流水线延迟的一个例子可能是分发过程,例如其中某个亚马逊包裹在X时刻离开仓库,需要2天才能到达我,也就是说,整个包裹在固定的2天期限后到达了我。
我知道诸如Vensim等更流行的仿真程序包具有固定功能(Delay Fixed等)来处理此问题,但我正在寻找有关如何在R中实现此程序的指南(包括基本方程式( s)能够这样做。
如果我们使用一个简单的示例来说明我要做的事情-我们有一个带有以下内容的模型:
A。一个外生变量 1.预期增长率= 10%
B。两只股票:
延迟
资产
我的意思基本上是-如果我在t = 0时对资产进行投资,则应在t = 2结束后的3个时间段内实现并反映在资产价值中。
>您会在我的R代码中看到我被困在必须定义延迟输出方程式的行上-在数学上,要获得所需的延迟,我需要从一次投资中减去当前延迟值一段时间以前-但是我不知道如何调用那些滞后的值-我一直在研究使用dede而不是ode,但是不确定这是否在满足我的要求。
我也知道我可以通过将上式中的Delay值除以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`
..依此类推。
感谢您抽出宝贵的时间阅读,如果问题已经在其他地方提出,我将不胜感激,因为您找不到正确的答案,因此可以为我指明正确的方向。