簡體   English   中英

如何解決 Python Gekko 中的積分?

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

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