资讯动态

CCHP综合能源微网优化调度MATLAB程序建模与实现

发布时间:2026/10/24 3:02:16 来源:尧图企业网站定制
最近把手头这套基于CCHP模型的综合能源耦合微网优化程序整理了一版趁着思路还热乎把建模过程、代码结构和调试中踩过的坑完整拆出来分享下。综合能源系统优化调度这两年问的人特别多尤其是冷热电联供CCHP的耦合建模很多同学卡在“设备模型能跑通但优化结果不符合常识”这个阶段。这套MATLAB程序的核心不是某个花哨算法而是把“电-热-冷”三种能源形式的耦合关系用数学模型完整表达出来在满足负荷平衡和设备物理约束的前提下通过优化求解器拿到24小时最优调度策略。程序定位很明确适合正在做微电网、综合能源系统、多能互补方向研究的人也适合刚开始接触优化调度的工程师。如果你手头有负荷数据、能源价格参数和设备铭牌参数按文中思路填进去就能得到可用的调度方案。下面按我的实际开发路径来说。1. 项目定位与核心建模思路1.1 CCHP耦合模型的本质冷热电联供不是简单把一台燃气轮机和几台制冷机摆在一起核心在于一次能源的梯级利用。燃气轮机或内燃机发电时会产生大量余热这部分热量直接排掉非常浪费所以要通过余热回收装置变成供热或制冷的驱动力。这样一来天然气的能量在“发电”和“余热利用”两个环节都被充分利用系统的总能效可以超过80%远远高于单纯买电加电锅炉的方案。我打开这个程序的时候最大的感受是设备之间的耦合关系比单独建模复杂得多。燃气轮机的发电出力决定了余热量余热量又决定了供热或制冷的能量边界而制冷量不足的部分要靠电制冷机从电网上取电补齐。这就形成一条完整的能量流链条气→电→冷/热同时电负荷和冷热负荷还在末端互相牵制。如果没有一个全局优化模型统一调配这些设备仅靠经验规则经常会出现“电网电价低时还在开燃气轮机发电”“电制冷和吸收式制冷同时满负荷运行”这种资源浪费现象。这套MATLAB程序做的就是把所有设备纳入同一个上层优化框架让每台设备在每个时刻的出力都由“最小运行成本”这个目标统一决定。耦合模型的本质就是用一个包含全部决策变量和物理约束的数学规划问题替代原先割裂的单设备调度策略。1.2 为什么选MATLAB作为实现平台做综合能源优化的人都知道这个场景的特点是设备类型多、变量维度高、时间序列长。用Python也能做但从数据处理到建模再到调试MATLAB的优势非常明显。矩阵化的时间序列处理让逐时负荷数据的组织变得极其直观一行代码就能对24小时或8760小时的向量做整体运算。再一个关键点是YALMIP工具箱。它把优化建模和求解器解耦了用近似自然语言的方式描述约束和目标函数底层再无缝对接Gurobi、Cplex等商业求解器。这意味着不需要手写复杂的对偶变换或行生成技术只要模型数学表达式正确求解器会高效处理。程序运行过程中我可以直接在命令行输出变量曲线和成本明细配合绘图工具快速发现问题位置这对调试复杂耦合系统的意义非常大。如果是工程部署阶段MATLAB代码转C代码也不是问题。但大部分研究课题和前期方案论证MATLAB完全够用而且上手成本远低于从零写求解器。1.3 优化目标的权衡与取舍优化目标的选择直接决定调度策略走向。最常见的三类目标最小运行成本、最小碳排放、最高综合能效。实际项目里纯经济目标相对容易实现但综合能源微网往往承担着环保压力和可再生能源消纳指标所以最优做法是多目标加权。在这个程序里我把目标函数设计成综合成本形式购电购气费用加设备运维费用再减去向电网售电的收益同时加上碳排放代价碳价乘以等效碳排放量。这样做的优势是只用一个单目标表达式就能体现经济性和环保性的平衡避免多目标Pareto前沿分析带来的求解复杂度。权重系数怎么定我最常用的是“碳排放折算为成本”的办法把碳价设为每吨某个固定值与排放量相乘后直接加入目标函数。这样物理意义清晰后续想强化环保指标只需调大碳价系数调度结果就会自动减少燃气轮机在低效工况下的运行时长。2. 数学模型拆解变量、约束与目标函数2.1 决策变量怎么定义优化模型的第一步是确定决策变量。程序中所有待求解的物理量都定义为矩阵形式变量维度统一设为1×24对应一天的逐时调度。核心决策变量包括燃气轮机发电功率P_GT(t)、从电网购电功率P_buy(t)、向电网售电功率P_sell(t)、电锅炉供热功率Q_EB(t)、电制冷机供冷功率Q_EC(t)、吸收式制冷机供冷功率Q_AC(t)以及储能的充放电功率P_ch(t)和P_dis(t)。储能系统的荷电状态SOC(t)也是连续变量用来表达储能装置内部的能量状态。此外燃气轮机和储能设备都涉及启停状态所以还要引入0-1整数变量u_GT(t)、u_ch(t)、u_dis(t)。有整数变量时模型就变成了混合整数线性规划MILP如果所有约束都是线性的话。不引入整数变量、只做连续变量松弛也能得到近似解但会出现储能同时充放电、燃气轮机在极低负荷点运行等违背物理规律的结果。实际工程中MILP仍然是首选因为商业求解器对这类问题求解效率很高24小时尺度下基本秒级出解。2.2 设备模型与效率曲线设备模型的准确度直接影响优化结果的可靠性这里要说一下建模细节。燃气轮机模型分两步发电部分用一个固定发电效率η_e单位燃料投入对应特定电量产出余热回收部分则用余热回收系数乘以燃料总热量得到回收功率。虽然燃气轮机在部分负荷工况下效率会下降但对于初版程序用固定效率参数加出力上下限已经能得到趋势正确的调度方案。电锅炉模型相对简单输入电功率、乘上热效率η_eb就得到热输出。电制冷机的性能系数COP_ec表示每消耗1kW电可以产出多少kW冷量一般冷水机组在3.5~5.5之间。吸收式制冷机用余热驱动性能系数COP_ac通常只有1.2~1.5看着低但它的驱动能量来自发电余热边际成本几乎为零所以在余热充足时优先利用吸收式制冷往往比电制冷更经济。储能设备的建模要特别注意约束的非线性部分。充电时能量存入电池的效率是η_ch放电时取出效率是η_disSOC迭代公式E(t1) E(t) η_ch * P_ch(t) * Δt - (1/η_dis) * P_dis(t) * Δt。由于充电功率和放电功率不能同时为正需要加互补约束保证逻辑成立。2.3 约束条件的完整清单把所有设备串起来的是能量平衡约束。电平衡约束为P_GT(t) P_PV(t) P_dis(t) P_buy(t) P_load_e(t) P_EC(t) P_EB(t) P_ch(t) P_sell(t)。注意光伏出力和基础电负荷都是输入参数等式右边的电制冷机、电锅炉是内部用电设备必须计入电平衡。热平衡约束为Q_HR(t) Q_EB(t) Q_load_h(t)其中Q_HR是燃气轮机余热经过热回收后的输出功率。冷平衡约束为Q_AC(t) Q_EC(t) Q_load_c(t)。这三类平衡约束是模型的主体任何时刻都不能违背。除了平衡约束还有设备出力边界。每台设备输出功率要在0和额定容量之间储能SOC要在下限SOC_min和上限SOC_max之间。燃气轮机还要考虑爬坡约束即相邻时刻出力变化不能超过限定值否则优化结果会产生过于剧烈的运行切换实际机组根本执行不了。启停逻辑约束用MILP中的大M法实现比如u_ch(t) u_dis(t) ≤ 1保证同一时刻储能装置只能处于充电或放电的单一状态。2.4 目标函数从单层费用到综合成本目标函数是整个优化问题的指挥棒书写顺序要从结果反推。燃气轮机消耗天然气的费用等于气价乘以耗气量而耗气量通过发电功率和发电效率计算V_gas(t) P_GT(t) / (η_e * LHV_gas)。LHV_gas是天然气低位热值工程上常取9.7 kWh/m³左右。这里有个细节如果气价优势不明显模型会选择购买电网电而不是自发电这是完全正常的经济决策。购电费用用分时电价乘以购电功率得到售电收益用售电价乘以售电功率减去。运维成本按设备出力的系数计算经常被新手忽略但它决定了机组出力分配倾向。碳排放成本则由碳排放总量乘以碳价得出碳排放主要来自天然气燃烧和外购电对应的煤电排放作为目标函数的一部分参与调度决策。最终目标函数写成min Σ [ c_gas * V_gas(t) c_buy(t) * P_buy(t) - c_sell(t) * P_sell(t) c_om_gt * P_gt(t) ... c_carbon * (Emission_gt(t) Emission_buy(t)) ]。写成这种综合成本形式后求解器输出的调度策略天然就带有经济性和低碳性的双重考虑。实际运行中如果只想算纯经济成本把碳价设为0即可非常灵活。3. MATLAB程序实现细节3.1 程序总体架构与文件规划代码不是在单个脚本里从头写到尾而是分模块组织这样后续扩展储能、电转气、氢能设备的时候不用推翻重来。我把程序拆成5个文件main.m负责主流程调度、data_input.m集中管理所有参数、build_model.m构建决策变量和约束、solve_optimization.m负责求解器配置和调用、plot_result.m绘制调度结果曲线。main.m的逻辑很简单读取参数→构建模型→求解→输出结果。用脚本路径区分数据文件夹和结果文件夹保证每次运行后的结果曲线直接保存成png图片方便对比不同参数下的方案差异。这种结构对新手很友好改参数时完全不用动模型代码只改data_input.m里的数值就行。3.2 数据准备负荷曲线与能源价格数据是程序运行的起点也是所有问题的根源。负荷数据要求24小时逐时值单位kW。光伏出力也要求逐时值可以使用典型日曲线。能源价格方面电网购电价格采用分时电价峰平谷各有不同数值售电价格一般低于购电价避免模型通过买电卖电套利形成循环。下面是我常用的典型参数表参数数值单位燃气轮机额定功率500kW燃气轮机发电效率0.4-余热回收效率0.6-电锅炉热效率0.95-电制冷机COP3.5-吸收式制冷COP1.2-天然气低位热值9.7kWh/m³天然气价格3.2元/m³储能容量400kWh储能充放效率0.95 / 0.95-储能SOC区间[0.2, 0.9]-分时电价按峰时段8:00-11:0018:00-21:001.1元/kWh、平时段6:00-8:0011:00-18:000.7元/kWh、谷时段23:00-6:000.35元/kWh设置。这套参数是我从几个实际微网项目里汇总出来的典型值可以直接作为初算基准确认程序逻辑是否正确。3.3 YALMIP建模核心代码YALMIP建模是程序的核心环节核心代码段如下% 决策变量定义 P_gt sdpvar(1, 24, full); P_buy sdpvar(1, 24, full); P_sell sdpvar(1, 24, full); P_ec sdpvar(1, 24, full); P_eb sdpvar(1, 24, full); Q_ac sdpvar(1, 24, full); P_ch sdpvar(1, 24, full); P_dis sdpvar(1, 24, full); SOC sdpvar(1, 24, full); u_gt binvar(1, 24); u_ch binvar(1, 24); u_dis binvar(1, 24); % 目标函数 V_gas P_gt / (eta_gt * LHV_gas); obj sum(c_buy .* P_buy) sum(c_gas .* V_gas) - sum(c_sell .* P_sell) ... sum(c_om_gt .* P_gt) sum(c_om_ec .* P_ec) sum(c_om_eb .* P_eb) ... sum(c_om_ac .* Q_ac); Constraints []; for t 1:24 % 电平衡约束 Constraints [Constraints, P_gt(t) P_pv(t) P_dis(t) P_buy(t) ... P_load_e(t) P_ec(t) P_eb(t) P_ch(t) P_sell(t)]; % 热平衡约束 Constraints [Constraints, Q_hr(t) P_eb(t) P_load_h(t)]; % 冷平衡约束 Constraints [Constraints, Q_ac(t) P_ec(t) P_load_c(t)]; % 设备出力上下限 Constraints [Constraints, 0 P_gt(t) P_gt_max * u_gt(t)]; end % 求解 ops sdpsettings(solver, gurobi, verbose, 2); optimize(Constraints, obj, ops);注意热平衡约束里Q_hr我单独处理成输入变量或由P_gt推导的表达式。严谨做法是写成Q_hr Q_rec_rate * V_gas * LHV_gas * eta_hr把它作为中间变量嵌入模型。在YALMIP中可以直接用表达式定义这个中间变量不用显式新建决策变量。3.4 结果输出与图表绘制求解完成后要做的第一件事不是画图而是检查求解状态。YALMIP返回的sol.problem字段如果是0表示求解成功如果是1或其他非零值说明模型不可行或求解异常直接画图没有意义。我会在main.m里加一个状态判断非零时立即输出错误日志并终止后续步骤。画图部分用MATLAB的plot函数把电功率平衡、热功率平衡、冷功率平衡、储能SOC四条曲线分别绘制在四个子图里。这样一眼能看出每个时刻各设备出力是否合理、储能是否在谷段充电峰段放电、燃气轮机是否在峰电时段运行。另一个非常有用的输出是成本明细表把购电费用、燃气费用、运维费用、碳排放费用分开汇总方便横向对比不同方案。4. 典型场景实测某园区微网24小时优化4.1 场景设置与参数为了验证程序逻辑我建了一个模拟园区场景办公室和商业混合用电典型夏季日负荷峰值电负荷约700kW热负荷80kW冷负荷500kW。光伏装机200kW中午时段出力最高。燃气轮机额定500kW储能容量400kWh。目标函数包含碳价碳价设为每吨50元。天然气价格3.2元/m³分时电价按上一节表格。这个场景的难点在于冷负荷峰值出现在下午而燃气轮机发电高峰跟随电负荷峰时。如果只考虑电平衡冷负荷可能全由电制冷机承担电负荷会被额外推高反过来迫使燃气轮机或电网多供电。程序中冷热电耦合关系会自行权衡下午电价平段、光伏出力下降时到底是将燃气轮机多发出来的电用于电制冷还是让余热驱动的吸收式制冷机多出力。4.2 优化结果解读求解器选Gurobi求解耗时约0.4秒。优化后的调度曲线有几个明显特征。第一燃气轮机几乎全程运行但出力跟随电价变化峰电时段接近满发谷电时段降到一个较低的稳定出力点。第二吸收式制冷机在白天占据主导地位因为它利用的是燃气轮机余热边际成本非常低而电制冷机主要在夜间和冷负荷尖峰时段补充供冷。第三储能在谷时充电上午和傍晚两个峰段放电符合峰谷套利逻辑。总成本核算下来一天运行成本约万元级别具体数值因负荷而异。与未优化方案相比储能少做了很多无效启停燃气轮机和电制冷机的配合更加顺畅系统总费用下降了大概15%到20%。这个降幅主要来源于两个分时电价下储能峰谷套利的直接收益以及吸收式制冷替代电制冷带来的电耗减少。4.3 与不耦合、不优化方案对比做对比实验时我把模型中的热耦合项舍弃让燃气轮机只发电、余热直接弃掉此时冷负荷全部由电制冷机承担。结果很有意思从纯电平衡角度看系统可行性没问题但总成本和碳排放明显上升。原因很简单余热被扔掉等于白白损失了一部分能源价值而电制冷机多消耗的电又得从电网或燃气轮机补充形成了一种恶性循环。另一个对比是不做任何优化采用经验规则调度燃气轮机在营业时段全开、储能按固定时间充放。这种方案在负荷平稳时问题不大一旦负荷波动大或电价曲线复杂结果就会偏离最优解。我的体会是耦合优化的价值不仅在于“省钱”还在于它帮你找到不同能源形式之间的最佳比例关系这是人工经验很难做到的事。5. 常见问题与调试心得5.1 求解失败与不可行模型排查程序调试过程中遇到最多的问题就是模型不可行。求解器返回infeasible时不要急着改约束而是用“约束逐条注释法”定位问题。先把冷平衡约束注释掉跑一遍如果变可行说明问题出在冷平衡方程再检查是制冷总容量不够还是吸收式制冷与电制冷容量分配有问题。另一个常见原因是储能SOC初值和末值设置冲突。很多初学者设了SOC(1)0.5、SOC(24)0.5却忽略了充放电过程中的能量损耗导致模型数学上不可满足。解法是把末值约束放宽成区间[0.4, 0.6]而不是固定值。还有一个非常重要但容易被忽视的点YALMIP对变量的定界会影响求解效率。如果某台设备的功率上限写错导致变量区间过大求解器会产生大量无效搜索分支求解时间从0.4秒膨胀到几十秒甚至几分钟。写参数时养成习惯所有容量和上下限直接在data_input.m里统一定义一份不要散落代码各处。5.2 参数敏感性价格策略对调度结果的影响参数敏感性测试能帮你找到整个系统经济性的关键杠杆。我把天然气价格从3.2元/m³调到3.8元/m³后燃气轮机的出力曲线发生了明显变化峰时峰值功率不降反升但谷时出力进一步压低甚至出现部分时段停机。原因是天然气价格上涨后燃气轮机的启动成本被摊薄模型更倾向于在高峰时段满负荷运行低谷时段直接买电维持系统运行。分时电价变化的影响更直接。当峰谷价差从0.75元/kWh缩小到0.4元/kWh时储能套利收益降低优化结果中储能的充放电频率明显减少部分时段甚至不充不放。这个测试告诉我们做综合能源项目前一定要先看当地的峰谷电价结构如果峰谷差过小储能可能完全没有经济性配置储能就是纯成本包袱。程序跑出来的现象能够直接指导前期方案设计这是这套模型最实用的价值。5.3 程序扩展方向基础版程序跑通后扩展性非常关键。我目前已经做过的扩展包括加入电转气P2G模块、加入蓄热罐模型、加入电动汽车有序充电约束。每加一种设备只需要在build_model.m里新增对应变量、补充平衡约束和设备约束目标函数里增加对应成本项其余代码结构完全不变。如果想进一步提高模型精度可以把固定效率换成部分负荷效率曲线用分段线性化的方式处理非线性关系这样模型仍然是MILP求解效率高精度也能接受。还可以把单目标优化换成多场景随机优化对光伏和负荷的不确定性做鲁棒优化。这些扩展路径都比较成熟需要的话我会在后续文章里逐个展开。从我个人调试经验看综合能源耦合微网优化最容易出问题的地方不在求解器而在模型本身对“耦合”的理解。很多同学把CCHP的模型做成三条独立能量流的简单相加那其实没有真正利用好耦合的价值。必须让燃气轮机的发电和余热回收在同一个方程里产生联动让吸收式制冷机成为冷负荷的重要来源让储能配合电价曲线灵活调节。把这个逻辑理顺程序跑出来的结果自然就会符合工程常识。

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

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

免费获取报价 →
↑