GEKKO构建建筑温度MPC报错及扰动变量声明问题咨询
问题1:ARX模型调用报错解决
报错原因分析
ValueError: operands could not be broadcast together with shapes (2,) (0,) 本质是参数维度不匹配,常见触发场景:
- 操纵变量
m.u未正确定义为GEKKO变量(比如仅声明但未初始化,或误作为普通Python变量),导致其形状为空数组(0,),与ARX参数的(2,)形状无法匹配。 - ARX阶数参数
p的格式错误:GEKKO中arx函数有两种调用方式,若传入阶数列表[na, nb, nk](na=输出自回归阶数,nb=输入移动平均阶数,nk=输入延迟),需要同时提供历史输入输出数据用于辨识;若传入已辨识的参数向量theta,则需确保向量长度与模型阶数对应。
正确调用方式
假设你已通过系统辨识得到ARX参数(比如模型为 y(t) = a1*y(t-1) + a2*y(t-2) + b1*u(t-1),参数向量theta = [a1, a2, b1]),正确代码示例:
from gekko import GEKKO import numpy as np m = GEKKO(remote=False) m.time = np.linspace(0, 23, 24) # 24小时时间步 # 定义变量:室内温度(CV)、空调能耗(MV) y = m.CV(value=22) # 初始温度22℃ u = m.MV(value=0, lb=0, ub=100) # 能耗范围0-100% # 已辨识的ARX参数 theta = [0.95, 0.03, 0.02] # a1=0.95, a2=0.03, b1=0.02 # 构建ARX模型 m.arx(theta, y, u)
如果是用历史数据做在线辨识,需传入阶数列表+历史数据:
# 假设y_data、u_data是系统辨识用的历史输入输出序列 p = [2, 1, 1] # na=2, nb=1, nk=1 theta_identified = m.arx(p, y_data, u_data)
问题2:外部温度扰动的正确声明与使用
外部温度属于已知扰动变量(你需提前准备时间序列数据),需用GEKKO的Param类型声明,若扰动会影响建筑温度模型,需将其纳入ARX模型(扩展为ARMAX或多输入ARX)。
步骤1:声明扰动变量
# 准备24小时外部温度数据(示例为随机生成,替换为你的实际数据) outside_temp = np.random.randint(10, 35, size=24) T_out = m.Param(value=outside_temp)
步骤2:纳入ARX模型
若辨识时已将外部温度作为额外输入,参数向量需包含扰动项的系数。比如模型为:T_room(t) = a1*T_room(t-1) + b1*u(t-1) + c1*T_out(t-1)
参数向量theta = [a1, b1, c1],调用arx时传入多输入列表:
m.arx(theta, y, [u, T_out])
完整MPC配置示例
from gekko import GEKKO import numpy as np m = GEKKO(remote=False) m.time = np.linspace(0, 23, 24) # 变量定义 T_room = m.CV(value=22) # 受控变量:室内温度 u = m.MV(value=0, lb=0, ub=100) # 操纵变量:空调能耗 T_out = m.Param(value=np.random.randint(10, 35, 24)) # 扰动:外部温度 # 辨识得到的含扰动ARX参数 theta = [0.92, 0.04, 0.08] # a1=0.92, b1=0.04, c1=0.08 # 构建模型 m.arx(theta, T_room, [u, T_out]) # MPC控制目标设置 T_room.STATUS = 1 T_room.SPHI = 24 # 温度上限 T_room.SPLO = 20 # 温度下限 u.STATUS = 1 u.DCOST = 0.1 # 能耗惩罚权重,越大越偏向节能 # 求解MPC m.options.IMODE = 6 # 设置为MPC模式 m.solve(disp=True)
内容的提问来源于stack exchange,提问作者m_nacereddine
相关产品推荐
相关产品推荐

