微分方程的功能取决于时间(以R为单位)

时间:2019-03-07 08:24:01

标签: r function if-statement differential-equations

我想做一个微分方程,其中在一年的特定时期内,青少年的生长达到峰值。在该年的剩余时间里,本底出生率很高。我想用R中的函数对此模型建模,但是我陷入了困境。 少年变年轻,而少年变大(可以繁殖新的少年)

我认为可以在函数中使用一个函数,但出现错误...

我现在得到了:

model = function(t, state, parameters) {
with(as.list(c(state, parameters)), {
dJ = function(t, dJ1, dJ2) {
if (t<213) {dJ = rho*A - a*J*A - c*J - d*J*(1+(J/K1))} else {
dJ = r*A - a*J*A - c*J - d*J*(1+(J/K1))}
}
dY = c*J - e*Y * f*Y*(1+Y/K2) - k*Y*A
dA = e*Y - m*A(1+A/K3) 
return(list(c(dJ, dY, dA)))
})
}

run()

但是...这不起作用。我得到了错误 “ lsods(y,times,func,parms等)中的错误:REAL()只能应用于'数字,而不能应用于所有'list'””

如果您有任何想法如何创建这样的模型,请告诉我!

1 个答案:

答案 0 :(得分:0)

没关系,我已经知道了! 其实我真的很亲密!我将在下面发布答案,以防其他人也为此感到困扰!

有效的解决方案是:

model = function(t, state, parameters) {
with(as.list(c(state, parameters)), {
dJ = ifelse(t<213, rho*A - a*J*A - c*J - d*J*(1+(J/K1)),
ifelse(t<305, r*A - a*J*A - c*J - d*J*(1+J/K1)),
rho*A - a*J*A - c*J - d*J*(1+(J/K1))))
dY = c*J - e*Y - f*Y*(1+Y/K2)) - k*Y*A
dA = e*Y - m*A*1+(A/K3))

在这里,rho和r具有不同的值