微分方程可以定义为
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
?
非常感谢!
答案 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