为什么特征函数returns"number of items to replace is not a multiple of replacement length"?

Why the eigen function returns "number of items to replace is not a multiple of replacement length"?

我在这里使用具有捕食性的 Lotka-Volterra 模型的经典示例(2 个 ODE,6 个参数)来回答这个问题。我需要计算平衡点,我知道平衡点的解析表达式,以及此时雅可比矩阵的特征值。我需要对大量位置执行此操作(这里我只执行 2 个),在此示例中,它们的不同之处在于 2 个参数 epsilon 和 psi 的值(2 个位置各有 2 个参数值)。

我创建了一个循环(因为 epsilon 和 psi 的大小再次变得更大)。这是我的代码:

A21 = as.matrix(c(0, 0))
alpha = -1
beta = 2
gamma = 1
delta = -2
epsilon = as.matrix(c(0, 1))
psi = as.matrix(c(0, -2))
x = 0
y = 0
param = c(0,0,0,0,0,0)
eig = A21
eqn <- function (t, state, pars)
{
  with (as.list(c(state, pars)),  {
    dx <- x*(alpha - beta*y - epsilon)
    dy <- -y*(gamma - delta*x + psi)
    list(c(dx, dy))
  })
}

for(i in 1:dim(A21)[1]) {
  x[i] = (gamma + psi[i]) / delta
  y[i] = (alpha - epsilon[i]) / beta
  param[i] = c(alpha, beta, gamma, delta, epsilon[i], psi[i])
  eig[i] = eigen(jacobian.full(y = c(x = x[i], y = y[i]), func = eqn, parms = param[i]))$values
}

我可以计算内部平衡点(向量x,y),但是函数"eigen" returns "number of items to replace is not a multiple of replacement length"。我想它来自我尝试替换参数列表的方式,我尝试了不同的方式(上面是其中之一)但没有任何效果。难道是double函数"eigen(jacobian.full(...))"不喜欢依赖索引?

有人可以帮忙吗?

我们无法测试您的代码,因为我们没有 jacobian.full 函数,但我猜您指的是 rootSolve 包中的函数。当我 运行 library(rootsolve) 之后的代码时,我收到这些警告:

Warning messages:
1: In param[i] <- c(alpha, beta, gamma, delta, epsilon[i], psi[i]) :
  number of items to replace is not a multiple of replacement length
2: In eig[i] <- eigen(jacobian.full(y = c(x = x[i], y = y[i]), func = eqn,  :
  number of items to replace is not a multiple of replacement length
3: In param[i] <- c(alpha, beta, gamma, delta, epsilon[i], psi[i]) :
  number of items to replace is not a multiple of replacement length
4: In eig[i] <- eigen(jacobian.full(y = c(x = x[i], y = y[i]), func = eqn,  :
  number of items to replace is not a multiple of replacement length

这些不是来自 eigen 函数,它们来自代码的最后两行。目前尚不清楚您的意图是什么。 param 被初始化为长度 6,然后你试图用长度为 6 的向量替换它的一个元素。也许解决方案就是使用

param = c(alpha, beta, gamma, delta, epsilon[i], psi[i])
eig = eigen(jacobian.full(y = c(x = x[i], y = y[i]), func = eqn, parms = param))$values

但是我真的看不出你的意图。