GEKKO:不响应约束也不解决 obj 函数 [英] GEKKO: Does not respond to constraints nor solves the obj function

查看:51
本文介绍了GEKKO:不响应约束也不解决 obj 函数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

以下与此问题相关:

我将不胜感激:)

解决方案

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

from gekko import GEKKO将 numpy 导入为 np导入 matplotlib.pyplot 作为 pltm = GEKKO(远程 = 真)#初始化变量#房间温度: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]# 温度下限:temp_low = 10*np.ones(24)# 温度上限:temp_upper = 12*np.ones(24)#Hourly 能源价格: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]##########################################系统识别:#时间t = np.linspace(0,10,117)#冰箱状态ud = np.append(np.zeros(78) ,np.ones(39),0)#温度数据 10 分钟y = [14.600000000000001,14.600000000000001,14.700000000000001,14.700000000000001,14.70000000000001,14.7000000000000114.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.814.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.1000000000000015.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 # 输出系数nb = 1 # 输入系数打印('身份')yp,p,K = m.sysid(t,ud,y,na,nb,objf=10000,scale=False,diaglevel=1)#创建控制ARX模型:# 控制变量:T = m.CV()# 操作变量:u = m.MV(value=0,lb=0, ub=4, integer=True)# 创建 ARX 模型m.arx(p,T,u)##########################################范围P = m.Param(value =100) #powerTL = m.Param(值=temp_low[0])TH = m.Param(value=temp_upper[0])c = m.Param(value=TOU_v[0])u.STATUS = 1 # 允许优化器改变变量以达到最优.# 受控变量(受受控变量变化的影响)#T = m.CV()# 对温度的软约束.eH = m.CV(值=0)eL = m.CV(值=0)eH.SPHI=0 #线性误差模型的设置点高.eH.WSPHI=100000 #线性误差模型上限设定点的目标函数权重.eH.WSPLO=0 # 线性误差模型下设定点的目标函数权重eH.STATUS =1 # eH : 在目标函数中考虑了误差.eL.SPLO=0eL.WSPHI=0eL.WSPLO=100000eL.STATUS = 1#线性误差(偏离极限)m.Equations([eH==T-TH,eL==T-TL])#目标:最小化成本.m.Minimize(c*P*u)#优化器选项.# 稳态初始化m.options.IMODE = 1m.solve(disp=True)TL.value = temp_lowTH.value = temp_upperc.value = TOU_vT.value = 11 # 温度从 11 开始#设置MPCm.options.IMODE = 6 # Gekko 中的 MPC 模式.m.options.NODES = 2 # 搭配节点.m.options.SOLVER = 1 # APOT 混合整数线性规划求解器.m.time = np.linspace(0,23,24)#解决优化问题.m.solve()m.solve()#计算成本.c = 0成本清单 = []对于范围内的 i (0,len(u)):c = c + TOU_v[i]*u[i]cost_list.append(c)print('每日能源成本为',c/100, '欧元')plt.subplot(4,1,1)plt.plot(m.time,temp_low,'k--', label='下限')plt.plot(m.time,temp_upper,'k--',label='上限')plt.plot(m.time,T.value,'r-')plt.ylabel('温度')plt.legend()plt.subplot(4,1,2)plt.step(m.time,u.value,'b:',label='u')plt.ylabel('冰箱状态')#plt.grid()plt.legend()plt.subplot(4,1,3)plt.plot(m.time, eH.value, 'k--', label='Upper Temperatue L​​imit Error')plt.plot(m.time, eL.value, 'b--', label='温度下限误差')plt.ylabel('累积线性误差')plt.legend()plt.subplot(4,1,4)plt.plot(m.time, cost_list, 'r-')plt.ylabel('成本分')plt.show()

The following is related to this question :MPC with ARX Model Using Gekko.

I am trying to identify my system with data of 15 minutes. And I Am trying to update my MPC MV every hour during one day. Does this affect my controller?

I run the corrected code from my previous question but it does not seem to maintain the constraints or to change the MV over the day.

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()

The results look like this :

I will appreciate any kind of help :)

解决方案

You need to define u = m.MV() and T=m.CV() before calling the m.arx() model so that these values will be used as inputs and outputs. I also increased the WSPHI value so that the cost objective does not cause the temperature limit to be ignored. The current refrigeration system appears to be insufficient to cool to this level. It needs a system that is about 3 times more powerful to maintain the temperature limit. I set the upper bound to the refrigeration system to be 4 so that it could maintain the temperature in the limits. It gives up on temperature control at the end because it finds that the energy savings is more valuable than meeting the temperature limit so a small period of time. You can enforce the limit by either increasing WSPHI and WSPLO or else with TH.UPPER = 0 as a hard constraint. The hard constraint may lead to an infeasible solution if the refrigeration system can't meet that constraint.

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:

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

plt.show()

这篇关于GEKKO:不响应约束也不解决 obj 函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆