Func2、times、y、rho 错误

Func2, times, y, rho error

我一直收到错误消息:

Error in checkFunc(Func2, times, y, rho) : 
  The number of derivatives returned by func() (175) must equal the length of the initial conditions vector (51)

我正在尝试创建一个基于 Brigatti 等人 2009 年的模型(具有空间成分的捕食模型)

x<-c(1:40000)

left_shift = function(x) {
  x[c(2:length(x), 1)]
}

right_shift = function(x) {
  x[c(length(x), 1:(length(x) - 1))]
}

laplace = function(x) {
  return(c(left_shift(x) + right_shift(x) - 2 * x))
}

dxdt <- function(time, state, pars) {
  prey = state[1:length(state) / 2]
  pred = state[(length(state) / 2 + 1):length(state)]
  dprey = pars[5] * laplace(prey) + pars[1] * prey - x[2] * prey * pred
  dpred = pars[5] * laplace(pred) + pars[3] * prey * pred - pars[4] *  pred
  list(c(prey, pred, dprey, dpred))
}

time <- seq(0, 600, by = 1)
pars <- c(alpha=1, 
      beta = .5, 
      gamma = .2, 
      delta = .6,
      D = 0.000008 #(0.004*0.004/2), #diffusion coefficient
        )

state <- rep(0.1, 51)

out <- as.data.frame(ode(func = dxdt, y = state, parms = pars, times =  time))

几个问题。首先,缺少括号。

prey = state[1:length(state) / 2]

应该阅读

prey = state[1:(length(state) / 2)]

其次,你的初始条件的长度是奇数。 state 应该为猎物 捕食者(按此顺序)指定初始条件。因此,对于每个位置都应该有两个值,因此,向量的长度应该始终是二的倍数。

第三,你的函数 dxdt 应该 return list(c(dprey, dpred))。没有理由 return 状态变量的值,因为 ODE 求解器会计算这些值。

修复这些,这就是你得到的:

left_shift = function(x) {
  x[c(2:length(x), 1)]
}

right_shift = function(x) {
  x[c(length(x), 1:(length(x) - 1))]
}

laplace = function(x) {
  return(c(left_shift(x) + right_shift(x) - 2 * x))
}

dxdt <- function(time, state, pars) {
  prey = state[1:(length(state) / 2)]
  pred = state[(length(state) / 2 + 1):length(state)]
  dprey = pars[5] * laplace(prey) + pars[1] * prey - x[2] * prey * pred
  dpred = pars[5] * laplace(pred) + pars[3] * prey * pred - pars[4] *  pred

  list(c(dprey, dpred))
}

time <- seq(0, 600, by = 1)
pars <- c(alpha=1, 
          beta = .5, 
          gamma = .2, 
          delta = .6,
          D = 0.000008 #(0.004*0.004/2), #diffusion coefficient
)

state <- rep(0.1, 50)

out <- as.data.frame(ode(func = dxdt, y = state, parms = pars, times =  time))