1

DeSolve パッケージを使用して R でシステム ダイナミクス モデルを実装しようとする一環として、モデルにパイプライン (離散遅延) を構築する方法があるかどうかを知りたいです。

パイプラインの遅延の例としては、Amazon の荷物が X の時点で倉庫を出て、私に届くまでに 2 日かかる場合など、配送プロセスが考えられます。つまり、荷物全体が 2 日間の固定期間の後に私に届きます。

Vensim などのより一般的なシミュレーション パッケージには、これに対処するための固定関数 (Delay Fixed など) があることを知っていますが、R でこれを実装する方法についてのガイダンスを探しています (基になる方程式を含む)そうすることができます)。

私がやろうとしていることの種類の簡単な例を使用すると、次のモデルがあります。

A. 1 つの外生変数 1. 望ましい成長率 = 10%

B. 2 つの株:

  1. 遅れ

    • この株式への流入は、任意の期間における資産株式 (下記参照) の値の 10% です。
    • 流出は2期前の流入であるべき
  2. 資産

    • この在庫への流入は、遅延在庫からの流出である必要があります
    • この株からの流出・崩壊はありません

基本的に私が言いたいのは、t=0 の時点で資産に投資した場合、これは実現され、3 期間後の t=2 の終わりに資産の価値に反映されるはずだということです。

私の R コードでは、遅延出力方程式を定義しなければならない行でスタックしていることがわかります。数学的に、必要な遅延を達成するには、1 時間前に行った投資から現在の遅延値を差し引く必要があります。しかし、これらの遅れた値を呼び出す方法がわかりません.odeではなくdedeを使用することを検討しましたが、それが必要なことを行っているかどうかはわかりません.

また、上記の式で Delay 値を 3 で割ることによって 1 次遅延を達成できることも認識していますが、これは投資の利益の 3 分の 1 を現在の時間ですぐに得られることを意味します。達成しようとしています。

    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