用于求解微分方程的 R:deSolve - 大于初始条件的导数数

R for solving differential equations: deSolve - Number of derivatives greater than initial conditions

我正在尝试求解一个微分方程,该方程描述了池塘中溶解氧 (DO) 浓度在特定日期之间的变化。我正在求解的方程是:dc/dt=-kC+p 其中 k 是一阶 DO 衰减常数(1/天),p 是零阶 DO 生产率。我有一个初始浓度和一个最终达到的平衡,并使用 deSolve 包中的 'ode' 成功求解了日平均 DO 浓度的方程。我现在正试图解决每小时浓度的差异,其中衰变不断发生,但 DO 生产仅发生在早上 6 点和下午 6 点之间。我已将功能实现为:

dc.dt<-function(time,y,parms) {
  with(as.list(c(y,parms)), {
    dC<-ifelse(times%%1>=0.25 & times%%1<=0.75, (-k)*C+(p), (-k)*C)
    list(dC)
  })
}
y<-c(C=6.2) 
parms<-c(p=(1.752),k=0.1)
times<-as.numeric((seq(from=as.POSIXct("2016-06-01 09:00",format="%Y-%m-%d 
%H:%M"),to=as.POSIXct("2016-06-30 23:00",format="%Y-%m-%d %H:%M"),
        by="hours")))
times<-(times-as.numeric(as.POSIXct("2016-06-01",format="%Y-%m-%d")))/86400

out<-ode(y,times,dc.dt,parms)

时间采用十进制日期格式,从 2016-06-01 9:00 开始到 2016-06-30 23:00

> head(times)
[1] 0.3750000 0.4166667 0.4583333 0.5000000 0.5416667 0.5833333

我试图在我的 ifelse 语句中使用时间向量的模数 1,其中 times %% 1 = 0.25 是早上 6 点,times %% 1 = 0.75 是下午 6 点。

使用 ode 解决似乎想要 return 正确数量的结果,但我收到此错误消息:

> out<-ode(y,times,dc.dt3,parms)
Error in checkFunc(Func2, times, y, rho) : 
  The number of derivatives returned by func() (711) must equal the length of    
  the initial conditions vector (1)

如果我的 y 向量只是一个初始浓度,那么这里指的是初始条件向量。我不是 R 的新手,但我是微分方程的新手,这是我第一次使用 R 来求解这些类型的方程。使用每日时间步长,C 从初始值开始并达到平衡值。使用每小时时间步长,我希望看到一个昼夜模式,其中 DO 从初始值开始,超过平衡值,然后每天再次低于平衡值。如果有人可以提供我可能有问题的任何帮助,将不胜感激!

你只需要改变一点点:

dc.dt<-function(time,y,parms) {
  with(as.list(c(y,parms)), {

    ifelse(times%%1>=0.25 & times%%1<=0.75, dC <- (-k)*C+(p), dC <-   (-k)*C)
    return(list(dC))

  })
}

现在可以了。由于 "ifelse" 命令,程序认为 dC 的长度为 711。您必须在 ifelse 命令中分配 dC。

祝福,

约翰内斯