为什么特征函数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
但是我真的看不出你的意图。
我在这里使用具有捕食性的 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
但是我真的看不出你的意图。