有没有一种方法可以在R的desolve包中使用ODE求解器来实现流水线(离散)延迟?

时间:2019-02-03 17:05:14

标签: r delay ode systemdynamics

作为尝试使用DeSolve软件包在R中实现系统动力学模型的一部分,我想知道是否有一种方法可以在我的模型中建立管道(离散延迟)。

流水线延迟的一个例子可能是分发过程,例如其中某个亚马逊包裹在X时刻离开仓库,需要2天才能到达我,也就是说,整个包裹在固定的2天期限后到达了我。

我知道诸如Vensim等更流行的仿真程序包具有固定功能(Delay Fixed等)来处理此问题,但我正在寻找有关如何在R中实现此程序的指南(包括基本方程式( s)能够这样做。

如果我们使用一个简单的示例来说明我要做的事情-我们有一个带有以下内容的模型:

A。一个外生变量 1.预期增长率= 10%

B。两只股票:

  1. 延迟

    • 在任何给定时期内流入该股票的金额为资产存量价值的10%(见下文)
    • 流出应该是两个时期前的流入
  2. 资产

    • 流入该库存的应该是延迟库存的流出
    • 此库存没有流出/衰减

我的意思基本上是-如果我在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`

..依此类推。

感谢您抽出宝贵的时间阅读,如果问题已经在其他地方提出,我将不胜感激,因为您找不到正确的答案,因此可以为我指明正确的方向。

0 个答案:

没有答案