1

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

管道延迟的一个示例可能是配送过程,例如,亚马逊包裹在时间 X 离开仓库并需要 2 天才能到达我手中,即整个包裹在 2 天的固定持续时间后到达我手中。

我知道更流行的模拟包,如 Vensim 等具有固定功能(延迟固定等)来处理这个问题,但我正在寻找如何在 R 中实现它的指导(包括底层方程)能够这样做)。

如果我们使用我正在尝试做的那种事情的简单示例 - 我们有一个模型:

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

B. 两只股票:

  1. 延迟

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

    • 流入这个股票应该是从延迟股票流出
    • 该股票没有流出/衰减

基本上我要说的是 - 如果我在时间 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`

..等等。

感谢您花时间阅读,如果问题已经在其他地方提出过,如果您能指出我正确的方向,我将不胜感激,因为我无法找到答案。

4

0 回答 0