如何解决R中的嵌套ODE方程

时间:2011-04-12 10:35:45

标签: r ode

我们可以在R中使用deSolve包用于常微分方程(ODE),但是,我找不到解决两个嵌套ODE方程的方法,假设b(t)'= beta - k * b (T); a(t)'= alpha -b(t)* gamma; 哪里'意味着差异化。那么我们如何解决a和b呢?作为'是b的函数,我们必须同时解决a和b。

我收到了一个错误:

  

lsoda(y,times,func,parms,...)出错:使用的求解器组合不能嵌套。

当我尝试在ode中添加ode求解b时,求解a。

1 个答案:

答案 0 :(得分:1)

我可能会感到困惑,但你似乎正在描述耦合方程式,lsoda可以很好地处理,如下所示(我实现了你的ODE,但由于我没有做出一些参数不知道你有什么想法。)

gfun <- function(t,y,parms,...) {
  ## 'with' trick lets us write gradient in terms of variable/parameter names
  with(as.list(c(y,parms)),
       list(c(b=beta-k*b,a=alpha-b*gamma),NULL))
}

library(deSolve)
L1 <- lsoda(y=c(b=1,a=1),
            times=seq(0,10,by=0.1),
            func=gfun,
            parms=c(alpha=0.1,beta=0.2,gamma=0.05,k=0.01))

matplot(L1[,1],L1[,-1],type="l",lty=1,bty="l",las=1)

PS:这似乎是一组耦合的线性ODE,所以你实际上应该能够得到一个完整的闭合形式解决方案,而不是用数字解决它们。 (我现在懒得这样做; b(t)可以立即解决(“仿射”等式),a(t)可以通过积分来解决。)