2015-09-07 126 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