Есть ли способ реализовать конвейерную (дискретную) задержку с помощью решателя ODE в пакете desolve в R? - PullRequest
0 голосов
/ 03 февраля 2019

В рамках попытки реализовать динамическую модель системы в R с использованием пакета DeSolve я хотел бы знать, существует ли способ построить конвейер (дискретную задержку) в моей модели.

Примерзадержка конвейера может быть процессом распространения, например, когда пакет Amazon покидает склад в момент времени X и занимает 2 дня, чтобы добраться до меня, т.е. весь пакет достигает меня через фиксированную продолжительность в 2 дня.

Я знаю, чтоболее популярные пакеты моделирования, такие как Vensim и т. д., имеют фиксированные функции (Delay Fixed и т. д.), чтобы справиться с этим, но я ищу руководство о том, как это можно реализовать в R (включая базовое уравнение (я), чтобы иметь возможностьсделайте так).

Если мы используем простой пример того, что я пытаюсь сделать - у нас есть модель с:

A.Одна экзогенная переменная 1. Желаемая скорость роста = 10%

B.Две акции:

  1. Задержка

    • Приток в эту акцию составляет 10% от стоимости Актива (см. Ниже) в любой данный период
    • Отток должен быть притоком за два периода назад
  2. Актив

    • Приток в этот запас должен быть оттоком изЗадержка акций
    • Нет оттока / распада от этих акций

По сути, я говорю - если я сделаю инвестиции в активы в момент времени t= 0, это должно быть реализовано и отражено в стоимости активов через 3 периода времени в конце t = 2.

Вы увидите, что в моем коде R я застрял в строке, где у меня естьчтобы определить уравнение вывода задержки - математически, чтобы достичь желаемой задержки, мне нужно вычесть текущее значение задержки из инвестиций, сделанных один раз назад - но я понятия не имею, как вызывать эти запаздывающие значения - я изучилиспользуя деду, а не оду, но не уверен, что это сделатьчто мне нужно.

Я также знаю, что мог бы достичь задержки первого порядка, поделив значение задержки на 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`

.. и т. Д.

Спасибо, что нашли время, чтобы прочитатьи если бы вопрос уже задавался в другом месте, я был бы признателен, если бы вы указали мне правильное направление, так как я не смог найти ответ.

...