GEKKO:不响应约束也不解决obj函数

问题描述

以下与该问题有关:MPC with ARX Model Using Gekko

我正在尝试使用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.5,23.4,23.9,23.7,\
              23,24,23.6,23.8,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,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,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.8,\
    14.8,14.9,15,15.100000000000001,\
    15.100000000000001,\
    14.700000000000001,\
    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,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,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,label='Upper limit')
plt.plot(m.time,T.value,'r-')
plt.ylabel('Temperature')
plt.legend()
plt.subplot(5,2)
plt.step(m.time,u.value,'b:')
plt.ylabel('Fridge State')
plt.legend()
plt.subplot(5,3)
plt.plot(m.time,eH.value,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,4)
plt.plot(m.time,cost_list,'r-')
plt.ylabel('Costs in cent')

plt.show()

结果如下:

enter image description here

我将不胜感激:)

解决方法

在调用u = m.MV()模型之前,需要定义T=m.CV()m.arx(),以便将这些值用作输入和输出。我还增加了WSPHI值,以使成本目标不会导致温度限制被忽略。当前的制冷系统似乎不足以冷却到该水平。它需要一个功能强大约3倍的系统来维持温度极限。我将制冷系统的上限设置为4,以便它可以将温度保持在极限范围内。最后,它放弃了温度控制,因为它发现节能比在短时间内达到温度极限更有价值。您可以通过增加WSPHIWSPLO或以TH.UPPER = 0作为硬约束来强制执行限制。如果制冷系统不能满足该约束条件,那么严格的约束条件可能会导致不可行的解决方案。

Refrigeration Optimization

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.5,23.4,23.9,23.7,\
              23,24,23.6,23.8,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,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,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.8,\
    14.8,14.9,15,15.100000000000001,\
    15.100000000000001,\
    14.700000000000001,\
    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:

# Controlled variable:
T = m.CV()
# Manipulated variable:
u = m.MV(value=0,lb=0,ub=4,integer=True)
# Create ARX Model
m.arx(p,T,u)

###########################################

#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])

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=100000     #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=100000 
eL.STATUS = 1   
#Linear error (Deviation from the limits)
m.Equations([eH==T-TH,eL==T-TL])

#Objective: minimize costs.
m.Minimize(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,24)

#Solve the optimization problem.

m.solve()
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(4,1,1)
plt.plot(m.time,temp_low,'k--',label='Lower limit')
plt.plot(m.time,temp_upper,label='Upper limit')
plt.plot(m.time,T.value,'r-')
plt.ylabel('Temperature')
plt.legend()
plt.subplot(4,2)
plt.step(m.time,u.value,'b:',label='u')
plt.ylabel('Fridge State')
#plt.grid()
plt.legend()
plt.subplot(4,3)
plt.plot(m.time,eH.value,label='Upper Temperatue Limit Error')
plt.plot(m.time,eL.value,'b--',label='Lower Temperature Limit Error')
plt.ylabel('Cumulative Linear Error')
plt.legend()
plt.subplot(4,4)
plt.plot(m.time,cost_list,'r-')
plt.ylabel('Costs in cent')

plt.show()

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...