我正在尝试创建一个模拟,我观察森林生长了200年。我的森林里有25棵树。目标是每棵树的生物量为1,然后每年保持活力,生物量增加600。如果它死了,它会恢复到0生物量。我现在遇到的问题是我的树木都互相模仿,它们没有单独生长。任何帮助表示赞赏。我在Windows 7上运行R版本3.2.1。
simulation_years = 200
num_trees_side1 = 5
num_trees_side2 = 5
npp=600
mortality=0.02
forest = array(0,dim=c(simulation_years,num_trees_side1,num_trees_side2))
forest[1,,] = 1
for(i in 2:simulation_years){
for(j in 1:num_trees_side1){
for(k in 1:num_trees_side2){
forest[i,,] = forest[i] + npp
rvar = runif(1,0,1)
if(rvar < mortality){
forest[i,,] = 0} }}}
答案 0 :(得分:0)
您的问题在这里forest[i,,]=0
- 只要有死亡事件,您就会将整个“方面”重置为0。这应该是forest[i,j,k] = 0
。
此外,您不需要所有这些for
循环。你的问题只是在一个维度上真正递归 - 时间 - 其他两个维度可以一次处理。这是我如何解决你的问题:
num_trees = num_trees_side1 * num_trees_side2
for(i in 2:simulation_years){
deaths=matrix(runif(num_trees)>mortality,
ncol=num_trees_side2)
forest[i,,] = deaths*(forest[i-1L,,]+
npp*(forest[i-1L,,]>0))
}
让我们通过一个simulation_years=2
的例子。
set.seed(10239) #so we both get the same random numbers
在我们运行上面的代码之后,我们可以通过查看deaths
:
> deaths
[,1] [,2] [,3] [,4] [,5]
[1,] TRUE TRUE TRUE TRUE TRUE
[2,] TRUE TRUE TRUE TRUE TRUE
[3,] TRUE TRUE TRUE TRUE TRUE
[4,] TRUE TRUE TRUE TRUE TRUE
[5,] FALSE TRUE TRUE FALSE TRUE
因此,[5,1]
和[5,4]
处的树木已经死亡。让我们通过查看forest[2,,]
:
> forest[2,,]
[,1] [,2] [,3] [,4] [,5]
[1,] 601 601 601 601 601
[2,] 601 601 601 601 601
[3,] 601 601 601 601 601
[4,] 601 601 601 601 601
[5,] 0 601 601 0 601
根据需要,[5,1]
和[5,4]
处的两棵树已经死亡;其余的都增加了600。