R 使用包desolve-状态可以由矩阵定义吗?
我正在尝试使用deSolve对相当多的州进行建模。其中一个状态“foo”实际上由15个不同的状态组成,包括foo[1,1:5]、foo[2,1:5]和foo[3,1:5],因此我认为向函数传递一个状态矩阵最简单,而不是单独键入它们,然后我可以通过索引引用它们:R 使用包desolve-状态可以由矩阵定义吗?,r,ode,R,Ode,我正在尝试使用deSolve对相当多的州进行建模。其中一个状态“foo”实际上由15个不同的状态组成,包括foo[1,1:5]、foo[2,1:5]和foo[3,1:5],因此我认为向函数传递一个状态矩阵最简单,而不是单独键入它们,然后我可以通过索引引用它们: par <- rep(NA,3) par_names <- c('alpha','prog','death_rate') names(par) <-par_names par['alpha'] <-
par <- rep(NA,3)
par_names <- c('alpha','prog','death_rate')
names(par) <-par_names
par['alpha'] <- 0.7
par['prog'] <- 0.8
par['death_rate'] <- 0.3
foo <- matrix(0,nrow = 3,ncol = 5)
states <- foo
my_func <- function(t,states,par){
with(as.list(c(states,par)),{
for (j in 1:5){
dfoo[1,j] <- par['alpha']*par['prog']*foo[1,j] - par['death_rate']*foo[1,j]
dfoo[2,j] <- par['prog']*foo[1,j] - par['prog']*foo[2,j] - par['death_rate']*foo[2,j]
dfoo[3,j] <- par['prog']*foo[2,j] - par['prog']*foo[3,j] - par['death_rate']*foo[3,j]
}
list(c(
dfoo[]
))
})
}
times <- seq(1,365,by=1)
library(deSolve)
alldata <- as.data.frame(ode(y=states,times=times,func=my_func,parms=par))
<代码> PAL> P>是的,你可以在你的状态中传递一个矩阵。但是每次
ode
调用您的函数时(第一次除外),它都会传递一个向量,而不是矩阵。但是你可以在函数的开头把它转换成矩阵
您使用不必要的扭曲来创建数据。此外,正如注释中指出的,您的函数似乎没有初始化dfoo
。最后,函数中的for
循环可以通过一些向量化操作更干净地处理。以下是一个例子:
my_func <- function(t,states,par){
foo <- matrix(states, nrow = 3, ncol = 5)
dfoo <- with(as.list(par), rbind(
(prog * alpha * foo[1,]) - (death_rate * foo[1,]),
(prog * foo[-nrow(foo),]) - (prog * foo[-1,]) - (death_rate * foo[-1,])
))
list(dfoo)
}
library(deSolve)
par <- c(alpha = 0.7, prog = 0.8, death_rate = 0.3)
states <- matrix(0,nrow = 3,ncol = 5)
ode <- ode(y=states, times=1:365, func=my_func, parms=par)
alldata <- as.data.frame(ode)
my_func错误消息说明了一切。[好吧,很公平,你已经指出了,这是一个明显的错误。好吧,,,,我认为错误消息一打印出来就很明显了。我对这一点很陌生。但主要的问题是——它甚至可以做到吗?可以将函数的状态赋予矩阵吗?我在互联网上找不到任何东西说它可以或不能,但也许我没有读到它他说得对……啊,对不起,这根本不是我的本意!如果我正确理解了你的评论,我正在使用的函数在最后一行-ode()中给出。这就是你的意思吗?
my_func <- function(t,states,par){
foo <- matrix(states, nrow = 3, ncol = 5)
dfoo <- with(as.list(par), rbind(
(prog * alpha * foo[1,]) - (death_rate * foo[1,]),
(prog * foo[-nrow(foo),]) - (prog * foo[-1,]) - (death_rate * foo[-1,])
))
list(dfoo)
}
library(deSolve)
par <- c(alpha = 0.7, prog = 0.8, death_rate = 0.3)
states <- matrix(0,nrow = 3,ncol = 5)
ode <- ode(y=states, times=1:365, func=my_func, parms=par)
alldata <- as.data.frame(ode)