雅可比的不同变量

时间:2016-06-30 13:47:26

标签: r function nested ode

微分方程可以定义为

sys <- function(t, y, p, u) {
  dy <- numeric(2)
  u <- u(t)

  dy[1] = p$a*(1 + p$b*(y[2] - 1)/(p$c + y[2] - 1) - u*y[1])
  dy[2] = u*y[1] - y[2]
  list(dy)
}

让我们进一步假设稳态(均衡)是已知的。现在,有没有办法计算x右侧的雅可比矩阵?

我知道我可以定义

f <- function(y){
  c(
    p$a*(1 + p$b*(y[2] - 1)/(p$c + y[2] - 1) - u*y[1]),
    u*y[1] - y[2]
    )
}

计算雅可比矩阵
Jx <- jacobian(f, c(1,1))

其中jacobian来自pracma包。但是,如果没有这个中间步骤,是否有更简单的方法?如果可以在f内拨打sys,例如

,也可能有所帮助
sys <- function(t, y, p, u) {
  dy <- numeric(2)
  u <- u(t)

  dy[1] = f(y)[1]
  dy[2] = f(y)[2]
  list(dy)
}

最后,可能还有一种方法可以计算出Jacobian w.r.t.到u

非常感谢!

1 个答案:

答案 0 :(得分:1)

R rootSolve有一个解决方案。

为此,您的函数定义必须略有不同,但(在我看来)更方便。我不知道您的确切参数p或您的函数u,所以我做了一个最小的例子:

library(rootSolve)
sys <- function(t, y, parms) {
  with(as.list(c(y,parms)),{

  dy = a*(1 + b*(z - 1)/(c + z - 1) - 1*y)
  dz = 1*y - z
  return(list(c(dy, dz)))
  })
}

parms <- list(a = 1, b = 1, c= 2)

rootSolve::jacobian.full(y = c(y = 1, z = 1), func = sys, parms = parms)

在函数jacobian.fully()中,您可以使用稳态结果,我只选择随机结果。 sys的定义使用包deSolve中的ODE标准定义,这是解决ODE的一个很好的方案。
结果是一个普通的雅可比矩阵。

因此,使用此定义,您可以运行求解方程式的算法,例如

library(deSolve)
ode <- deSolve::ode(y = c(y = 1, z = 0), 
           times = seq(1,100), 
           func = sys, 
           parms = parms)
plot(ode)

我希望这对你有所帮助! 问候,
J_F