在deSolve中延迟参数值/流入和流出速率

时间:2019-03-21 10:05:46

标签: r differential-equations

我正在使用R软件包deSolve来求解常微分方程组。在“系统动力学”文献中,可以使用平均延迟时间来模拟流入和流出速率的延迟。例如,在时间t,股票Y的变化率可以是:

dy(t)/dt = inflow(t) - ( outflow(t) / D )

其中延迟时间D例如4个时间步骤。延迟被假定为平均延迟时间。

但是,对延迟进行建模的另一种方法是假设事件更加离散,其中流出等于先前D个时间单位的库存流入量,因此:

dy(t)/dt = inflow(t) - inflow(t - D)

deSolve中,我们可以将lagvaluelagderiv函数与dede求解器函数一起使用,以指定利用状态的滞后值的延迟微分方程。变量,但我似乎找不到一种方法来要求deSolve使用流入/流出速率的滞后值。

例如,使用简单的模型:

m<- function(t,y,p){
    with(as.list(c(y,p)),{
        inflow <- 100
        outflow <- y*.5
        dy <- inflow - outflow
        return(list(c(dy), inflow=inflow, outflow=outflow))
    })}

fit <- ode(func=m, y=c(100),t=seq(0,10,1),p=c(), method="euler") 

   time        1 inflow  outflow
1     0 100.0000    100 50.00000
2     1 150.0000    100 75.00000
3     2 175.0000    100 87.50000
4     3 187.5000    100 93.75000
5     4 193.7500    100 96.87500
6     5 196.8750    100 98.43750
7     6 198.4375    100 99.21875
8     7 199.2188    100 99.60938
9     8 199.6094    100 99.80469
10    9 199.8047    100 99.90234
11   10 199.9023    100 99.95117

使用dede,可以在上一个D = 2时间步中使流出成为状态变量的滞后值:

m2<- function(t,y,p){
    with(as.list(c(y,p)),{
        inflow <- 100
        if(t < D) outflow <- y*.5
        if(t >= D) outflow <- lagvalue(t-D,1)*.5
        dy <- inflow - outflow
        return(list(c(dy), inflow=inflow, outflow=outflow))
    })}

fit2 <- dede(func=m, y=c(100),t=seq(0,10,1),p=c(D=2))

   time        1 inflow  outflow
1     0 100.0000    100 50.00000
2     1 139.3469    100 69.67344
3     2 163.2120    100 81.60602
4     3 177.6870    100 88.84349
5     4 186.4665    100 93.23323
6     5 191.7915    100 95.89575
7     6 195.0213    100 97.51064
8     7 196.9803    100 98.49013
9     8 198.1684    100 99.08422
10    9 198.8891    100 99.44456
11   10 199.3262    100 99.66312

但是现在想象一下,我希望流出实际上是前面D=2时间的流入。我想要类似的东西:

**** Code will not run ****
m3<- function(t,y,p){
    with(as.list(c(y,p)),{
        inflow <- 100
        if(t < D) outflow <- 0
        if(t >= D) outflow <- lagvalue(t-D,inflow)
        dy <- inflow - outflow
        return(list(c(dy), inflow=inflow, outflow=outflow))
    })}
...

据我所知,deSolve不允许这样做。有一种简单的方法可以允许它吗?

我对混合连续和离散事件类型模型感兴趣的原因在于对供应链进行建模,在该模型中,某些产品的平均时间延迟可能不准确。

0 个答案:

没有答案