簡體   English   中英

向量化/並行化 GEKKO 方程

[英]Vectorising / Paralellising GEKKO equations

使用 Phython 的 GEKKO 庫並按照示例求解其原始論文中的波動方程,需要創建大量方程。

m.Equations([u[i].dt() == v[i]for i in range(npx)])
m.Equations([v[i].dt() == c**2*(u[mod(i+1,npx)]-2.0*u[mod(i,npx)]+u[mod(i-1,npx)])/dx**2 for i in arange(0,npx,1)])

(我已經通過mod將它減少到兩行,結合邊界條件並讓我從 0 運行到 99,但它基本上仍然與示例中的相同。)

它仍在使用for循環,即v[i]for i in range(npx)] 是否可以像使用 numpy arrays 一樣通過並行化/矢量化來避免這種情況,從而使代碼更具可讀性或模擬速度更快?

當然,對於這個問題,我的筆記本電腦上的計算只需要 <18s,但更大的問題可能會非常慢。

文檔中有關於 arrays 的內容,但我不明白,我不知道這是否是我正在尋找的。

我附加了一個 MWE,在這里使用上面的代碼。

如果您想提高速度,請嘗試使用m.options.IMODE=7的順序解決方案。 對於仿真,它通常比IMODE=4 (同時解)快得多。

from gekko import GEKKO
import numpy as np
import time
start = time.time()
pi = np.pi
#Initialise model
m = GEKKO(remote = False)
#Discretisations(time and space)
npt = 200; npx = 100
m.time = np.linspace(0, 1, npt)
xpos = np.linspace(0, 2*pi, npx)
dx = xpos[1]-xpos[0]
#Define Variables
c = m.Const(value = 10)
u = [m.Var(value = np.cos(xpos[i])) for i in range(npx)]
v = [m.Var(value = np.sin(2*xpos[i])) for i in range(npx)]
#Automatic discretisation in time and manual discretisation in space
m.Equations([u[i].dt() == v[i] for i in range(npx)])
m.Equations([v[i].dt() == c**2*(u[np.mod(i+1,npx)]-2.0*u[np.mod(i,npx)]\
                                 +u[np.mod(i-1,npx)])/dx**2 \
                          for i in np.arange(0,npx,1)])

#Set options
m.options.imode = 7
m.options.solver = 1
m.options.nodes = 3
m.solve(disp = False, GUI = False)
print('Solve Time: ' + str(m.options.SOLVETIME))
print('Total Time: ' + str(time.time()-start))

使用IMODE=4 ,設置問題需要更多時間,但解決問題需要更少時間。

Solve Time: 2.7666
Total Time: 25.547

使用IMODE=7 ,設置問題所需的時間更少,但解決問題的時間更多。

Solve Time: 8.2271
Total Time: 11.819

當您遇到更大的問題時, IMODE=7將比IMODE=4花費更少的時間進行仿真。 對於並行選項,您可以並行構建 model 但該 model 的解決方案除了IMODE=7之外沒有很多選項可以更快地解決問題。 您可以通過以下方式創建並行 Gekko 應用程序:

  • 在 IPOPT 中與 ma77、ma97 等一起使用並行線性求解器。 與我對大規模問題所做的一些測試相比,這通常只提高了 20-60% 的速度。 這些選項在公開分發的 IPOPT 版本中不可用,因為求解器需要許可證。 線性求解器 MUMPS 與 Gekko 一起分發,但不包括並行支持(盡管這可能會在以后推出)。 問題是求解器只是解決方案的一部分,即使求解器速度無限快,自動微分、客觀評估和方程評估仍然需要大約 50% 的 CPU 時間。

  • 獨立運行。 這通常被稱為“大規模並行”,因為可以將進程拆分為單獨的線程,然后在所有子進程完成后再次組合代碼。 這份關於多線程如何並行處理 Python Gekko 的說明材料? 展示如何並行計算。 您的問題不是針對多線程設置的,因為方程是一起求解的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM