以下是与这个问题相关的内容:使用 Gekko 的 MPC 和 ARX 模型 https://stackoverflow.com/questions/63727310/mpc-with-arx-model-using-gekko/63731362#63731362..
我正在尝试用 15 分钟的数据来识别我的系统。我正在尝试在一天中每小时更新一次我的 MPC MV。这会影响我的控制器吗?
我运行了上一个问题中的更正代码,但它似乎没有维持约束或在一天中更改 MV。
from gekko import GEKKO
import numpy as np
import matplotlib.pyplot as plt
m = GEKKO(remote = True)
#initialize variables
#Room Temprature:
T_external = [23,23,23,23,23.5,23.5,23.4,23.5,23.9,23.7,\
23,23.9,23.9,23.4,23.9,24,23.6,23.7,23.8,\
23,23,23,23,23]
# Temprature Lower Limit:
temp_low = 10*np.ones(24)
# Temprature Upper Limit:
temp_upper = 12*np.ones(24)
#Hourly Energy prices:
TOU_v = [39.09,34.93,38.39,40.46,40.57,43.93,25,11,9,24,51.28,45.22,45.72,\
36,35.03,10,12,13,32.81,42.55,8,29.58,29.52,29.52]
###########################################
#System Identification:
#Time
t = np.linspace(0,10,117)
#State of the Fridge
ud = np.append(np.zeros(78) ,np.ones(39),0)
#Temprature Data for 10 min
y = [14.600000000000001,14.600000000000001,14.700000000000001,14.700000000000001,14.700000000000001,\
14.700000000000001,14.700000000000001,14.700000000000001,14.700000000000001,14.700000000000001,\
14.700000000000001,14.700000000000001,14.700000000000001,14.8,14.8,14.8,14.8,14.8,14.8,14.8,14.8,\
14.8,14.8,14.9,14.9,14.9,14.9,14.9,14.9,14.9,15,15,15,15,15,15,15,15,15,15,15,15,15.100000000000001,\
15.100000000000001,15.100000000000001,15.100000000000001,15.100000000000001,15.100000000000001,\
15.100000000000001,15.100000000000001,15.100000000000001,15.100000000000001,15.100000000000001,\
15.100000000000001,15.100000000000001,15.100000000000001,15.100000000000001,15.100000000000001,\
15.100000000000001,15.100000000000001,15.100000000000001,15.100000000000001,15.100000000000001,\
15.100000000000001,15.100000000000001,15.100000000000001,15.100000000000001,15.100000000000001,\
15.100000000000001,15.100000000000001,15.100000000000001,15.100000000000001,15.100000000000001,\
15.100000000000001,15.100000000000001,15.100000000000001,15.100000000000001,15.100000000000001,
15,15,15,15,15,15,15,15,15,15,14.9,14.9,14.9,14.9,14.8,14.9,14.8,14.8,14.8,14.8,14.8,14.8,\
14.8,14.700000000000001,14.8,14.700000000000001,14.700000000000001,14.700000000000001,\
14.700000000000001,14.700000000000001,14.700000000000001,14.700000000000001,\
14.700000000000001,14.600000000000001,14.600000000000001,14.600000000000001,\
14.600000000000001,14.600000000000001,14.60]
na = 1 # output coefficients
nb = 1 # input coefficients
print('Identification')
yp,p,K = m.sysid(t,ud,y,na,nb,objf=10000,scale=False,diaglevel=1)
#create control ARX model:
y = m.Array(m.CV,1)
uc = m.Array(m.MV,1)
m.arx(p,y,uc)
# rename CVs
T= y[0]
# rename MVs
u = uc[0]
###########################################
#Parameter
P = m.Param(value =100) #power
TL = m.Param(value=temp_low[0])
TH = m.Param(value=temp_upper[0])
c = m.Param(value=TOU_v[0])
# Manipilated variable:
u = m.MV(lb=0, ub=1, integer=True)
u.STATUS = 1 # allow optimizer to change the variable to attein the optimum.
# Controlled Variable (Affected with changes in the manipulated variable)
#T = m.CV()
# Soft constraints on temprature.
eH = m.CV(value=0)
eL = m.CV(value=0)
eH.SPHI=0 #Set point high for linear error model.
eH.WSPHI=100 #Objective function weight on upper set point for linear error model.
eH.WSPLO=0 # Objective function weight on lower set point for linear error model
eH.STATUS =1 # eH : Error is considered in the objective function.
eL.SPLO=0
eL.WSPHI=0
eL.WSPLO=100
eL.STATUS = 1
#Linear error (Deviation from the limits)
m.Equations([eH==T-TH,eL==T-TL])
#Objective: minimize costs.
m.Obj(c*P*u)
#Optimizer Options.
# steady state initialization
m.options.IMODE = 1
m.solve(disp=True)
TL.value = temp_low
TH.value = temp_upper
c.value = TOU_v
T.value = 11 # Temprature starts at 11
#Set Up MPC
m.options.IMODE = 6 # MPC mode in Gekko.
m.options.NODES = 2 # Collocation nodes.
m.options.SOLVER = 1 # APOT solver for mixed integer linear programming.
m.time = np.linspace(0,23,24)
#Solve the optimization problem.
m.solve()
#Calculate the costs.
c= 0
cost_list = []
for i in range(0,len(u)):
c = c + TOU_v[i]*u[i]
cost_list.append(c)
print('The daily energy cost is' ,c/100, 'Euro')
plt.subplot(5,1,1)
plt.plot(m.time,temp_low,'k--', label='Lower limit')
plt.plot(m.time,temp_upper,'k--',label='Upper limit')
plt.plot(m.time,T.value,'r-')
plt.ylabel('Temperature')
plt.legend()
plt.subplot(5,1,2)
plt.step(m.time,u.value,'b:')
plt.ylabel('Fridge State')
plt.legend()
plt.subplot(5,1,3)
plt.plot(m.time, eH.value, 'k--', label='Upper Tempratue Limit Error')
plt.plot(m.time, eL.value, 'b--', label='Lower Temprature Limit Error')
plt.ylabel('Cumulative Linar Error')
plt.legend()
plt.subplot(5,1,4)
plt.plot(m.time, cost_list, 'r-')
plt.ylabel('Costs in cent')
plt.show()
结果如下:
我将不胜感激任何形式的帮助:)