2015-09-07 65 views
1

我正在尝试创建一个模拟场景,我在这里观看森林生长200年。我的森林里有25棵树。目标是每棵树的生物量为1,然后每年保持活力,每年生物量达到600。如果它死了,它会回复到0生物量。我现在遇到的问题是,我的树木都模仿对方,它们不是单独生长。任何帮助表示赞赏。我在Windows 7如何获得此嵌套for循环以正确工作?

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

运行v 3.2.1版本你的问题在这里forest[i,,]=0 - 您重置整个“面”为0,每当有一个死亡事件。这应该是forest[i,j,k] = 0

此外,您并不需要所有这些for循环。您的问题只能在一个维度上真正递归 - 时间 - 另外两个维度可以一次处理。以下是我愿意做你的问题:通过与simulation_years=2为例

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)) 
} 

让我们的工作。

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.

+0

非常感谢。我可能没有说得很清楚的唯一的其他事情是,如果一棵树没有死亡,那么到了第三年,它应该增长到1201,然后是1801等。 –

+0

@pop_pop_pop是的,这是通过我的方法处理的。一旦最后一件事 - 一旦一棵树死了,它永远是死的,对吗?如果是这样,请参阅我的编辑,否则原始版本是正确的。 – MichaelChirico