2017-05-27 9 views
-1

這樣做的原因代碼是找到它需要用於與2個行星(顆粒)的行星系統具有彼此之間的近距離接觸的時間。然而,我想解決這個問題的時間是一個有5個粒子的行星系統。這將打印在最後一行print(sim.t)我在這裏有一段代碼,它可以發現兩個粒子彼此之間有密切的接觸。 5粒子呢?

http://rebound.readthedocs.io/en/latest/examples.html這裏是關於使用REBOUND的一些文檔,您可以在這裏找到我所做的一些聲明的最佳解釋。

sim = setupSimulation() 
sim.exit_min_distance = 0.01 
Noutputs = 10000 
year = 2.*np.pi 
times = np.linspace(0.,10E+9.*year, Noutputs) 
distances = np.zeros(Noutputs) 
ps = sim.particles 
try: 
    for i,time in enumerate(times): 
     sim.integrate(time) 
     dp = ps[1] - ps[2] 
     distances[i] = np.sqrt(dp.x*dp.x+dp.y*dp.y+dp.z*dp.z) 
except rebound.Encounter as error: 
    print(error) 

print(sim.t) 

第2行定義了這兩個顆粒之間的親密接觸(達到該值時模擬將停止)。

線11取入顆粒的座標的差,如果< = 0.01,打印有一個近距離接觸。

我正沿着一個if-then語句的思路:

if ps[1] - ps[2] <= .01: 
    dp = ps[1] - ps[2] 
else ps[2] - ps[3] <= .01: 
    dp = ps[2] - ps[3] 

等等...

我想,以確保這個工程之前,我運行它僅僅是因爲模擬時間爲10e + 9年,只能在本地超級計算機上運行,​​以在合理的時間內獲得結果。

+0

你肯定不應該是'ps的[0]'?什麼是'sim'?什麼類型是'p'? – Eric

+0

'ps [0]'是顆粒1-5正在軌道運行的恆星。我正在使用稱爲反彈的N體積分器,其中'sim'就是模擬本身。你想看看被遺漏的代碼嗎?在此塊之前,我使用sim.add()六次來添加一個星形和五個旋轉物體。我不完全確定你最後一個問題的含義。 – dlsj

+0

如果沒有比您提供的更多信息,我們可能無法回答這個問題。首先,你真的需要描述你正在使用的模擬庫(一個鏈接到它的文檔將是一個好的開始)。如果不知道'sim'是什麼,我們就不可能知道你所顯示的代碼中發生了什麼。這也不是很清楚你要求什麼。當您使用5個粒子運行模擬器時,您期望什麼輸出(以及它與僅有兩個粒子有何不同)? – Blckknght

回答

0

我不明白爲什麼if語句的做法不會爲如果有兩個粒子得到足夠接近對方檢測工作。編輯:編寫這個例子就好像你的2個粒子的代碼樣本正在工作。

取決於如果你需要檢查不連續的顆粒,你需要生成每個組合,並檢查它(例如所示)。

看起來你還需要對距離的不同枚舉策略。如果索引不必與時間計數器匹配,則可以增加一個單獨的計數器(如示例所示)。

你也可以使用itertools生成if語句,以避免錯別字,增加清晰度:

import itertools 

# other setup code 

counter = 0 
try: 
    for time in times: 
     sim.integrate(time) 
     for p0, p1 in itertools.combinations(range(1, 6)): # generates combinations of the particles numbered 1 thru 5 
      dp = ps[p0] - ps[p1] 
      distances[counter] = np.sqrt(dp.x*dp.x+dp.y*dp.y+dp.z*dp.z) 
      counter += 1 
except rebound.Encounter as error: 
    print(error) 

我會多添一點 - 以確保您的代碼工作,你或許應該寫某種測試套件。如果解決與永不解決會發生什麼。

您可以創建一個對象來模擬sim及其方法,返回您知道將會或不會滿足您的退出條件的位置,而不需要超級計算機的所有開銷。你可以將它們硬編碼在一個小列表中。

+0

嘿,感謝這個例子,一旦我爲我當前的項目吐出數據,我應該在非順序粒子上工作,所以謝謝將來的幫助!但是,我不需要考慮簡單的硬代碼的時間嗎? – dlsj

+0

取決於您正在測試的內容。對於集成測試,您還可以設置您知道應該快速退出的初始條件(例如,在相反方向移動的同軌道粒子,共面軌道等),以便您可以在本地運行。 – whp

+0

你將如何定位5個行星中哪個行星遇到了近距離相遇? – dlsj