我正在对 MPC 进行建模,以将建筑物的温度保持在给定的时间间隔内,同时最大限度地减少能耗。我正在使用 GEKKO 来建模我的算法。
我编写了以下代码。首先,我使用输入数据(干扰:外部温度和控制)和输出 y (温度)来确定我的模型。然后,我构建了一个 ARX 模型(使用 GEKKO 中的 arx 函数。这是我的代码:
# Import library
import numpy as np
import pandas as pd
import time
# Initialize Model
ts = 300
t = np.arange(0,len(data_1)*ts, ts)
u_id = data_1[['T_ext','beta']]
y_id = data_1[['T_int']]
# system identification
#meas : the time-series next step is predicted from prior measurements as in ARX
na=5; nb=5 # ARX coefficients
print('Identify model')
start = time.time()
yp,p,K = m.sysid(t,u_id,y_id,na,nb,objf=100,scale=False,diaglevel=0,pred='meas')
print('temps de prediction :'+str(time.time()-start)+'s')
#%% create control ARX model
T_externel = np.array([5.450257,5.448852,5.447447,5.446042,5.444637,5.443232,5.441826,5.440421,5.439016,
5.440421,5.437610,5.436205,5.434799,5.433394,5.431988,5.430583,5.429177,5.427771,
5.426365, 5.424959, 5.423553 ])
m = GEKKO(remote=False)
m.y = m.Array(m.CV,1)
m.u = m.Array(m.MV,2)
m.arx(p,m.y,m.u)
# rename CVs
m.T = m.y[0]
# rename MVs
m.beta = m.u[1]
# distrubance
m.d = m.u[0]
# distrubance and parametres
m.d = m.Param(T_externel)
# lower,heigh bound for MV
TL = m.Param(values = 16)
TH = m.Param(values = 18)
# steady state initialization
m.options.IMODE = 1
m.solve(disp=False)
# set up MPC
m.options.IMODE = 6 # MPC
m.options.CV_TYPE = 2 # the objective is an l2-norm (squared error)
m.options.NODES = 2 # Collocation nodes
m.options.SOLVER = 1 # APOPT
m.time = np.arange(0,len(T_externel)*300,300) # step time = 300s
# Manipulated variables
m.beta.STATUS = 1 # calculated by the optimizer
m.beta.FSTATUS = 1 # use measured value
m.beta.DMAX = 1.0 # Delta MV maximum step per horizon interval
m.beta.DCOST = 2.0 # Delta cost penalty for MV movement
m.beta.UPPER = 1.0 # Lower bound
m.beta.LOWER = 0.0
m.beta.MEAS = 0 # set u=0
# Controlled variables
m.T.STATUS = 1 # drive to set point
m.T.FSTATUS = 1 # receive measurement
m.T.options.CV_TYPE=2 # the objective is an l2-norm (squared error)
m.T.SP = 17 # set point
TL.values = np.ones(len(T_externel))*16
TH.values = np.ones(len(T_externel))*18
m.T.value = 17 # Temprature starts at 17
for i in range(len(T_externel)):
m.d = T_externel[i]
m.solve(disp = False)
if m.options.APPSTATUS == 1:
# Retrieve new values
beta = m.beta.NEWVAL
else:
# Solution failed
beta = 0.0
我收到以下错误:
File c:\algoritmempc\gekko_mpc.py:84
m.arx(p,m.y,m.u)
ValueError: operands could not be broadcast together with shapes (2,) (0,)
我还有另一个问题。由于我的输入之一是干扰,所以我不确定我声明变量的方式是否正确(我想自己提供干扰)。
错误信息表明正在尝试对具有不兼容形状的数组执行操作。具体而言,似乎在尝试将形状为
(2,)
的数组与形状为
(0,)
的数组一起使用。这表明其中一个数组为空,在尝试执行类似广播或逐元素运算的操作时,这会导致问题。
以下是的代码中可能出现此错误的一些可能原因:
-
m.sysid()
返回的p
的形状不正确。 这可能是由于提供的输入数据 (t
、u_id
和y_id
) 或选择的na
和nb
的值造成的。请确保的输入数据形状正确,并且为模型选择了适当的阶数。可能希望尝试使用不同的阶数值或不同的系统识别方法。 -
m.u
的初始化不正确。 正在使用m.Array(m.MV, 2)
创建m.u
,但这可能会创建不兼容的形状。尝试使用更明确的初始化,例如m.u = [m.MV(value=0), m.MV(value=0)]
。 -
GEKKO 版本不兼容。
较旧版本的 GEKKO 在处理
arx
函数和多输入系统方面存在一些问题。请确保使用的是最新版本的 GEKKO。可以使用pip install --upgrade gekko
进行更新。
对于的第二个问题,似乎正在以正确的方式声明干扰。通过将
m.d
定义为
m.Param
并为其分配外部温度值,可以在预测控制问题中将其作为已知的外部干扰。
以下是关于如何修复代码的建议:
-
检查
p
的形状。 在调用m.sysid()
后,打印p
的形状并确保它与的预期相符。如果它为空或具有意外的形状,则需要调查系统识别步骤。 -
修改
m.u
的初始化。 如上所述,尝试使用更明确的初始化来确保m.u
具有正确的形状。 - 更新 GEKKO。 确保使用的是最新版本的 GEKKO。
如果在尝试这些建议后仍然遇到问题,请提供以下信息的更多上下文:
-
data_1
数据框的结构和内容。 -
p
、m.y
和m.u
的形状,在调用m.arx()
之前。 - 正在使用的 GEKKO 版本。
借助这些信息,我可以为提供更具体的帮助来解决的问题。
标签:python,gekko,mpc From: 78766494