Gekko求解器无法适配系统变化?房间温度MPC控制异常问询
MPC控制房间温度无响应问题排查
我按照John教授的指导,采用MPC算法将房间温度维持在16-18℃区间。系统增益为K=array([[0.93705481,−12.24012156]]),即β每增加1,房间温度T会降低12.24℃;外部温度Text每增加1,T会升高0.937℃。
我实现了单日正弦变化的外部温度曲线,将控制量设置为0-1的连续取值范围(设备支持该范围),并通过m.bint.MV_STEP_HOR=1配置确保每次迭代都更新控制量,但实际运行中控制量始终无响应——外部温度升降时,控制量保持不变。
以下是我运行的修正后代码:
# Import library import numpy as np import pandas as pd import time from gekko import GEKKO from numpy import array import matplotlib.pyplot as plt # 补充原代码缺失的导入 total_minutes_in_day = 24 * 60 interval = 5 # minutes num_points = total_minutes_in_day // interval # 生成时间点 time_points = np.linspace(0, total_minutes_in_day, num_points) temperature = 8.5 + 11.5 * np.sin((2 * np.pi / total_minutes_in_day) * time_points - (np.pi / 2)) temperature = np.clip(temperature, -3, 20) plt.plot(time_points, temperature) plt.xlabel('时间(分钟)') plt.ylabel('温度(°C)') plt.title('单日外部温度变化曲线') plt.savefig('Tex pour une jrn') plt.grid(True) plt.show() K = array([[ 0.93705481, -12.24012156]]) p = {'a': array([[ 1.08945247], [-0.00242145], [-0.00245978], [-0.00272713], [-0.00295845], [-0.00319119], [-0.00343511], [-0.00366243], [-0.00394247], [-0.06665054]]), 'b': array([[[-0.05160235, -0.01039767], [ 0.00173511, -0.01552485], [ 0.00174602, -0.01179519], [ 0.00180031, -0.01052658], [ 0.00186416, -0.00822121], [ 0.00193947, -0.00570905], [ 0.00202877, -0.00344507], [ 0.00211395, -0.00146947], [ 0.00223514, 0.00021945], [ 0.03800987, 0.04243736]]]), 'c': array([0.0265903])} # 使用全部外部温度数据 T_externel = temperature 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) # 重命名被控变量 m.T = m.y[0] # 重命名操纵变量 m.beta = m.u[1] m.free(m.beta) m.bint = m.MV(0,lb=0,ub=1) m.Equation(m.beta==m.bint) # 扰动变量 m.d = m.u[0] # 设置扰动与参数 m.d = m.Param(T_externel[0]) m.bias = m.Param(0) m.Tb = m.CV() m.Equation(m.Tb==m.T+m.bias) # 稳态初始化 m.options.IMODE = 1 m.solve(disp=False) # 配置MPC模式 m.d.value = T_externel m.options.IMODE = 6 # MPC模式 m.options.CV_TYPE = 1 # 目标为L1范数(区域控制) m.options.NODES = 2 # 配点节点数 m.options.SOLVER = 3 # 使用IPOPT求解器 m.time = np.arange(0,len(T_externel)*300,300) # 步长300秒 # 操纵变量配置 m.bint.STATUS = 1 # 由优化器计算 m.bint.FSTATUS = 0 # 不使用测量值 m.bint.DCOST = 0.0 # 操纵变量变化的惩罚系数 m.bint.UPPER = 1.0 # 上限 m.bint.LOWER = 0.0 # 下限 m.bint.MV_STEP_HOR = 1 # 每个时间步更新控制量 m.bint.value = 0 # 被控变量配置 m.Tb.STATUS = 1 # 追踪设定区间 m.Tb.FSTATUS = 0 # 不接收测量值 m.Tb.SPHI = 18 # 设定区间上限 m.Tb.SPLO = 16 # 设定区间下限 m.Tb.WSPHI = 100 # 上限优先级 m.Tb.WSPLO = 100 # 下限优先级 T_MEAS = 20 # 初始温度设为20℃ m.Tb.value = T_MEAS m.bias.value = T_MEAS - m.T.value[0] m.options.SOLVER = 1 m.solve(disp=False) if m.options.APPSTATUS == 1: # 获取新的控制量 beta = m.beta.NEWVAL else: # 求解失败时默认控制量为0 beta = 0.0
附Gekko输出及最优控制结果图:
内容的提问来源于stack exchange,提问作者m_nacereddine
相关产品推荐
相关产品推荐

