簡體   English   中英

在 Gekko Optimizer 中使用 cspline 插值

[英]Using a cspline interpolation in Gekko Optimizer

我正在嘗試在我的 gekko model 中使用 cspine 插值。 在這個問題中,有一個發電廠、一個蒸汽輪機和一個電網。 根據用於滿足電網的容量,渦輪機將具有不同的效率。 我嘗試實現一個 gekko cspline,然后調用 model 來根據功率產生每個時間點的效率。 我無法讓它工作。 這在 Gekko 中可能嗎?

from gekko import GEKKO
import numpy as np
import matplotlib.pyplot as plt

# Grid demand
t = np.linspace(0, 24, 24)
e_grid = 2.5*np.sin(t/24*(2*np.pi)) + 5

# Turbine Efficiency curve based on turbine capacity
pcap = np.linspace(.1, 1, 10)  # %capacity
cap = 10*pcap
turb_eff = .75*np.sin(cap/11*np.pi)

# build model
m = GEKKO(remote=True)
m.time = t

Econs = m.Param(e_grid)
Egen = m.MV(value=5, lb=0, ub=10)  # steam production

x = m.Param(value=cap)
y = m.Var()
Turb_spline = m.cspline(x, y, cap, turb_eff)

turb_out = m.Intermediate(Egen*Turb_spline)
m.Equation(Econs == turb_out)
m.Obj(Egen)

m.options.IMODE = 5
m.options.SOLVER = 3
m.solve()

plt.plot(t, Egen.value, label='gen')
plt.plot(t, Econs.value, label='cons')
plt.xlabel('time')
plt.ylabel('Energy')
plt.legend()

我能夠使用np.polyfit工作。 然后,我能夠在我的 gekko model 中添加多項式並運行它以正確調整效率。 我使用以下代碼而不是 cspline。

Ecap = m.Intermediate(Egen/cap)
m.Equation(turb_eff == p[0]*Ecap**5 + p[1]*Ecap**4 + p[2]*Ecap**3 + p[3]*Ecap**2 + p[4]*Ecap + p[5])
turb_out = m.Intermediate(Egen*turb_eff)
m.Equation(turb_out == Econs)

我仍然想知道如何使用 cspline,以便我可以擬合多項式無法捕獲的更復雜的模型。

如果我正確理解了這個問題,我會像下面這樣編寫Objective function。

在此處輸入圖像描述

請看代碼。 這仍然非常粗糙,因此您可能需要對其進行修改,但我希望您能有所了解。
m.cspline function 的m.cspline不能保存到其他變量。 您可以根據需要調用 x 或 y 變量。
變量之間的時間 arrays 在您的代碼中不匹配。

from gekko import GEKKO
import numpy as np
import matplotlib.pyplot as plt

# Grid demand
t = np.linspace(0, 50, 50)
e_grid = 2.5*np.sin(t/24*(2*np.pi)) + 5

# Turbine Efficiency curve based on turbine capacity
pcap = np.linspace(.1, 1, 10)  # %capacity
cap = 10*pcap
turb_eff = 0.75*np.sin(cap/11*np.pi)

# build model
m = GEKKO(remote=False)
m.time = t

Econs = m.Param(e_grid)
Egen = m.MV(value=5, lb=0, ub=20)  # steam production
Egen.STATUS = 1

x = m.Var()
y = m.Var()
m.Equation(x==Egen)
m.cspline(x, y, cap, turb_eff, bound_x=True)

w1 = 10
w2 = 0
w3 = 0

turb_out = m.Var()
m.Equation(turb_out == Egen*y)
m.Obj(w1*(turb_out - Econs)**2 + w2*Egen**2)

m.options.IMODE = 6
m.solve()

print(np.max(Egen.value))

plt.figure(0)
plt.plot(cap,turb_eff, 'b.', label='data')
plt.plot(x.value[1:], y.value[1:], 'ro', label='Interpolate')
plt.xlabel('x')
plt.ylabel('y')
plt.legend()

plt.figure(1)
plt.subplot(2,1,1)
plt.plot(t[1:], turb_out[1:], label='Turb_out')
plt.plot(t[1:], Egen[1:], label='Egen')
plt.plot(t[1:], Econs[1:],'r--', label='Econs')
plt.xlabel('time')
plt.ylabel('Energy')
plt.legend()

plt.subplot(2,1,2)
plt.plot(t[1:], y[1:], label='Turb_eff')
plt.legend()

在此處輸入圖像描述 在此處輸入圖像描述

暫無
暫無

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

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