[英]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.