You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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输出及最优控制结果图:
Gekko输出及最优控制结果

内容的提问来源于stack exchange,提问作者m_nacereddine

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 18:24:49