我正在建模differential-equation,其中存储( cm )依赖于使用desolve包中的输入和输出( cm / d ) r:
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))