[英]How to solve integral in Python Gekko?
如何在 Python Gekko 中的優化 model 中包含變量x
的積分? 我發現m.vsum(x)
是時間范圍內的總和,但不考慮可變時間步長。 變量x.dt()
的導數是 Gekko 內置的,但是積分呢?
from gekko import GEKKO
import numpy as np
m = GEKKO()
m.time = np.linspace(0,2,5)
m.options.IMODE=4; m.options.NODES=3
x = m.Var(5)
m.Equation(x.dt()==-x)
#y = m.Var(0)
#m.Equation(y=m.integral(x))
m.options.SOLVER=1
m.solve()
print(x.value)
結果
[5.0, 3.0434782609, 1.8525519849, 1.1276403386, 0.68638977133]
Gekko 求解微分方程和代數方程。 您可以通過定義一個導數等於x
的新變量y
來包含積分。
from gekko import GEKKO
import numpy as np
m = GEKKO()
m.time = np.linspace(0,2,5)
m.options.IMODE=4; m.options.NODES=6
x = m.Var(5)
m.Equation(x.dt()==-x)
y = m.Var(0)
m.Equation(y.dt()==x)
m.solve()
print(np.round(y.value,5))
結果為[0., 1.96735, 3.1606, 3.88435, 4.32332]
,即x
在時間點 [0, 0.5, 1.0, 1.5, 2.0] 的積分。 y
的初始條件為零,但它可以是非零的,例如使用比例積分導數 (PID) controller,其中積分項可以在每個周期累積。
在 Gekko v0.2.6( pip install gekko --upgrade
)中,將有一個新的integral
function (感謝您的問題)。 您的注釋行是正確的,但不要忘記方程式表達式中的雙等號。
m.Equation(y==m.integral(x))
這是數值解和精確解的比較。
from gekko import GEKKO
import numpy as np
m = GEKKO()
m.time = np.linspace(0,2,5)
m.options.IMODE=4; m.options.NODES=6
x = m.Var(5)
m.Equation(x.dt()==-x)
y = m.Var(0)
m.Equation(y==m.integral(x))
z = m.Var(0)
m.Equation(z.dt()==x)
m.options.SOLVER=1
m.solve()
# results
print('Numerical x')
print(np.round(x.value,6))
print('Exact x')
print(np.round(5*np.exp(-m.time),6))
print('Numerical Integral y')
print(np.round(y.value,6))
print('Numerical Integral z End Point')
print(np.round(z.value[-1],6))
print('Exact Integral')
print(np.round(-5*(np.exp(-2)-np.exp(0)),6))
結果有 1e-6 的差異,因為它們是僅在請求的時間點計算的數值解。 解決方案在增加時間點時會更准確,但解決方案會更慢(尤其是對於大問題)。
Numerical x
[5. 3.032654 1.839398 1.115651 0.676677]
Exact x
[5. 3.032653 1.839397 1.115651 0.676676]
Numerical Integral y
[0. 1.967346 3.160602 3.884349 4.323323]
Numerical Integral z End Point
4.323323
Exact Integral
4.323324
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.