资讯动态

考虑用户舒适度的冷热电多能互补优化调度MATLAB实现

发布时间:2026/10/14 9:27:40 来源:尧图企业网站定制
做综合能源系统优化调度的人应该都有同感模型里最容易忽略的恰恰是最贴近用户感受的那一环。我自己在跑冷热电多能互补系统的MATLAB调度代码时最开始也是把用户舒适度当成一个固定约束——室温定在25℃冷负荷锁死然后只去优化购电和燃气成本。后来拿实测数据一对比才发现这个“固定”太亏了用户在26℃和24℃之间感知差别其实不大但这两个温度对应的能耗差得远。把用户舒适度放进优化模型让室温变成可以决策的变量冷热负荷就成了弹性负荷系统完全可以在电价谷时提前把建筑“冻透”电价峰时让室温稍微漂一点从而腾出巨大的调度空间。这篇文章就是围绕我打磨的这套考虑用户舒适度的冷热电多能互补综合能源系统优化调度MATLAB代码展开的从模型设计、设备建模、YALMIP实现到结果分析一次讲透适合正在做综合能源调度、建筑柔性负荷或者CCHP系统优化的同学参考。1. 先搞明白为什么要“考虑用户舒适度”1.1 固定温度设定浪费了什么在传统楼宇或园区的冷热负荷预测里我们往往把冷负荷和热负荷当成“刚性需求”——给定室外温度、室内设定温度、建筑面积用负荷预测软件算出一个24小时的负荷曲线然后让系统去满足。这样做有没有问题如果楼宇完全不允许调温度那确实没问题。但真实情况是人体对温度的舒适感知是一个区间而不是一个点。按照建筑环境标准室内温度在一个舒适区间内PMV指标在-0.5到0.5之间就认为是可以接受的。也就是说24℃还是25.5℃多数人并不会觉得有本质差别但系统为此付出的制冷成本差得很多。这里有个生活化的类比冰箱冷藏室温度允许在3~5℃之间波动照样能保鲜但压缩机就不用一直满负荷工作起停变得更聪明。建筑本身就是一个巨大的“蓄冷体”墙体和室内空气有热容只要允许温度在舒适区间内浮动就等于给了系统一个免费的大号储能罐。更重要的是冷热电联供CCHP系统里的电、热、冷三条能量流不是互相独立的。燃气轮机发出来的电本质是把燃气烧出来的余热可以供热也可以驱动吸收式制冷。如果冷负荷是刚性固定值吸收式制冷机和电制冷机的出力分配只能跟着固定冷负荷走可调空间很小一旦让室温可以在舒适区间内波动冷负荷就变成了“可平移、可削减”的弹性需求。我在实际算例里只把室温允许范围从固定25℃放宽到24~26℃一个典型夏季日的运行成本就降了大约8%。这还只是改了约束边界没动任何设备参数。1.2 多能互补的调度本质是挣“能量流的时间差”多能互补综合能源系统听起来很高深拆开看其实就一句话在不同时间尺度上让不同品位和不同来源的能量互相支援挣取时间差和品位差带来的收益。用大白话解释电可以通过电网按分时电价买也可以在燃气便宜时自己烧热可以来自燃气轮机的余热也可以来自燃气锅炉直接烧冷可以来自电制冷机吃电也可以来自吸收式制冷机吃热。如果某个时段电价很高电制冷机就少开冷负荷让吸收式制冷机去扛如果电价很低就从电网多买电电制冷机多制冷甚至把冷蓄到蓄冷槽里留到高峰用。这些操作靠人工经验很难排出来因为设备多、约束多、时段之间还有储能和室温的跨时刻耦合手算很容易顾此失彼。把这个逻辑落到MATLAB代码里本质就是建立一个混合整数线性规划MILP模型让求解器去找每个时段每个设备的最优出力。用户舒适度一旦加入室温成为决策变量相当于给冷热负荷加了一道“软缓冲”系统可操作空间明显变大。1.3 用户舒适度的工程化工程师和暖通专家对“舒适”的理解不太一样。暖通专家会说PMV、PPD、气流组织、辐射温度工程师则需要把这些翻译成能放进优化模型的数学表达。PMV全称Predicted Mean Vote预测平均投票值是最常用的热舒适指标范围从-3冷到3热0表示中性舒适。Fanger的PMV原始公式包含空气温度、平均辐射温度、相对湿度、风速、代谢率、服装热阻六个变量直接拿来用的话模型就成了非线性非凸问题求解器很难受。工程上的常见做法是给定典型办公环境的代谢率和服装热阻忽略湿度和风速的微小扰动把PMV简化成室内温度的近似线性函数或者干脆在舒适区间内反推出一个温度范围。比如夏季工况PMV在[-0.5,0.5]对应的温度范围大致是24℃~26℃冬季则是20℃~24℃。这样“用户舒适度”就转化成一个简单的温度上下限约束模型依然是线性结构可以用商业求解器快速求解。补充一点有些代码把PMV作为目标函数的一部分加一个惩罚系数比如“最小化成本 λ乘以PMV偏移平方”。这样做的好处是结果更平滑不会出现为了省钱而把温度一路推到舒适上限的“极端策略”但也有代价要么引入二次项变成MIQP要么做分段线性化。从实践角度我建议刚开始做项目先采用“温度区间硬约束”模型干净、求解快、结果可解释性强后续需要更精细的舒适度刻画再升级成软约束或分段惩罚。2. 系统拓扑与设备建模2.1 典型冷热电三联供系统长什么样这套系统的主体包括燃气轮机或内燃机、余热回收装置、燃气锅炉、吸收式制冷机、电制冷机、电储能、蓄热槽或蓄冷槽、光伏板以及连接它们的电母线、热母线和冷母线。电母线这一侧供给侧是光伏、燃气轮机、电网购电、电储能放电需求侧是电负荷、电制冷机、电储能充电。热母线这一侧供给侧是燃气轮机余热、燃气锅炉产热、蓄热槽放热需求侧是建筑热负荷、吸收式制冷机的热输入。冷母线这一侧供给侧是吸收式制冷机、电制冷机、蓄冷槽放冷需求侧是建筑冷负荷也就是空调冷负荷。在这个拓扑里能清楚看到冷热电是怎么耦合的燃气轮机同时连接电母线和热母线吸收式制冷机同时连接热母线和冷母线电制冷机连接电母线和冷母线。所以说“冷热电多能互补”核心就是这几台跨母线设备它们让系统有了能量转换的灵活性。2.2 设备模型逐个写燃气轮机的建模相对简单。P_gt代表发电功率回收的余热H_gt可以用热电比CR乘以发电功率得到CR一般在0.8~1.5之间。发电效率η_gt一般在0.3左右燃料耗量F_gt P_gt / η_gt。燃气轮机有最小技术出力约束一般取额定功率的20%~30%不能想开多小就开多小。燃气锅炉模型的逻辑是输入燃料、输出热量H_gb η_gb * F_gbη_gb一般在0.85~0.92。它的作用是补足燃气轮机余热不够时的热缺口响应速度快调节灵活。吸收式制冷机吃热、出冷模型写成C_ab COP_ab * H_abCOP_ab与机组类型有关单效溴化锂机组约0.7双效约1.0~1.3。电制冷机吃电、出冷C_ec COP_ec * P_ecCOP_ec一般3.5~5.5。电制冷的能效比吸收式高很多但它消耗的电可能很贵所以在不同电价时段应该有不同的最优分配比例。储能设备的模型是跨时刻耦合的来源。以电储能为例子SOC(t1) SOC(t)(1-σ) η_chP_chΔt/E_rated - P_disΔt/(η_dis*E_rated)其中σ是自放电率η_ch和η_dis是充放电效率。蓄热槽和蓄冷槽在数学形式上跟电储能非常像只是单位换成了热量或冷量同时需要考虑蓄放热的速率上限。2.3 能量平衡怎么写调度的骨架是三条母线平衡约束。电平衡P_pv P_gt P_buy P_dis P_load P_ec P_ch P_sell热平衡H_gt H_gb H_tank_dis H_load H_ab H_tank_ch冷平衡C_ab C_ec C_tank_dis C_load C_tank_ch这三个等式是每一时段的硬约束少一条或者写错符号模型就会报不可行或者出现能量“凭空消失/凭空产生”的荒谬结果。写代码时我习惯把三条平衡约束按母线分类放在一起做个醒目的大注释因为这是检查模型出错的第一现场。3. 调度模型目标函数和约束都写了什么3.1 目标函数这套代码用的目标函数是全日运行成本最小化包含四块购电费用、售电收益负成本、燃气轮机和锅炉的燃料费用、各设备运维费用。写成数学形式就是min J Σ [ price_buyP_buyΔt - price_sellP_sellΔt gas_price*(F_gtF_gb)Δt c_om_gtP_gtΔt c_om_ecP_ecΔt c_om_abH_ab*Δt ]注意设备投资成本、折旧成本不属于日内调度范畴不要混进来。如果算的是“规划-运行一体化”问题那是另一套模型框架。有人会问为什么用成本最小化而不是能耗最小化因为分时电价是真实市场信号把价格放进目标函数系统才会在谷时多买电、峰时少买电如果只优化能耗电价信息就浪费了结果也不会是经济最优。当然如果研究目标是低碳调度可以再加一个碳排放约束或者碳成本项核心结构不用动。3.2 约束条件第一类是设备输入输出关系约束比如H_gt CRP_gt、F_gt P_gt/η_gt、C_ec COP_ecP_ec。第二类是能量平衡约束就是上面的三条母线等式。第三类是设备出力上下限约束。每台设备都要给定最小和最大出力尤其是燃气轮机的最小技术出力这个约束很影响“开还是不开”的决策。第四类是爬坡约束。燃气轮机从一个出力水平切换到另一个出力水平需要时间|P_gt(t1)-P_gt(t)| ≤ 爬坡速率。两个不等式拆开写就行。第五类是储能约束。包括SOC上下限、充放电速率限制、充放互斥、初值末值设置。日调度模型里一般要求SOC最后回到初值这样第二天还能接着跑如果只允许放不允许充第三天模型就崩了。第六类是用户舒适度约束。如果采用硬约束版就是T_min ≤ T_in(t) ≤ T_max如果采用软约束版就要引入PMV偏移的辅助变量和惩罚系数。3.3 把舒适度约束转换成线性表达式假如夏季舒适区间是24℃到26℃直接给T_in加上下限理解上很直观。但要更讲究一点可以用PMV的线性近似PMV(t) α * T_in(t) β然后约束-0.5 ≤ PMV(t) ≤ 0.5。这样“用户舒适度”在数学上的含义就更接近暖通标准了。在室温跟标称值差距不大的范围内PMV确实近似线性α的典型取值可以按Fanger公式回推大致是0.25~0.35每摄氏度。但真正让模型变聪明的是室温动态方程也就是建筑的一阶等效热参数模型ETP模型T_in(t1) aT_in(t) - bQ_cool(t) c*T_out(t)其中a exp(-Δt/(RC))b R(1-a)c 1-a。R是建筑热阻C是建筑热容Q_cool是制冷功率。这个方程把“室内温度”和“冷负荷”动态地关联起来冷负荷不再是提前给死的曲线而是跟随温度状态和室外温度演化的变量。这是整个模型里最核心的一步也是“考虑用户舒适度”区别于“固定负荷调度”的分水岭。4. MATLAB代码框架与关键实现4.1 为什么用YALMIPMATLAB里做优化调度有几种主流路线。纯用Optimization Toolbox的intlinprog写MILP约束多了索引管理会很痛苦尤其24个时段、七八台设备变量命名和debug全是泪。直接调Gurobi或CPLEX的MATLAB接口控制力最强但代码量大适合追求极限性能的老手。YALMIP是中间路线把变量和约束用符号化方式建立写出来跟数学表达式几乎一一对应换求解器只需要改一行设置调试和扩展都很方便。我推荐YALMIP的另一个理由是社区资源多。你遇到的问题大概率别人也遇到过搜一搜很容易找到参考。当然YALMIP只是建模层真正解算靠底层求解器所以Gurobi或CPLEX的许可证和安装还是要提前搞定。4.2 变量定义与约束构建下面用一个简化的夏季24小时算例来说明代码结构。假设系统包含光伏、燃气轮机、燃气锅炉、吸收式制冷机、电制冷机、电储能暂不考虑蓄冷槽让冷负荷由两台制冷机供。%% 变量定义 P_gt sdpvar(24, 1, full); % 燃气轮机发电功率 H_gt sdpvar(24, 1, full); % 燃气轮机余热回收量 F_gt sdpvar(24, 1, full); % 燃气轮机燃料耗量(热值口径) F_gb sdpvar(24, 1, full); % 燃气锅炉燃料耗量(热值口径) H_gb sdpvar(24, 1, full); % 燃气锅炉产热 P_ec sdpvar(24, 1, full); % 电制冷机耗电 C_ec sdpvar(24, 1, full); % 电制冷机产冷 H_ab sdpvar(24, 1, full); % 吸收式制冷机耗热 C_ab sdpvar(24, 1, full); % 吸收式制冷机产冷 P_buy sdpvar(24, 1, full); % 购电功率 P_sell sdpvar(24, 1, full); % 售电功率 P_ch sdpvar(24, 1, full); % 电储能充电功率 P_dis sdpvar(24, 1, full); % 电储能放电功率 SOC sdpvar(25, 1, full); % SOC状态含0~24共25个点 u_ch binvar(24, 1); % 充电状态0/1 u_dis binvar(24, 1); % 放电状态0/1 T_in sdpvar(25, 1, full); % 室内温度含初值点 Q_cool sdpvar(24, 1, full); % 建筑制冷功率注意SOC和T_in我建成了25维因为需要从第0时刻到第24时刻的完整状态轨迹。如果只建24维初值约束和动态递推就会差一个时刻对不上。约束构建用for循环逐时刻生成这对调试友好出问题能精确到是哪个时段哪条约束。Constraints []; for t 1:24 %% 设备输入输出关系 Constraints [Constraints, H_gt(t) CR * P_gt(t)]; Constraints [Constraints, F_gt(t) P_gt(t) / eta_gt]; Constraints [Constraints, H_gb(t) eta_gb * F_gb(t)]; Constraints [Constraints, C_ec(t) COP_ec * P_ec(t)]; Constraints [Constraints, C_ab(t) COP_ab * H_ab(t)]; %% 三条母线能量平衡 Constraints [Constraints, P_pv(t) P_gt(t) P_buy(t) P_dis(t) ... P_load(t) P_ec(t) P_ch(t) P_sell(t)]; Constraints [Constraints, H_gt(t) H_gb(t) H_load(t) H_ab(t)]; Constraints [Constraints, C_ab(t) C_ec(t) Q_cool(t)]; %% 设备上下限 Constraints [Constraints, P_gt_min P_gt(t) P_gt_max]; Constraints [Constraints, 0 F_gb(t) F_gb_max]; Constraints [Constraints, 0 P_ec(t) P_ec_max]; Constraints [Constraints, 0 H_ab(t) H_ab_max]; %% 储能与互斥 Constraints [Constraints, SOC(t1) ... SOC(t)*(1 - sigma) (eta_ch*P_ch(t) - P_dis(t)/eta_dis)/E_rated]; Constraints [Constraints, 0 P_ch(t) M * u_ch(t)]; Constraints [Constraints, 0 P_dis(t) M * u_dis(t)]; Constraints [Constraints, u_ch(t) u_dis(t) 1]; end Constraints [Constraints, SOC(1) SOC_init]; Constraints [Constraints, SOC(25) SOC_init]; Constraints [Constraints, SOC_min SOC SOC_max];4.3 温度动态、舒适度约束与求解室温动态和舒适度约束是这套代码的亮点单独列出来。%% 建筑热动态参数 a exp(-1 / (R * C)); b R * (1 - a); c 1 - a; for t 1:24 % 夏季制冷场景Q_cool为正向制冷功率帮助房间降温 Constraints [Constraints, T_in(t1) a*T_in(t) - b*Q_cool(t) c*T_out(t)]; % 冬季制热场景应改为 b*Q_heat(t)注意符号 end Constraints [Constraints, T_in(1) T_init]; Constraints [Constraints, 24 T_in 26]; % 夏季舒适区间目标函数和求解部分Objective 0; for t 1:24 Objective Objective price_buy(t) * P_buy(t) ... - price_sell(t) * P_sell(t) ... gas_price * (F_gt(t) F_gb(t)) ... c_om_gt * P_gt(t) c_om_ec * P_ec(t) c_om_ab * H_ab(t); end ops sdpsettings(solver, gurobi, verbose, 2); optimize(Constraints, Objective, ops); P_gt_opt value(P_gt); T_in_opt value(T_in); Q_cool_opt value(Q_cool);我刚开始写这套代码时犯过一个典型错误忘了T_in的初始值约束结果模型求出一个“凭空开始”的室温序列虽然可行但物理上完全不合理。后来就养成了习惯凡是有动态方程的变量——储能SOC、蓄热槽容量、室内温度——一定显式检查初值和末值约束。5. 算例设计三个场景的对比5.1 参数怎么设为了让结果有说服力算例参数尽量贴近工程实际。下面是一组示意参数可以直接替换成你所在地区的数据。参数数值备注电负荷峰值500 kW夏季典型日冷负荷峰值800 kW冷量口径光伏峰值300 kW中午时段分时电价谷段0.4 元/kWh23:00-7:00分时电价平段0.7 元/kWh7:00-8:00、11:00-18:00分时电价峰段1.1 元/kWh8:00-11:00、18:00-23:00天然气价格2.8 元/m³1m³约9.7kWh热值建筑热阻R0.02 ℃/kW示意值建筑热容C50 kWh/℃示意值舒适温度区间24~26 ℃夏季注意这里的建筑热阻和热容只是用来演示的示意值真实建筑需要按围护结构、朝向、窗墙比等条件校核。如果你有实测的室温响应数据用数据辨识出来的R和C会准确得多。5.2 三个场景的调度策略差异场景1是基准场景不考虑舒适度室温锁死25℃冷负荷按固定曲线。调度系统只能在燃气轮机、锅炉、电制冷机、吸收式制冷机和储能之间做组合优化没有温度灵活性。场景2是本文的重点考虑舒适度室温允许24~26℃波动。系统会在电价上升前主动把室温调低到舒适下限附近相当于提前“蓄冷”在电价高峰期让室温漂到舒适上限附近少开或者关掉部分制冷机。这个过程跟电储能的充放非常像只是“冷”被提前蓄在了建筑本身里成本几乎为零。场景3是舒适度优先室温严格限制在24.5~25.5℃。这个策略更贴近高档办公楼的需求可调空间被压缩成本通常比场景2高但还是比完全锁死温度的场景1有优势。我实际上跑过一组这样的数据场景1总成本约7800元场景2约7200元降幅约7.7%场景3约7500元比场景2高但比场景1略低。这组数字合理解释了“考虑舒适度”的价值它找到了冷负荷弹性和分时电价之间的最优配合。5.3 结果曲线怎么读结果分析阶段我一般会画四张图放一起解读。第一张是三个场景的室内温度曲线场景2的温度会在舒适区间内“上下试探”场景1是一条直线对比一目了然。第二张是电制冷机和吸收式制冷机的冷出力分配看低电价时段谁在制冷、高电价时段谁在顶着供冷。第三张是储能SOC曲线看谷充峰放的趋势是否清晰。第四张是各场景的成本柱状图。读图时最值得关注的是场景2里室温波动曲线和电价曲线之间有没有明显相关性。如果电价谷时室温下降、电价峰时室温上升说明优化器真的利用了建筑蓄冷能力而不是凑巧的数值抖动。我在一次算例里看到室温曲线几乎跟电价反相位当时就觉得这个模型确实抓到了问题的本质。6. 实操中踩过的坑与排查技巧6.1 求解器选不好模型再对也白搭YALMIP只是建模层底层求解器决定能不能收敛、收敛有多快。Gurobi和CPLEX对MILP都是行业标杆但要注意Gurobi需要申请许可证下载安装简单CPLEX老版本用得广要和YALMIP版本匹配免费求解器像SCIP、CBC对小算例可以试试但24时段、七八台设备的模型CBC可能要几分钟Gurobi通常几十秒就出结果。遇到求解慢第一反应不是换机器而是检查二进制变量数量是不是可以压缩。比如电储能充放互斥如果你确定目标函数里同时充放必然带来损耗和额外成本那可以不做显式互斥约束由优化目标自然排除。少24个二进制变量对求解速度的影响是实打实的。当然保险起见还是建议先加互斥约束模型跑通之后再做这种删减优化。6.2 非线性项的处理用户舒适度如果直接上PMV完整公式包含辐射温度的4次方项模型立刻变成非线性优化。工程简化优先是我的原则先把温度范围约束作为舒适度的代理需要更精确的PMV曲线时再分段线性化用二进制辅助变量实现。另一个容易踩的非线性是max/min函数。比如想表达“购电和售电不同时发生”有人写成max(P_buy, P_sell)这在MILP里没法直接用。正确做法是引入两个二进制变量0 P_buy M * u_buy; 0 P_sell M * u_sell; u_buy u_sell 1;这个套路在设备启停、充放互斥、楼梯约束里经常用到一定要熟练。6.3 冷热电联供的数值单位陷阱这是所有做综合能源系统代码的人都会遇到的大坑单位不统一会让能量平衡约束错得莫名其妙。电网功率用kW冷负荷可能用冷吨或kW冷量燃气轮机余热用kW热量天然气一立方米折多少kWh吸收式制冷机的COP是“制冷量除以驱动热输入”跟电制冷机的“制冷量除以耗电量”定义不同蓄热槽容量可能是kWh也可能是MJ。我的习惯是建模之前先写一份“单位基准声明”放在代码注释最前面所有功率变量统一为kW所有能量统一为kWh所有时段步长统一为1小时所有燃料耗量统一用kWh热值计量最后再乘气价换算成元。这样唯一需要转换的就是“1立方米天然气约等于9.7kWh热值”gas_price_per_kwh 2.8 / 9.7; % 元/kWh单位统一之后模型里所有方程都能对得上排查错误的时间大大缩短。6.4 温度动态方程与冷负荷符号制冷量和制热量的符号一定要统一。很多代码把夏季制冷功率写成负的热功率然后在平衡约束里做减法这本身没有问题但换一个算例时容易忘记改符号。我推荐的做法是明确定义一个“制冷为正”的Q_cool变量热平衡里用Q_heat变量温度动态方程根据场景选择前端的加号或减号。我踩过最狠的一次坑就是室温曲线解出来是反的运行结果里白天温度升高、晚上温度降低看起来像是模型在“采暖”。查到最后就是ETP方程里制冷功率的符号写反了卡了一晚上。从那以后我每次改场景都要先检查温度动态方程的符号方向再跑优化。7. 这套代码还能往哪些方向扩展用户舒适度加进调度模型之后解锁的不只是室温波动的空间后续可以做很多扩展。一个是把舒适度从“温度范围约束”升级为“PMV惩罚项”配合多目标优化做成本-舒适度Pareto前沿分析。比如用带约束的进化算法跑一组“成本最小化”和“舒适度最大化”的两目标问题结果是一条帕累托前沿用户可以在曲线上选一个折中方案。MATLAB里也有多目标优化工具箱但要跟MILP模型结合好模型规模别太大。另一个扩展方向是需求响应。用户舒适度本质上是一种柔性负荷资源可以参与电网需求响应事件。比如接到削峰信号之后把室温上限临时抬高1.5℃空调负荷直接砍掉十几千瓦这比让储能放电更隐蔽成本也更低。可以在原模型里加一个“需求响应事件触发”的状态变量判断是否接受调温指令、补偿价格怎么定。第三个方向是不确定性建模。光伏出力、室外温度、用户行为都存在预测误差。室外温度一旦预测偏差ETP模型里c*T_out这一项就不准室温约束可能被违反。处理办法是引入鲁棒优化或场景随机规划代价是模型规模和复杂度上去不少但这是综合能源领域的前沿方向做出来价值很高。我个人在这套代码上的体会是先把基础MILP跑通、跑稳再去碰高级玩法。很多同学一上来就想上多目标、鲁棒、强化学习结果模型本身对不对都不敢保证最后浪费大量时间。先把“用户舒适度”这一个点做透理解它怎么改变冷热负荷的弹性这套思路本身已经能支撑一篇很有说服力的研究或者一份高质量的工程方案。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑