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

时间:2016-02-04 15:20:45

标签: r ode differential-equations

我正在尝试解决一个微分方程,该微分方程描述了特定天数内池塘中溶解氧(DO)浓度的变化。我正在解决的等式是:dc / dt = -kC + p其中k是一阶DO衰减常数(1 /天),p是零阶DO生产率。我有一个初始浓度和最终达到的平衡,并成功地使用&#39在deSolve包中。我现在正试图解决每小时浓度的这种差异,其中衰变不断发生,但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是6AM而times %% 1 = 0.75是6PM。

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

> 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从初始值开始,超过均衡值,然后每天再次低于均衡值。任何人可以提供的任何帮助,我可能有什么不对,将不胜感激!

1 个答案:

答案 0 :(得分:0)

你只需改变一点点:

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。

祝福,

约翰