
简介本资源面向能源系统建模与优化领域的研究生、科研人员及电力/燃气/热力行业工程师提供一套完整的电-气-热综合能源系统多网耦合优化调度MATLAB实现方案。针对电网、气网与热网协同运行中的非线性耦合难题代码构建了含10机39节点电网采用直流潮流模型、比利时20节点配气网经线性化处理及热网的联合调度模型支持YALMIP调用CPLEX或Gurobi求解器进行高效求解适用于综合能源系统规划、运行仿真与低碳调度研究场景。压缩包为RAR格式共16.66MB包含核心建模脚本、参数配置文件、算例数据及完整求解流程代码无文档类文件所有内容聚焦于可直接运行的数值优化实现。目前已有3666人学习下载读者可直接复现多能流耦合建模、跨网能量交互约束设置、线性化技巧应用及大规模混合整数规划求解全过程具备强工程落地参考价值。 做综合能源优化调度这几年我手上攒了不少资料其中一份标记着“20-电-气-热综合能源系统优化调度”的压缩包算是我最常翻出来参考的合集之一。它的名字很直白里面装的正是电-气-热三类能源耦合系统的优化调度模型、代码和文档。今天我把这份资料的核心内容、我用它复现调度方案时踩过的坑以及从建模到求解的完整思路整理出来给正在做综合能源系统、园区级多能互补或者微电网优化调度的朋友一个可直接上手的参考。这份资料适合谁简单说三类人最需要一是刚入门综合能源、想找一个标准算例练手的硕士生二是做园区能源规划、需要快速搭建日前调度方案的工程师三是想对比不同求解器、不同建模风格的研究人员。它能帮你解决的问题也很具体风电光伏怎么消纳、CHP机组和电锅炉怎么配合、气网和热网的约束怎么进模型以及最关键的——多能源耦合的优化问题到底怎么又快又稳地求出最优解。1. 电-气-热联供系统先搞清楚我们在优化什么1.1 为什么要把电、气、热放在同一个模型里传统电力系统调度只看电源和负荷天然气管网和热力管网往往各管各的。但到了综合能源系统里这三张网是绑在一起的天然气进燃气轮机发电余热进余热锅炉供热电锅炉可以把低谷电变成热P2G电转气装置又能把富余风电变成天然气。任何一个环节的波动都会沿着耦合设备传导到另外两张网里。所以电-气-热联合调度的本质是把三张网的运行约束放到一个优化问题里同时求解而不是分开算完再人为协调。分开算的问题在于电网调度看到的风电消纳空间可能因为气网供气不足而实际达不到热网按自己的热负荷曲线安排热电联产机组出力又可能反过来挤压电网的调峰空间。只有联合优化才能把这种耦合关系真正体现出来。打个比方单独调度就像三个人各端各的盘子排队打菜联合调度则是三个人一起商量着怎么把菜打得不浪费。对系统运行者来说联合优化带来的是真金白银的收益——燃料成本更省、弃风弃光更少、设备出力更均衡。1.2 这份资料里的系统框架和典型拓扑资料包里的模型基准拓扑是这样的电网侧有常规火电机组、风电场、光伏电站通过母线向电负荷供电气网侧有气源节点、天然气管道和储气罐向燃气轮机供气热网侧有燃气锅炉、余热锅炉、电锅炉和蓄热罐通过供热管道向热负荷供热。关键的耦合设备有三组CHP机组热电联产天然气进去电和热同时出来是电热气三网耦合最核心的设备。模型里通常用热电比可调或者定热电比两种方式描述。P2G装置消耗电能生产天然气实现电到气的单向转换。在新能源渗透率高的场景下它是消纳弃风的利器。电锅炉和热泵用电产热相当于在电网上加了一个灵活的热负荷可以主动调节用电时段来配合新能源出力。这套拓扑不是随便拍的它覆盖了综合能源系统最常见的几种耦合方式气到电燃气轮机、气到热燃气锅炉、电到热电锅炉、电到气P2G、热到电热回收后再发电的情况相对少见但CHP机组本身就内含这个逻辑。照着这套拓扑建模型做完之后要扩展到更复杂的系统只需要在节点和支路上做加法就行不用推翻重来。1.3 优化调度的目标函数成本、碳排和能效怎么权衡优化调度的目标函数是模型的心脏。资料里给出的典型目标是最小化系统总运行成本主要包括购能成本从电网买电的费用、从气网购天然气的费用。燃料成本火电机组的煤耗成本CHP机组和燃气锅炉的耗气成本。运行维护成本各设备的单位出力运维费用。弃风弃光惩罚成本新能源实际出力低于预测出力时按弃电量加惩罚。碳排成本如果做碳排放约束需要把CO2排放量乘以碳价计入目标。有些场景还会把目标设成最小化碳排放、最大化新能源消纳率或者多目标同时考虑。资料里给了一个双层模型的框架上层做容量配置下层做运行调度——但如果你只是做运行优化不需要动上层直接用下层模型就行。我个人的建议是第一版模型先只做单目标经济性最优把约束全部跑通再逐步加碳约束、加多目标。一上来就搞多目标目标函数权重的处理会让人非常头疼而且不利于调试。我见过太多人在第一步就因为目标函数太复杂后面建模全乱套。2. 建模的关键细节这三张网的约束必须这么写2.1 电网约束节点功率平衡之外的三个隐藏坑电网部分的约束最基础的是节点功率平衡方程即各电源出力之和等于各负荷消耗之和加网损。基础归基础实际建模时有三个坑很常见坑一没有区分决策变量和参数。风电、光伏出力在调度模型中通常作为已知参数预测值输入而不是决策变量。如果你把它们设成决策变量求解器会自己“调整”风电出力去凑平衡出来的结果就是弃风率为零完全失真。坑二忽略爬坡约束。火电机组和CHP机组不是想发多少就发多少一分钟内出力变化有限制。很多新手写的模型里只有出力上下限没有爬坡约束结果调度方案里机组出力跳来跳去现场根本执行不了。坑三备用约束缺失。实际调度必须留出旋转备用容量应对预测误差。资料里这个模型至少考虑了负荷备用和事故备用我在做工程化改造时还加了新能源预测误差带来的备用需求效果更稳妥。电网部分的约束写完之后建议做一个自检把CHP机组出力置零跑一下纯电网模型看结果是否符合常规电力系统调度逻辑。这一步能很快暴露功率平衡和约束写错的问题。2.2 气网约束Weymouth方程线性化是最大分水岭气网和电网最大的不同在于电网的潮流方程在常规工况下可以近似线性而气网管道流量和节点压力的关系是强非线性的。典型的气网稳态模型里管道流量由Weymouth方程描述它把流量平方和管道两端压力平方差挂钩。这个非线性项如果直接丢给求解器求解速度会非常感人。所以资料里的模型采用了分段线性化的办法把管道流量分成若干段在每一段内将压力平方差与流量的关系线性近似引入0-1变量表示流量方向。这样处理后原本的非线性规划NLP问题就变成了混合整数线性规划MILP问题CPLEX、Gurobi这些商用求解器就能很快求解。还有一个容易漏的约束是气源供气能力约束包括气源最大供气量和供气爬坡速率。很多园区级综合能源系统里气网被简化为一个“无限气源”但这在工程上是站不住脚的——尤其是北方冬季采暖季气源本身就很紧张天然气的供应会实实在在影响热电联产机组的出力上限。2.3 热网约束温度动态和节点混合模型热网建模是整个系统里最容易被低估的部分。很多人以为热网约束就是热功率平衡其实严格来说不只是一定时段的平衡还包括供热介质的温度传递过程。资料里的热网模型采用的是节点法nodal method核心变量是各节点的供水和回水温度。热网约束主要包括热源和热负荷节点的热量平衡、管道温降方程热水在管道里流动会散热的、节点温度混合约束。管道温降和温度混合约束使得热网具有“惯性”——热负荷的波动不会瞬间反映到热源这给了蓄热罐很好的调节空间。对于做运行优化的公众号资料来说节点法已经足够用了。如果你要做的是短期小时级调度可以把热网简化为准稳态模型即认为每个调度时段内温度场是稳态的只考虑时段间的能量累积。但如果你做的是秒级或分钟级控制就必须建热网动态模型用偏微分方程描述温度波在管道中的传播那个复杂度会上一个台阶。热网还有一个特性热负荷的预测精度通常比电负荷差。所以做调度时热负荷的预测误差处理一定要在模型里留出裕度否则实际运行中供热温度会飘。2.4 耦合设备约束CHP、P2G、储热罐的运行域建模耦合设备是综合能源系统区别于单一能源系统的本质所在。它们的约束写得准不准直接决定了优化结果靠不靠谱。CHP机组的建模有两种常见方式定热电比模型和可行域模型。定热电比简单但会限制机组调节的灵活性。资料里用的是可行域模型——把CHP机组的电出力和热出力构成一个二维多边形可行域机组只能在这个多边形内部运行。这个约束用一组线性不等式就能表达非常适合MILP求解。CHP还有启停状态的约束包括最小开停机时间这部分非常重要因为频繁启停机组在工程上是不允许的。P2G装置的核心约束是电转气的效率通常3.5-5 kWh电转1立方米天然气和爬坡约束。很多模型还会考虑P2G产出的天然气直接注入燃气管网与气网耦合。这里有个容易被忽略的细节P2G产出的天然气组分与天然气管网里的天然气不完全一致热值有差异严格来说气网混入P2G气体后需要在节点处做热值修正。但从优化运行的角度大多数研究都简化处理为直接等热值注入工程上采用这种方式问题不大。蓄热罐的建模核心是能量状态约束SOC类似于电池的荷电状态包括充放热功率限制、容量限制和启停限制。蓄热罐最大的价值在于解耦热负荷与热电联产机组——白天电价高时让CHP多发电多余的热量存进蓄热罐夜间电价低时用蓄热罐放热CHP少发电。这个“移热”逻辑是综合能源系统经济性的重要来源之一。3. 求解实践从MATLABYalmip到真实数据完整跑通一个案例3.1 工具选型为什么我推荐MATLABYalmip求解器资料包里附带的代码是用MATLAB写的我需要说明代码中使用的建模工具是Yalmip工具箱求解器用的是CPLEX和Gurobi。这套配置在国内学术界和企业仿真验证中几乎成了事实标准原因有三Yalmip语法极其友好写约束就像写数学公式变量定义、约束添加、求解调用都非常直观调试体验远好于直接调CPLEX的C API。注意MATLAB R2021a以后版本对Gurobi的支持需要额外配置建议先装Yalmip再装求解器Yalmip新版会自动检测求解器路径。CPLEX和Gurobi的MILP求解性能在同类求解器中处于第一梯队对于上千个变量、几千条约束的综合能源优化模型通常几十秒到几分钟就能求出全局最优解。后处理方便优化结果直接是MATLAB数组画Gantt图、负载曲线、热力出力图都极其顺手不用像Python那样再转一遍数据结构。如果不想用MATLABPython的Pyomo或者调用Gurobi的Python接口也可以替代。但我个人体会是做这类典型的能源系统优化调度问题MATLABYalmip的调试效率还是最高的——尤其是你需要快速验证一个约束写法是否正确的时候MATLAB的断点调试和变量查看功能帮了大忙。3.2 典型日前调度模型的结构和参数设置资料里的核心算例是一个典型冬季日的日前调度时间尺度为24小时步长1小时。系统参数大致如下设备容量/参数说明火电机组200 MW × 2台爬坡率20 MW/hCHP机组电出力40-120 MW热出力0-80 MW可行域多边形描述燃气锅炉0-60 MW热出力效率0.9电锅炉0-50 MW热出力效率0.95风电场装机100 MW预测出力曲线输入光伏电站装机50 MW预测出力曲线输入P2G装置0-20 MW电输入效率0.6蓄热罐容量200 MWh最大充放热功率50 MW初始SOC 50%负荷侧电负荷曲线昼高夜低峰值约280 MW热负荷曲线受温度影响夜间和清晨较高峰值约180 MW。目标函数是最小化总运行成本约束包括三网的平衡约束、设备约束、备用约束和网络安全约束这里简化处理为不越限。写代码时把系统参数全部集中定义在结构体变量里方便统一修改和灵敏度分析。3.3 关键代码结构Yalmip建模的核心三段式用Yalmip建模综合能源优化问题代码结构基本是固定的“三段式”定义变量、写约束、调求解器。我把资料里的核心逻辑抽取出来供大家参考。%% 定义决策变量 % 火电出力 P_thermal sdpvar(2, 24, full); % 2台火电机组24小时 % CHP电出力与热出力 P_chp sdpvar(1, 24, full); % CHP电出力 H_chp sdpvar(1, 24, full); % CHP热出力 % 燃气锅炉热出力 H_gb sdpvar(1, 24, full); % 电锅炉热出力 H_eb sdpvar(1, 24, full); % 弃风弃光量 curtail_w sdpvar(1, 24, full); curtail_pv sdpvar(1, 24, full); % 蓄热罐SOC和充放热功率 soc_tes sdpvar(1, 25, full); % 注意是25个时刻0-24 charge_tes sdpvar(1, 24, full); discharge_tes sdpvar(1, 24, full); % 购电量和购气量 buy_e sdpvar(1, 24, full); buy_gas sdpvar(1, 24, full); %% 约束条件 Constraints []; % 1. 电功率平衡 for t 1:24 Constraints [Constraints, ... sum(P_thermal(:, t)) P_chp(1, t) P_w(1, t) - curtail_w(1, t) ... P_pv(1, t) - curtail_pv(1, t) buy_e(1, t) ... P_load(1, t) H_eb(1, t) / 0.95 P_p2g(1, t)]; end % 2. 热功率平衡 for t 1:24 Constraints [Constraints, ... H_chp(1, t) H_gb(1, t) H_eb(1, t) ... discharge_tes(1, t) - charge_tes(1, t) H_load(1, t)]; end % 3. CHP可行域约束简化写法 for t 1:24 Constraints [Constraints, ... 0 P_chp(1, t) 120, ... 0 H_chp(1, t) 80, ... P_chp(1, t) 0.5 * H_chp(1, t) 40, ... P_chp(1, t) 0.5 * H_chp(1, t) 160]; end % 4. 蓄热罐SOC递推 for t 1:24 Constraints [Constraints, ... soc_tes(1, t1) soc_tes(1, t) ... (charge_tes(1, t) * 0.95 - discharge_tes(1, t) / 0.95)]; end %% 目标函数与求解 objective sum(sum(thermal_cost .* P_thermal)) ... sum(gas_price * (buy_gas gas_chp gas_gb)) ... sum(penalty_w * curtail_w penalty_pv * curtail_pv); options sdpsettings(solver, gurobi, verbose, 2, gurobi.MIPGap, 0.005); optimize(Constraints, objective, options);这段代码的结构非常清晰核心就是把每个设备的决策变量定义好然后逐类写约束最后调用Gurobi求解。这里有三个细节需要特别提示SOC的维度要比调度时段多1因为0时刻有初值24时刻有末值25个点才有24个递推关系。充电和放电同时为正会浪费目标目标函数里运行成本没有直接惩罚充放同时进行但这种情况会通过效率损失自动被排除如果实际运行中还是出现需要加一个二进制变量约束充放互斥。MIPGap参数很关键实际算例规模较大时Gurobi默认MIPGap相对对偶间隙设到0.01就够用但如果你追求更高精度的全局最优解调到0.001或更小代价是求解时间可能变长。3.4 求解结果解读从数字到可执行的调度方案优化求解完成后不要急着画图先做三件事第一检查求解状态和最优性间隙。Yalmip返回的optimize状态如果是“Successfully solved”不代表一定有解精度足够好要查看Gurobi终端输出的MIPGap是否达到预期。一般MIPGap在0.5%以内就足够工程使用了。第二核对系统平衡。把每小时的电源出力加起来减去负荷和电锅炉/P2G用电应该等于零。热网同理。这一步能快速发现模型写错或者数据不一致的地方。第三分析调度策略的合理性。典型的结果应该是夜间风电大发时P2G和电锅炉多用电蓄热罐充电白天电价高峰期CHP满发蓄热罐放热火电机组做基核和调峰配合。如果结果出现“谷时段CHP满发、峰时段停机”这种违反直觉的局面多半是约束条件遗漏或者目标函数系数有问题。资料里还有两个改进版本的代码一个加了储气罐模型另一个加了需求响应电负荷和热负荷的部分可调度性。这两个版本可以作为进阶练习建议先跑通基础版再逐步加。4. 实际项目中最常见的五个坑4.1 数据单位不统一结果完全失真综合能源系统涉及多种能源介质单位的坑特别多。天然气单位立方米Nm³和能量单位千瓦时kWh之间要乘热值典型值9.97 kWh/Nm³热负荷单位可能是MW也可能是GJ/h电价的单位可能是元/MWh也可能是元/kWh一个不留神结果就差了数量级。我的做法是在所有参数进入模型之前先统一转换成国际单位制功率统一用MW能量统一用MWh热量统一用MWt热功率天然气统一用MWh按热值折算。在代码开头做一个单位转换表明确标注每个参数的原始单位和转换后的单位能避免90%的低级错误。4.2 热网模型太简化调度结果现场执行不了资料里的基础版热网模型对热网采用定温度或者简单温降模型。但实际热网尤其是多热源环形管网热源之间的压力耦合和流量分配很复杂运行中经常出现模型预测的热负荷分配和实际不一致的情况。解决思路是调度模型用简化热网短期预测模型用精细热网。调度软件输出的是各热源的总热出力精细热网模型根据总热出力做全网水力计算和温度分布计算再把计算结果反馈给调度模型做边界修正。这种“粗调度细校核”的模式在工程上非常实用。4.3 忽略网络约束优化结果过于乐观大多数综合能源优化调度的学术论文为了简化计算不考虑电网的线路潮流约束。但实际园区里线路容量和变压器容量往往是瓶颈。如果模型不考虑这些约束优化结果里可能出现某一台变压器过载、某一条10 kV线路越限的情况。工程化的方案是在传统节点功率平衡之外增加关键断面的传输功率限制约束。你可以先做一次不考虑网络约束的优化检查结果里哪些线路会越限然后把这些线路的最大功率限制加入模型迭代求解两三轮就能收敛到一个考虑网络约束的可行方案。4.4 求解时间过长怎么调都不收敛MILP模型求解时间过长通常有三个原因一是整数变量太多比如每个设备每个时段都设了启停变量二是约束写得过宽导致搜索空间太大三是求解器参数没有调优。我的经验是先用“松弛连续化”去定位问题——把所有0-1整数变量允许实数化看松弛后的LP问题是否能在几秒内求解。如果LP问题本身就慢说明是约束或数据的问题如果LP快但MILP慢问题在整数变量规模和分支策略上这时候优先考虑减少整数变量数量。例如CHP机组如果不需要考虑启停就不要加0-1变量蓄热罐的充放状态有时候可以靠效率损耗天然排除同时充放就不需要额外增加互斥变量。4.5 多重时间尺度耦合问题单层模型无法描述实际运行中电网调度是分钟级甚至秒级的热网过程则是小时级的气网更慢。把这三种时间尺度塞进一个小时级模型里本质上是一种近似。资料后面的进阶版本里加入了一个双层模型上层做日前小时级调度下层做日内15分钟级修正能在一定程度上缓解这个问题。做这类多层模型时最需要注意的是上下层变量的传递一致性。很多人在上层模型里定了机组启停状态下层却因为负荷变化临时又启停机组导致两层结果矛盾。建议下层模型把上层的启停变量作为固定参数只优化出力大小而不是全部放开。5. 资料包里的拓展价值与实操建议5.1 从基础算例到工程项目的迁移路径资料包里的基础算例虽然规模不大但它是整个综合能源优化调度问题的“最小完备集”。你把它彻底跑通、吃透之后往实际工程项目迁移的路径是清晰的换成真实拓扑把单母线扩展为多节点网络加入支路潮流约束。换成真实数据用SCADA的历史数据、天气预报数据、气网供气数据替换示例数据。加入更多设备储能电池、冷热电三联供、地源热泵、氢储能等。对接控制系统把优化结果传给EMS能量管理系统作为运行计划。这一步一步的扩展每一步都在基础模型上加代码、加约束但整体的建模框架和求解思路保持不变。我用这套路径带过不少新人基本都能在两个星期内从零跑到能复现论文结果的水平。5.2 压缩包的完整性和校验再补充一个跟压缩包本身相关的小提示。我在网上下载这类资料时踩过几次坑文件没下完整导致解压失败或是解压时杀毒软件误删了里面的可执行文件通常是破解版求解器的dll文件。所以拿到“20-电-气-热综合能源系统优化调度.rar”这类资料包建议按这个顺序处理解压前先校验压缩包大小与发布页标注的大小对照。解压时暂时关闭杀毒软件实时监控解压完成后再扫描。解压路径不要带中文和空格很多MATLAB工具箱和求解器对路径极敏感。先看README或说明文档确认所需的MATLAB版本、工具箱版本、求解器版本再决定后续环境配置。如果压缩包比较大超过2GB可以考虑用分包压缩的方式把大文件拆成多个小分卷下载时一个卷一个卷确认完整性避免单文件下载失败导致整个包作废。5.3 后续可以自己扩展的方向如果你跑通了这套算例还想再进一步我强烈建议自己做这样三个扩展加一个储能电池储能电池的SOC递推和蓄热罐很像但电约束和热约束的耦合带来新的优化空间。你会发现加了储能后系统的经济性又提升一个档次。做一次灵敏度分析把气价、碳价、新能源渗透率分别做±20%的波动观察系统总成本和各设备出力的变化这是写论文时最常用的分析工具。换一个求解器对比同样的模型用CPLEX和Gurobi分别求解对比求解时间和内存占用这对你理解求解器差异非常有帮助。这些扩展工作做完你对综合能源优化调度的理解就会从“会跑代码”提升到“会设计模型”的层次。6. 频繁被问到的细节问题速查这部分把大家常问的问题做一个快速解答方便后续查阅。Q1为什么我的模型一直提示不可行A先查约束是否矛盾。最常见的是电功率平衡约束里负荷加电锅炉用电加P2G用电超过了所有电源最大出力之和。把每个时段的可再生出力置最大值、火电CHP置最大值算一下出力和负荷的差值能很快定位。Q2蓄热罐SOC的初值和末值应该怎么设置A日前调度建议初值设为50%左右末值不约束或者约束为不低于初值。如果末值必须回到初值比如做多日连续调度需要在模型里加soc_tes(1,25) soc_tes(1,1)这个约束。Q3P2G的效率系数怎么取值A电转氢效率约70%-80%氢再与CO2反应制甲烷效率约50%-60%整个过程电转天然气的综合效率在45%-60%之间。模型里一般取0.5-0.6比较合理。取值不同P2G的利用率和系统的弃风率都会有明显变化可以做效率灵敏度分析。Q4风功率预测曲线和实际偏差很大模型怎么处理A这里有两条路。一是把风电出力作为区间数做鲁棒优化二是做场景随机优化给预测曲线加误差场景。资料里基础版是确定性模型进阶版加了场景削减技术基于K-means聚类把1000个误差场景削减到10个典型场景参与优化这个方法非常实用。Q5CHP机组的热电比约束是按定值写还是按可行域写A如果你的CHP是背压机组热电比基本恒定用定值写没有问题。但如果是抽汽凝汽式机组热电比可在一定范围内调节必须用可行域建模。资料里两种写法都提供了我倾向于建议优先用可行域写法。Q6模型能扩展到冷-热-电联供吗A可以。在现有电热气模型基础上加一个吸收式制冷机和电制冷机把冷负荷加进平衡方程再加一个蓄冷罐模型就扩展成冷热电联供CCHP了。冷网的特性介于电网和热网之间建模比热网略简单。这些问题是这几年做咨询带新人的时候反复被问到的几乎每一个都能写一篇单独的文章。如果你在跑通这份资料的时候遇到其他问题建议先查建模约束再查数据然后检查求解器设置——大多数问题出在这三个环节里的某一个。我个人在实际操作中的体会是做综合能源优化调度代码能力只是基本功最核心的能力是把物理系统的运行逻辑准确翻译成数学约束。这份“电-气-热综合能源系统优化调度”资料包的价值恰恰在于它把这个翻译过程演示得足够清楚——从目标函数到约束条件从设备模型到求解实现每一步都能对照着代码反推物理含义。你把它彻底吃透之后再去看任何复杂的综合能源项目脑子里都会有一个清晰的建模框架在兜底。本文还有配套的精品资源点击获取