2012-05-16 72 views
2

這個問題是關於scipy.integrate模塊中的odeint函數的。提高odeint的速度:重力積分

我正在模擬基於以下原理的相互作用星系:我讓兩個原子核在開普勒軌道上移動,然後我把星系中的每顆星都沒有質量。

我在1個星系的參考系中工作,所以我使用兩個經典的牛頓重力+1離心力。

所有這些都與odeint(scipy.integrate模塊)集成在一起,這很好用。我的速度有問題odeint正在整合我的星星壽星: 每個恆星需要大約10-15秒才能整合大約100個時間步(約10億年),但這等於幾個小時來整合總計1000顆星。據我的教授說,HIS程序運行大約5分鐘,做這些星星。我甚至不知道如何提高這個速度,因爲我無法改變方程式,而odeint真的佔用了99%的運行時間。

那麼長久以來的故事,我如何才能提高我的odeint計算時間?

感謝

+0

你不妨看看另一件事情是實際力評價。整合僅爲O(N),但典型實現中的力評估爲O(N^2)。 'odeint'必須在某個時候稱你的部隊評估,這將是非常昂貴的。 –

回答

2

odeint是一個很好的通用積分的頌歌,但可能無法使用最好的方法爲您的問題因某種原因被。您可以嘗試使用ode1,因爲您可以通過更改它使用的集成器來更多地控制它。如果問題不嚴重,那麼使用Runge-Kutta(4)5方法(使用ode的dopri5)通常是合理的,如果問題很嚴重,那麼BDF方法通常是一個不錯的選擇。由於我沒有模擬你描述的問題類型,我不知道你的問題是否僵硬,我建議你先嚐試dopri5,然後再嘗試BDF方法。

您的代碼中也可能存在一個問題,導致右側的評估效率不合理,因此您可能會嘗試在那裏執行一些工作來加快執行速度。 ode的另一個優點是您可以爲其提供一個函數,該函數可以提供精確的雅可比行列式,這可以顯着提高速度,因爲不使用近似值。

參考:Scipy docs on ode

+0

謝謝!要儘快嘗試。 – user1399681