我正在尝试解决一个微分方程,该微分方程描述了特定天数内池塘中溶解氧(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从初始值开始,超过均衡值,然后每天再次低于均衡值。任何人可以提供的任何帮助,我可能有什么不对,将不胜感激!
答案 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。
祝福,
约翰