Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/283.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python GEKKO:不响应约束,也不求解obj函数_Python_Optimization_Gekko - Fatal编程技术网

Python GEKKO:不响应约束,也不求解obj函数

Python GEKKO:不响应约束,也不求解obj函数,python,optimization,gekko,Python,Optimization,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

以下内容与此问题相关:

我试图用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()

结果如下所示:


我将感谢任何帮助:)

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

从gekko导入gekko
将numpy作为np导入
将matplotlib.pyplot作为plt导入
m=GEKKO(远程=True)
#初始化变量
#室温:
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]
#温度下限:
温度低=10*np.ones(24)
#温度上限:
温度上限=12*np.ones(24)
#每小时能源价格:
图乌夫=[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,10117)
#冰箱状况
ud=np.append(np.zero(78),np.one(39),0)
#10分钟的温度数据
y=[14.60000000000001,14.60000000000001,14.7000000000001,14.7000000000001,14.7000000000001,14.7000000000001\
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#输出系数
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(值=0,磅=0,磅=4,整数=True)
#创建ARX模型
m、 arx(p,T,u)
###########################################
#参数
P=m.Param(值=100)#功率
TL=m.Param(值=温度低[0])
TH=m.Param(值=温度上限[0])
c=m.Param(值=TOU_v[0])
u、 状态=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=0
eL.WSPHI=0
eL.WSPLO=100000
eL.STATUS=1
#线性误差(与极限的偏差)
m、 方程([eH==T-TH,eL==T-TL])
#目标:将成本降至最低。
m、 最小化(c*P*u)
#优化器选项。
#稳态初始化
m、 options.IMODE=1
m、 求解(disp=True)
TL.值=温度低
TH.值=温度上限
c、 值=TOU_v
T.value=11#温度从11开始
#建立MPC
m、 options.IMODE=Gekko中的6#MPC模式。
m、 options.NODES=2个搭配节点。
m、 options.SOLVER=1#混合整数线性规划的APOT解算器。
m、 时间=np.linspace(0,23,24)
#解决优化问题。
m、 解决()
m、 解决()
#计算成本。
c=0
成本清单=[]
对于范围(0,len(u))中的i:
c=c+TOU_v[i]*u[i]
成本清单。附加(c)
打印('每日能源成本为',c/100,'欧元')
plt.子地块(4,1,1)
plt.plt.plt.plot(m.time,temp_low,'k--',label='Lower limit')
plt.绘图(m.time,temp_upper,'k--',label='upper limit')
plt.绘图(m.时间,T.值,'r-')
plt.ylabel(“温度”)
plt.legend()
plt.子地块(4,1,2)
plt.step(m.time,u.value,'b:',label='u')
plt.ylabel(“冰箱状态”)
#plt.grid()
plt.legend()
plt.子地块(4,1,3)
plt.plot(m.time,eH.value,'k--',label='supper Tem