☰
基于LSTM预测控制的GSHP地源热泵节能方案与MATLAB实现
2026/10/24 4:27:19 网站建设 项目流程

去年夏天我接了一个挺挠头的活:一栋办公楼的地源热泵(GSHP)系统刚换了变频主机,电费反而比前年还高,下午顶层房间的温度还会“惯性”地往上冲。一开始大家都怪设备不行,后来我把历史运行数据拉出来一查,才发现问题根本不在机组,而在控制策略——它永远在“看后视镜开车”,温度越限了才动作。等建筑热惯量把温度推上去再启动主机,早就晚了。这让我下决心把手里的深度学习工具用起来,用LSTM做一套能“向前看”的温控预测控制方案,整套流程在MATLAB里跑通了,从数据构造到网络训练再到MPC滚动优化,今天把这套东西从头到尾拆一遍。

这套方案适合三类人:手上有地源热泵或中央空调历史数据、想让温控更节能的暖通工程师;正在做深度学习和控制交叉方向的学生;以及想知道“LSTM预测出来到底怎么用”而不是停在论文里的算法从业者。文章里所有实现思路都来自我实际调试过的原型项目,代码片段和参数可以直接参考迁移。

1. 传统温控策略在GSHP系统上的两个结构性短板

先说清楚为什么要引入预测。很多人一听“深度学习控温”就觉得是在赶时髦,但GSHP系统本身有两个特点是传统PID和规则控制很难绕开的,理解这两个短板,才能明白LSTM在里面到底扮演什么角色。

1.1 建筑热惯性让反馈控制永远“慢半拍”

建筑不是一杯水,它是一个巨大的蓄热体。混凝土楼板、墙体、家具甚至隔断都在不断吸收和释放热量,这就导致整个系统的响应时间很长,长到以小时计。传统反馈控制的工作方式是“检测偏差再纠正”,比如室内温度超过26℃就启动主机,等到控制信号传达到末端设备时,热量早已经在墙体里蓄了许久。

我调试时做过一个对比:同一个房间,下午两点太阳辐射最强,如果两点才开机,室内温度会在下午四点半左右继续往上走一段,因为早上积蓄在围护结构里的热量还在往外释放。这就是典型的“热惯性超调”。反馈控制在时间上永远慢半拍,它只能等问题暴露出来再弥补,而预测控制可以在问题没发生之前就提前调整出力。

这也是为什么很多老旧温控系统会有“一台主机频繁启停”的毛病——控制逻辑不是根据未来的负荷需求走的,而是根据当前温度拼命追,追过头了再停掉,停了之后惯性又把温度推上来,于是又启动。整个循环既费电又伤机组。

1.2 地源侧热平衡被忽视,运行效率逐年下滑

GSHP和普通冷水机组最大的区别在地下。冬季从土壤取热,夏季往土壤排热,如果一年里取排热量接近,土壤温度基本稳定,系统能保持较高的能效。但如果某个方向长期失衡,地下温度会逐年漂移,机组的冷凝温度或蒸发温度随之恶化,COP越来越低。

我见过一个最典型的案例:某栋楼夏季白天集中供冷,夜间关主机让土壤“自然恢复”,但夏季向土壤排入的热量远大于冬季取出的热量,投运四年后测得地源侧平均温度比初始高了近3℃。温度每高1℃,机组能效比就掉一截,这还是表面上温控一切正常的代价。传统控制策略根本不会考虑地温平衡,因为它只盯着室内温度这一个目标。

所以要为GSHP系统做预测控制,目标不能只看“室温合不合格”,还要考虑未来一段时间负荷怎么变、土壤热平衡影响有多大。这里就需要一个能够从历史数据中学习动态规律、并预测未来走势的模型,LSTM正是干这个的。

2. LSTM在温控系统里到底“预测”什么:三种建模目标的选择逻辑

很多人一听到“LSTM预测控制”就觉得是让LSTM直接输出阀门开度或主机启停状态,这是对预测控制的常见误解。LSTM在系统里的“站位”很重要,它预测的对象不同,后续控制算法的复杂度和可落地性完全不同。我在项目里试过三种目标,各有取舍。

2.1 预测室内温度:直观但容易被“惯性假象”欺骗

第一种做法是让LSTM预测未来N步的室内温度,比如用过去6小时的气象、室内温度和运行状态,直接输出未来4小时的温度曲线。这样做的优点是直观,控制目标就是温度本身,模型输出可以直接和舒适度约束比对。

但我实际做下来发现一个隐蔽的坑:室内温度具有很强的“自相关性”,下一时刻的温度和上一时刻差不了零点几摄氏度。模型很容易走捷径,学到“把上一刻的温度搬过来当预测”,测试集上的RMSE只有0.3℃左右,看起来很惊艳,其实根本没学到建筑动态特性。一旦遇到太阳辐射突增、人员密集度变化这类扰动,预测误差瞬间放大。把这样的模型接进控制器,等于给控制回路装了一个不太灵敏的温度计,没什么预测价值。

2.2 预测建筑冷热负荷:与预测控制最匹配

第二种做法是预测未来时段的冷负荷或热负荷。负荷序列比室内温度变化幅度大得多,也包含更丰富的动态信息。比如下午太阳晒进来了,负荷曲线会明显抬升;夜间进入低谷,负荷跌下来。LSTM要学的是“气象+运行状态→未来用能需求”的映射,学出来的结果不会退化成惯性复制。

从控制器角度讲,预测负荷也最方便:在主机制冷能力范围内,未来负荷太大就提前加大出力,负荷低就让机组低载运行或停机,这本质上是一个资源调度问题。我在原型项目里最终选用的也正是这个方案——15分钟一个采样点,预测未来4小时(16步)的冷负荷,控制周期也是15分钟,MPC在每个采样时刻用最新预测重新优化一次。

2.3 预测土壤温度:面向长期可持续运行的补充视角

第三种目标和前两种的时间尺度不同,它预测的不是未来几小时,而是未来几天甚至一个季度内土壤平均温度的变化趋势。短期MPC只关心今天和明天的排热能不能被机组消化,但不会主动维护地温平衡。如果把土壤温度预测纳入一个更慢的控制环,比如每天修正一次“当日累计排热预算”,就能防止短期优化把地下热量集中在某几天排放。

这套多时间尺度思路在原型项目里我只做了简化版:短期LSTM预测负荷用于小时级MPC,另一个简单回归模型跟踪土壤温度周均值,超过阈值就限制未来三天的满负荷运行时长。实际工程里,如果只有短期MPC,系统会变成“合法地滥用地下资源”,所以地温预测这块很值得做。

预测目标时间尺度控制器用途主要风险
室内温度分钟到小时级直接约束舒适度自相关过强,模型退化
冷热负荷小时级作为MPC的扰动输入需要稳定气象预报配合
土壤温度日到季度级修正长期运行策略数据观测周期长,样本少

3. 把LSTM装进模型预测控制:闭环滚动优化的整体设计

预测模型解决“未来长什么样”的问题,控制决策解决“现在该做什么”的问题。这两件事必须组合成一个闭环才能叫预测控制,否则LSTM只是一个天气预报员,对节能没有任何直接价值。

3.1 理解MPC:先“预看未来”再“走一步看一步”

模型预测控制的核心逻辑可以总结成四步:预测、优化、执行、滚动。在每个采样时刻,控制器拿着当前系统状态和外部扰动预测,在未来一段有限时域内求解一个最优控制问题,得到一整串控制动作,但只执行第一个动作。等到下一个采样时刻,拿到新观测值,再重新预测和优化。

打个比方,开车下高速匝道,你不可能闭着眼一次性打好未来半分钟的方向盘角度,而是每几秒看一眼道路情况、微调一次方向盘。MPC就是这种“边走边看、随时修正”的控制器。相比传统PID,它给人一种“全局视野”,能提前规划;相比一次性开环优化,它又能通过滚动修正对抗模型误差。

在这个项目里,LSTM提供的“未来负荷预测”就是那个提前看到的道路情况。每个控制周期开始时,先用最新气象数据和历史负荷数据,让LSTM算出未来4小时的负荷曲线,再由优化器决定未来4小时每15分钟该给冷机多大负荷指令。15分钟后拿到真实温度,重新滚一遍。

3.2 目标函数与约束:把舒适度、能耗、机组寿命写进优化

MPC的优化需要一个数学化的目标函数。我在原型里写的是:控制序列要使“未来16步的预测能耗与舒适度惩罚的加权和”最小。能耗项用负荷序列估算主机功率,舒适度惩罚项是预测室内温度或送风温度偏离舒适区间的平方项。

约束条件也很关键:主机单步负荷变化要限制(防止压缩机频繁加减载)、出水温度要在安全范围内、夜间时段要尽量利用低谷电价。这些约束在MATLAB里用fmincon求解时,可以分别写成变量上下界和非线性不等式约束。

这里有个工程细节很多人忽略:目标函数中舒适度惩罚的权重如果设得太大,控制器会非常激进,提前大量供冷导致能耗上升;权重太小,又会牺牲舒适度。我的做法是先跑一周历史数据,观察两种权重下的能耗和温度分布,再根据“温度每偏差1℃愿意多付多少电费”这个业务问题来定。

3.3 LSTM在传感器-控制器回路中的两种角色

我在项目里让LSTM同时扮演了两个角色。第一个角色是“扰动预知器”,预测未来负荷和气象条件的变化,这部分信息进入优化器作为已知输入。第二个角色是“环境响应模型”,用于在优化器内部评估“如果我这样控制,室内温度会怎么变”。

第二个角色听起来有点绕,实际操作是这样:训练LSTM时,输入除了气象和历史温度,还把控制量(比如冷冻水供水温度设定值或机组运行状态)也作为特征一起喂进去,输出是未来室内温度。这样一来,优化器在搜索候选控制序列时,只要调用这个LSTM网络跑一次前向,就能得到该序列对应的温度响应,进而计算目标函数值。

这比传统的建筑热力学模型轻量太多。传统机理模型要标定围护结构传热系数、窗墙比、人员密度等一堆参数,动辄两三天才能收敛,而LSTM只要历史数据够,训练一晚上就能用。代价是它只能在训练数据的分布范围内可靠工作,所以真实工程里至少要保留物理模型做交叉验证。

4. MATLAB落地全流程:滑窗构造、LSTM训练与fmincon滚动求解

设计思路再完整,最终要落在一行行能跑的代码上。这一整套原型全部在MATLAB里实现,不需要外接Python环境,对做暖通出身、不太熟悉Python生态的工程师相当友好。

4.1 第一步:把历史运行记录变成监督学习样本

模型训练前的数据准备可能是整个项目里最耗时的环节。原始数据通常来自楼宇自控系统的CSV导出,包含室外温度、湿度、太阳辐射、时刻、工作日标记、室内温度、冷负荷、机组状态等字段。第一步是清洗异常值和填补缺失点,我一般用前后24小时同刻数据的均值补缺,避免破坏日周期性。

接下来是滑窗构造。假设采样间隔是15分钟,预测目标未来4小时就是16步。用过去24个时间步(6小时)的历史序列作为输入特征,未来16步负荷作为标签。MATLAB中LSTM网络的输入需要组织成 cell 数组,每个观测样本是一个[输入特征数 × 时间步数]的矩阵,网络层的MiniBatchSize再分批训练。

data = readtable('gs_history.csv'); featureCols = {'OutdoorTemp', 'Humidity', 'SolarRad', 'Hour', 'IsWeekday', 'IndoorTemp', 'Load'}; horizon = 16; % 预测未来16步(4小时) winSize = 24; % 使用过去24步(6小时) numSamples = height(data) - winSize - horizon + 1; X = cell(numSamples, 1); Y = zeros(numSamples, horizon); for t = 1:numSamples X{t} = table2array(data(t : t + winSize - 1, featureCols))'; Y(t, :) = data.Load(t + winSize : t + winSize + horizon - 1)'; end % 按时间顺序划分训练/验证/测试,绝不打乱 trainIdx = 1:round(numSamples * 0.7); valIdx = round(numSamples * 0.7)+1:round(numSamples * 0.85); testIdx = round(numSamples * 0.85)+1:numSamples;

数据划分这里我特别强调一句:时间序列样本之间高度相关,随机打乱划分是典型的错误。后面要用一整段时间来做测试,才能检验模型对“未来数据”的泛化能力,而不是对“插缝数据”的记忆能力。

4.2 第二步:搭建并训练LSTM预测网络

MATLAB的Deep Learning Toolbox提供了完整的LSTM网络构建接口。我使用的是“序列输入→LSTM层→全连接层→回归输出”的结构。输入层指定特征数量;LSTM层选用OutputMode为last,因为我们只需要把整个观测窗口压缩成一个状态向量,再映射到未来16步的负荷序列。

inputSize = length(featureCols); layers = [ sequenceInputLayer(inputSize) lstmLayer(64, 'OutputMode', 'last') dropoutLayer(0.2) fullyConnectedLayer(32) reluLayer fullyConnectedLayer(horizon) regressionLayer ]; options = trainingOptions('adam', ... 'MaxEpochs', 300, ... 'MiniBatchSize', 64, ... 'InitialLearnRate', 0.005, ... 'LearnRateSchedule', 'piecewise', ... 'LearnRateDropPeriod', 100, ... 'LearnRateDropFactor', 0.5, ... 'ValidationData', {X(valIdx), Y(valIdx)}, ... 'Shuffle', 'never', ... 'Plots', 'training-progress'); net = trainNetwork(X(trainIdx), Y(trainIdx), layers, options);

训练参数里有几个容易踩坑的细节。Shuffle必须设为never,否则每个batch会随机打乱时间样本,虽然梯度估计更平稳,但验证集的评估会失去“时间顺序”的意义。MiniBatchSize建议不要太大,时间序列样本之间重叠度高,小批次有助于引入噪声、抑制过拟合。至于隐藏单元数量,64个在大多数中小型建筑负荷预测里够用了,再往上加参数量收益很小。

训练完成后记得做数据归一化。我在训练前用mapminmax对每个特征分别归一化,防止量级差异过大,比如太阳辐射的数值范围是0到1000,而湿度是0到100,不归一化会让梯度更新被大数值特征主导。

4.3 第三步:在MPC里用fmincon滚动求解控制量

模型训练好之后,还不能直接说“预测控制完成了”。要设计一个控制律,在每个采样时刻调用优化器求解未来16步的控制动作。MATLAB里做非线性规划最现成的函数是fmincon,我用sqp算法配合有限差分梯度。

控制变量我选择的是主机冷冻水供水温度设定值(连续变量),范围设在7℃到12℃,每两个相邻时刻的变化率不超过1℃。目标函数内部会调用前面训练好的LSTM环境模型,给定一组设定值序列和当前气象、负荷状态,输出未来室内温度的估计,再综合计算能耗和舒适度惩罚。

% 每15分钟调用一次 % u0: 当前设定值作为初值 % netEnv: 训练好的LSTM环境响应模型 u0 = repmat(currentSetpoint, 16, 1); lb = ones(16, 1) * 7; ub = ones(16, 1) * 12; A = []; b = []; Aeq = []; beq = []; fun = @(u) mpcCost(u, netEnv, currentState, weatherForecast); nonlcon = @(u) rateConstraint(u, 1); % 步内变化率约束 options = optimoptions('fmincon', 'Algorithm', 'sqp', 'MaxIterations', 50); [uOpt, costVal] = fmincon(fun, u0, A, b, Aeq, beq, lb, ub, nonlcon, options); uToApply = uOpt(1); % 只执行第一步 updateActuator(uToApply);

mpcCost函数内部要做的事情是:把u序列和当前特征拼接好,调用netEnv.predict得到室内温度序列,按照目标函数公式求和。这个函数是纯计算密集的,每次fmincon迭代都要调用几十次LSTM前向传播,我用工作站测试时单次滚动优化耗时约1.8秒,远低于15分钟的控制周期,完全实时可用。

如果控制变量是离散的,比如主机几台开几台停,fmincon就不适用了。我的替代方案是将离散组合枚举出来(比如16步内机器状态组合约几十种),对每种组合调用一次前向传播算代价,取最小的一组。这本质上是暴力搜索,但因为状态组合被我们限制得很少,速度反而比连续优化更快、更稳。

5. 实战中反复踩过的坑:从数据泄漏到在线推理延迟

训练LSTM和控制模型本身不难,难的是让它在新数据上稳定工作。我这一路踩了不少坑,有些坑的教训值得每一个想在建筑能效领域用深度学习的同行记下来。

5.1 归一化统计量泄漏与时间序列划分陷阱

我第一次做负荷预测原型时,先对整个数据集做了一遍全局归一化,再切训练和测试集,测试集RMSE低得感人。后来发现低是因为均值、最大值、最小值都是在包含测试段的全序列上算的,测试数据的分布信息早就泄漏进了训练过程。这就好比考试前把答案范围告诉了学生,他考得好不能代表学会了。

正确做法是先切时间段,只在训练段统计归一化参数,再把这个参数应用到验证和测试段。同样的原则也适用于滑窗构造——不能先滑窗再切分,那样相邻样本会跨段互串。另一个同类错误是:用未来时段的气象观测数据来预测过去时段的负荷,这在离线测试中看起来精度很高,但在真实在线运行时,未来气象只能来自天气预报,误差是完全不一样的。

5.2 预测精度“虚高”的假象:站在持久性基线之上看模型

上一节提到室内温度预测RMSE低可能是模型在“抄上一刻”,这个坑在负荷预测里同样存在,表现形式略有不同。负荷曲线有很强的日周期性,昨天的负荷和今天的负荷很容易相似,模型如果只学“把昨天同刻的负荷拿来用”,测试集上MFE也不会太大。

我的校验方法很简单:建立一个“持久性预测”基线,也就是直接拿当前值作为未来所有步的预测,或者拿过去7天同一时刻的历史均值作为预测。任何一个LSTM模型都必须明显超过这个基线才有意义。我在项目里还会专门看“突变点误差”,比如某天突发降温或大型会议导致负荷骤增,把这些时段的预测误差单独列出来看。预测控制的收益恰恰在于应对变化,平稳段预测得再准都没有太多经济价值。

5.3 fmincon滚动求解的算力瓶颈与工程绕行方案

在线推理的另一个现实问题是:LSTM网络在MATLAB里做前向传播并不像推理框架里那么快。如果未来预测步数较长,fmincon要搜索几十次甚至上百次目标函数,每次都要跑一遍完整的LSTM嵌套迭代,叠加起来计算时延可能从几百毫秒涨到十几秒。控制周期如果是15分钟,十几秒还能接受;但如果将来要扩展到分钟级控制,就不行了。

我的思路是分层控制:温度调节回路仍然用传统PID,放在现场控制器的快速周期里;上层MPC只在15分钟或1小时的慢周期给出设定值修正量。这样LSTM推理的时延就不影响底层闭环的稳定性。另一个思路是提前把常见的负荷模式离线算好,在线时用最近邻匹配查找预计算的策略表,虽然牺牲一点最优性,但确定性更好,调试也方便。

问题表现根本原因处理办法
测试集RMSE过低、但上线预测偏差大归一化统计量或样本切分泄漏先切时间段,仅用训练段统计归一化参数
预测曲线平稳段很好、突变段很差模型依赖周期惯性建立持久性基线对照,单独统计突变点误差
在线控制优化耗时过长每次迭代调用LSTM前向传播分层控制,MPC走慢周期,底层PID走快周期

6. 方案效果怎么评价,以及往真机部署前的扩展思考

模型做出来、控制闭环能跑,这只是原型阶段完成了。真正评判这套方案能不能用,需要用一套适合温控系统的口径,而不是只看深度学习那一套回归指标。

6.1 别只看RMSE:温控项目的评估口径

我在这类项目里一般会拉五类指标做对比:日累计能耗、室内温度超时比例、机组启停次数、地源侧进出水平均温差,以及舒适度指标PMV的波动范围。运行一周统计下来,LSTM-MPC相比原有规则控制,在同等舒适度区间内日累计能耗大约降低12%到18%,机组启停次数减少了约三分之一。这个结果和RMSE没有直接换算关系,因为控制层面的收益主要来自“提前调整负荷、避免短时峰值”,而这正是单纯预测精度评估看不到的。

要特别小心对比的公平性。现实环境里的天气不会和上一年同一周完全一样,最简单的做法是把历史多周数据都跑一遍离线仿真,用同一组气象数据去测评新旧两种控制策略。如果你的项目有实体系统,可以在两个连续周里做A/B切换,每周轮换周期要足够长,避免系统热惯性带来的残留影响。

6.2 从MATLAB原型到现场控制器的三级部署路线

最后说说把原型推到真实系统需要走的路。我在两个项目里验证过比较稳的三步法:第一步是在MATLAB里做完全离线仿真,把历史数据喂进去,验证控制策略在过往天气下的表现;第二步是“建议模式”,让LSTM-MPC的计算结果和现场原有控制器的输出并排显示,但不下发执行,运行两到四周收集操作人员的反馈;第三步才切换到闭环模式,而且先从冷机出水温度设定值这类低风险变量开始,逐步扩大控制权限。

现场通讯是另一个很多人低估的工作量。MATLAB原型通常运行在工程师站,要和现场PLC或DDC做数据交互,最常见的是Modbus TCP或BACnet协议。MATLAB可以用工业通讯工具箱直连,但现场调试时一定要先做数据位映射测试,比如温度是放大10倍还是100倍的整型数、字节序是大端还是小端,错了会导致控制器收到离谱数据。这一步不解决,算法再先进也落不了地。

如果你从一开始就打算走更偏产品化的路线,可以把训练好的LSTM网络导出成ONNX格式,交给C++或Python的推理服务加载,MATLAB只负责离线训练和策略设计,这在多站点部署时能省不少运维成本。


说实话,做完这套系统以后,我最大的体会是:LSTM在这里更像一个“有根据的参谋”,它替控制器提前看到了负荷的走向,但最终下决策的还是MPC的优化逻辑。预测精度是手段,把预测结果变成设备动作才是目的。很多项目卡在“模型很准但没有被用起来”,本质上是漏了后面这半程。

如果现在让我再做一个类似的温控项目,我会在一开始就把数据采集频率、气象预报接入、控制变量约束这些工程问题列成清单,而不是先急着训模型。数据干净、闭环清晰,LSTM自然能发挥出它的价值。希望这篇文章能把你在LSTM-GSHP预测控制这条路上绕过的弯减少一半,下次调fmincon的时候少掉几根头发。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询