1

我知道这是一个简单的修复,但有人可以看看它:

a12= 0
a21= 0
K1= 1000
K2= 600
r1= 0.2
r2= 0.1
N1= ((K1 - a12*K2)/(1 - a12*a21))
N2= ((K2 - a21*K1)/(1 - a21*a12))
for(t in 1:80){
  N1[t+1]= N1(t) + r1*N1(t)*(K1 - N1 - a12*N2)/K1
  N2[t+1]= N2(t) + r2*N2(t)*(K2 - N2 - a21*N1)/K2
}
## Error: could not find function "N1"

更正的代码:

N1= rep(0,80)
N2= rep(0,80)
a12= 0
a21= 0
K1= 1000
K2= 600
r1= 0.2
r2= 0.1
N1[1]= ((K1 - a12*K2)/(1 - a12*a21))
N2[1]= ((K2 - a21*K1)/(1 - a21*a12))
for(t in 1:80){
N1[t+1]= N1[t] + r1*N1[t]*(K1 - N1[t] - a12*N2[t])/K1
N2[t+1]= N2[t] + r2*N2[t]*(K2 - N2[t] - a21*N1[t])/K2
}
plot(1:81, N1, type="l", lwd=3, xlab="Time")
lines(1:81, N2, lwd=3, col='red')

当我运行我更改 a12 和 a21 值的地块时,它们看起来就像我预期的那样,因为它们模拟了两个物种之间的竞争力。

我正在运行的三个模型:

no competition-        a12=0     a21=0
stable coexistence-    a12=0.25  a21=0.1
competitive exclusion- a12=0.25  a21=0.75
4

2 回答 2

0

@e4e5f4 是正确的,因为您的主要问题是您使用的是(圆括号,而您需要[方括号。

但是,此外,您的for循环中有一个问题:

 # this is a problem, even with brackets corrected
 N1[t+1]= N1[t] + r1*N1[t]*(K1 - N1 - a12*N2)/K1
 N1[t+1]= N1[t] + r1*N1[t]*(K1 - N1 - a12*N2)/K1
                                 ^        ^
                          N1 & N2 are vectors

由于大多数数学运算R都是向量化的,因此分配的值(即等式的右侧)是一个向量,其长度在每次迭代时都在增长。


您看到的后续警告来自尝试将多个值(即向量)分配给向量的单个元素。

如果您尝试,您将看到相同的错误

 foo <- c(17, 23, 31)
 foo[3] <- 1:10

由于您正在迭代,您会收到 158 个此类警告。


您很可能想要索引这些值(可能使用N1[[t]]orN1[[t-1]]等​​)

于 2013-04-17T05:10:55.007 回答
0

替换N1(t)N1[t]。对 做同样的事情N2

注意:我认为您使用Matlab的数组索引语法与R语法不同。

于 2013-04-17T04:26:00.467 回答