使用内部时间步长求解R中的微分方程?

时间:2014-09-27 16:20:54

标签: r differential-equations

我正在建模,其中存储( cm )依赖于使用包中的输入和输出( cm / d

dS / dt = a * In - b * Out

这很完美。现在,问题是包含对状态变量存储的限制( Smax )。如果输入 - 输出大于存储器中的输出( Smax ),那么 dS / dt 应该设置为任何仍然适合(Smax -S) / dt ,以便 S = Smax 。 但这里需要(内部集成商)时间步长 dt 。有没有一种简单的方法可以在deSolve中检索这个时间步长?

问题的可重现性示例如下: 需要时间步长的位置用 ### DIVIDE SMAX-S BY TIMESTEP表示?

感谢您的努力。

### dummy data
dtime      <- 1:10 #d
dinput    <- c(0, 0, 1, 0, 100, 100, 100, 0, 20, 0)
doutput   <- c(0, 0, 0, 2, 0, 0,  0,  5, 0, 0)
dfInput  <- cbind(dtime, dinput)  #cm
dfOutput <- cbind(dtime, doutput) #cm

### input interpolation functions
Input    <- approxfun(dfInput,  rule = 2)
Output   <- approxfun(dfOutput, rule = 2)

### defining initial condition, parameters and time vector
pars      <- c(a=1, b=1, Smax=10) #Smax = maximum storage
times     <- seq(from=0, to=11, by = 0.1)
state_ini <- c(S=2)

### model equations
simple1 <-function(times, state_ini, pars) {
  with(as.list(c(state_ini, pars)),{
    In  <- Input(times)
    Out <- Output(times)

    # calculate rate of change (dS/dt; cm/d)
    dSh <- a*In - b*Out

    # but if storage threshold is exceeded, then fill till maximum storage 
    if(dSh > Smax - S) {dS <- Smax-S} ### DIVIDE Smax-S BY TIMESTEP?
    else {dS <- dSh}

    # return the rate of change
    list(c(dS))
  }) # end with(as.list ...
}


### numerical intergration
out <- ode(y = state_ini, times = times, func = simple1, parms = pars)

### plot result
plot(out, ylim=c(2,10))

0 个答案:

没有答案