尧图精选

虚拟电厂优化调度中的阶梯碳交易与P2G-CCS掺氢联合建模实践

🕒 发布时间:2026/10/1 4:05:15 📁 来源:尧图网络
VPP 优化调度这个方向这几年的热度一直没降过。尤其是把碳交易机制加进来之后很多传统只做“经济调度”的模型立刻就不够用了——因为碳成本不再是固定的外部参数而是会随着排放区间变化、直接影响机组启停决策的变量。我这次做的项目就是把阶梯碳交易、P2G-CCS 耦合和燃气掺氢三件事揉进同一个虚拟电厂优化调度框架里用 Matlab 完整实现并跑通仿真。这篇文章不绕弯子直接讲清楚模型怎么搭、代码怎么落、坑在哪里。很多人一看到“P2G-CCS”“掺氢”“阶梯碳”这几个词堆在一起第一反应是复杂度爆炸。实际拆开来看这本质是一个混合整数线性规划问题燃气机组、电解槽、甲烷化反应器、碳捕集装置、储氢罐、掺氢燃烧这几大块通过能量流、物料流、碳排放流耦合在一起目标函数在考虑运行成本和碳交易成本之间做权衡。用 Matlab 的 YALMIP 工具箱建模调 Gurobi 或 Cplex 求解整个过程最耗时间的不是写代码而是把物理约束转换成数学表达式的过程。这篇文章会把我实测过的公式、参数配置、报错排查全部放出来给后面做相关方向的朋友省点时间。1. 项目背景与核心思路1.1 为什么虚拟电厂必须考虑碳交易虚拟电厂本身不发电它靠的是聚合分布式光伏、风电、储能、燃气机组、柔性负荷这些资源通过协调控制对外呈现一个可控电源的特性。传统调度模型里目标函数通常是“系统总运行成本最小”或者“新能源消纳最大”碳排放只是事后统计的一个指标不参与决策。但碳排放权交易市场逐步成熟之后碳成本开始变成真金白银直接影响度电成本。一个燃气机组如果碳排放配额不够就得去市场买碳配额这部分成本高的时候甚至能超过燃料成本。这就引出了一个新问题调度模型必须把碳交易成本纳入目标函数而不是把它当后处理指标。用户给的标题里专门强调“阶梯碳交易”这个进阶点在下面会详细讲。总的来说碳交易机制的引入让虚拟电厂在排碳和减排之间形成了一套经济博弈多排碳要多付钱少排碳可以卖配额赚钱而 P2G-CCS 这套装置刚好是减少碳排放的物理手段。所以整个优化模型的核心矛盾就是如何在满足负荷需求的前提下让“运行成本 碳交易成本”最小化。1.2 阶梯碳交易和普通碳交易的差别国内碳市场目前最主流的分配方式还是免费配额为主超出部分需要购买。市面上很多论文做碳交易时用的是“单一碳价”模型——排放量超过配额直接按固定碳价乘以超额量计算成本。这种方式简单但和真实市场有偏差。实际碳市场中超额量越大边际成本往往越高这种非线性正是阶梯碳交易要模拟的。阶梯碳交易的核心思想是把碳排放量划分成若干区间每个区间设定不同的碳价超额越多、碳价越高。用公式表达就是[ C_{CO2} \begin{cases} \lambda_1 (E - Q), 0 \le E - Q \le d_1 \ \lambda_1 d_1 \lambda_2 (E - Q - d_1), d_1 \le E - Q \le d_2 \ \lambda_1 d_1 \lambda_2 d_2 \lambda_3 (E - Q - d_1 - d_2), E - Q d_2 \end{cases} ]其中(E) 是实际碳排放量(Q) 是无偿分配的碳排放配额(d_1)、(d_2) 是区间长度(\lambda_1)、(\lambda_2)、(\lambda_3) 是各区间碳价且 (\lambda_1 \lambda_2 \lambda_3)。这个结构简单但引入优化模型后有个麻烦事——它是一个分段线性函数带有非凸性。好在可以引入辅助变量把分段函数等价转换成一组线性约束既保留阶梯递增的特征又不破坏 MILP 的可求解性。这部分的代码实现细节我会在第三章专门展开。1.3 P2G-CCS 耦合和燃气掺氢为什么放在一起先解释两个缩写。P2G 是 Power-to-Gas也就是电转气用可再生能源发电驱动电解水制氢再把氢气和二氧化碳通过甲烷化反应合成天然气主要成分是甲烷。CCS 是 Carbon Capture and Storage碳捕集与封存这里特指从燃气机组排气中捕集二氧化碳捕集下来的 CO₂ 一部分可以送去甲烷化反应器作为原料这样就形成了一个循环。燃气掺氢则是在天然气中混入一定比例的氢气直接送入燃气轮机燃烧。掺氢的好处有两个一是氢气燃烧不产生二氧化碳直接降低碳排放二是提供了一种氢气的消纳途径——P2G 产出的氢气如果来不及合成天然气或者储氢罐满了可以按一定比例掺入燃气管道直接烧掉。这三个技术放在一起恰好形成了一个闭环燃气机组发电 → 产生 CO₂CCS 捕集 CO₂ → 一部分送去甲烷化一部分封存可再生能源发电 → P2G 制氢 → 氢气直接掺烧或者和 CO₂ 合成天然气合成天然气和掺氢天然气再送回燃气机组燃烧。整个耦合结构让虚拟电厂从单一的电力供应商变成一个同时在电、气、碳三个市场上互动的综合能源主体。建模的复杂度上来了但优化空间也大了很多。2. 数学模型构建2.1 目标函数设计整个优化调度的目标函数由四块组成机组运行成本、P2G-CCS 耦合单元运行成本、碳交易成本、弃风和弃光惩罚成本。表达式为[ \min F \sum_{t1}^{T} \left( C_{GT,t} C_{P2G,t} C_{CCS,t} C_{CO2,t} C_{curt,t} \right) ]其中 (C_{GT,t}) 是燃气机组燃料成本这里要注意掺氢比例会改变燃料成本的计算方式因为氢气热值和质量都和天然气不同需要按热值折算(C_{P2G,t}) 是电解槽和甲烷化装置的运行维护成本通常按产氢量和产甲烷量线性折算(C_{CCS,t}) 是碳捕集装置运行成本捕集的 CO₂ 越多能耗越大这部分能耗会降低机组净出力需要在功率平衡约束里体现(C_{CO2,t}) 是阶梯碳交易成本按上一节的分段函数计算(C_{curt,t}) 是弃风弃光惩罚项为了保证新能源消纳赋予一个较高的惩罚系数。这个目标函数设计的核心思想是碳交易成本不是独立存在的一项它通过 CCS 捕集量、掺氢比例、P2G 制氢量这几个变量和系统的物理运行状态强耦合。举个最简单的例子如果碳价很高优化器会倾向于多开 CCS、多掺氢、少让机组出力哪怕这会增加运行成本——减排在经济上变划算时调度策略就会自动往低碳倾斜。2.2 P2G-CCS 耦合单元建模P2G-CCS 耦合单元是整个系统里变量最多的部分我把它拆成三个子模块建模。第一个是电解槽。输入是电功率 (P_{el,t})输出是氢气流率 (F_{H2,t})。二者通过电解效率 (\eta_{el}) 关联[ F_{H2,t} \eta_{el} \cdot P_{el,t} / H_{H2} ]其中 (H_{H2}) 是氢气的高热值。电解槽的功率有上下限约束同时还要考虑爬坡约束——很多论文忽略爬坡实际电解槽在快速升降负荷时效率下降明显所以我还是加了线性爬坡限制。第二个是甲烷化反应器。它把氢气和二氧化碳合成甲烷反应式为 (CO_2 4H_2 \rightarrow CH_4 2H_2O)。从建模的角度更关心的是物料平衡[ F_{CH4,t} k_{meth} \cdot F_{H2, meth,t} ]这里 (F_{H2, meth,t}) 是进入甲烷化反应器的氢气量(k_{meth}) 是反应比例系数。进入反应器的二氧化碳量由化学计量比决定需要从 CCS 捕集的 CO₂ 里分配。第三个是 CCS 装置。捕集到的 CO₂ 总流量 (F_{CO2,cap,t}) 与机组出力相关捕集能耗 (P_{CCS,t}) 通常被建模为捕集量的线性函数。我在模型里把捕集到的 CO₂ 分为两路一路进入甲烷化反应器一路送去封存。这样处理的好处是模型可以自由决策“合成天然气”和“直接封存”的比例在碳价高的时候多捕集多利用在碳价低的时候少捕集少耗能。2.3 燃气掺氢建模燃气掺氢环节的建模关键点在于燃料热值变化和碳排放因子变化。设掺氢比例为 (\alpha_t)体积分数天然气和氢气的低位热值分别为 (LHV_{NG}) 和 (LHV_{H2})。混合燃料的总热值输入为[ F_{fuel,t} \cdot LHV_{mix,t} P_{GT,t} / \eta_{GT} ]其中[ LHV_{mix,t} (1-\alpha_t) \cdot LHV_{NG} \alpha_t \cdot LHV_{H2} ]掺氢之后燃气机组的碳排放量需要按混合燃料中的碳含量重新计算。天然气的碳排放因子是 (e_{NG})氢气是零碳所以实际碳排放变为[ E_{GT,t} (1-\alpha_t) \cdot F_{fuel,t} \cdot e_{NG} ]也就是说掺氢比例每提高一个百分点碳排放就近似降低一个百分点实际上因为热值变化燃料流量也会变化但整体趋势线性。不过要注意掺氢比例不是想调多高就调多高受制于燃气轮机的燃烧稳定性。实际工程中低热值燃气轮机对氢气的容忍度在 5% 到 30% 不等老旧机组可能 10% 就到上限了。我在模型里设了一个可调约束 (0 \le \alpha_t \le \alpha_{max})(\alpha_{max}) 一般是 0.2也就是说氢气的体积占比不超过 20%。2.4 电功率平衡和储氢罐约束这部分约束看起来基础但恰恰是最容易写错的地方。电功率平衡要考虑燃气机组净出力、可再生能源出力、电解槽耗电、CCS 耗电、储能充放电、负荷需求[ P_{GT,t} P_{res,t} P_{dis,t} P_{buy,t} P_{load,t} P_{el,t} P_{CCS,t} P_{ch,t} ]关键点在于CCS 的耗电不能漏掉P2G 的耗电不能漏掉否则功率平衡就对不上。我一开始调试的时候算出来的总成本偏低很多查到最后就是 CCS 耗电没有纳入平衡方程。储氢罐约束要注意时序耦合。设 (S_t) 为储氢罐在时段 (t) 结束时的储氢量则[ S_t S_{t-1} F_{H2,t} - F_{H2,meth,t} - F_{H2,blend,t} ]还有容量上下限 (S_{min} \le S_t \le S_{max})以及周期约束 (S_T S_0)保证调度周期前后储氢量一致。这个周期约束写不写对结果差异很大不写的话优化器会把最后一个时段的储氢量清空来降成本表现出来的结果就是前几个时段疯狂储氢、末尾时段大量放氢完全不符合实际运行逻辑。3. Matlab 代码实现与关键点解析3.1 程序整体框架我这套 Matlab 代码的结构大致分五块参数初始化模块、数据输入模块、模型构建模块、求解配置模块、结果输出模块。参数初始化模块负责设置所有的物理参数和经济参数。数据输入模块读入风机和光伏的预测出力曲线、负荷曲线、碳交易参数。模型构建模块用 YALMIP 定义决策变量、目标函数和约束条件。求解配置模块设置求解器参数和终止条件。结果输出模块把优化结果整理成表格和曲线图方便分析。我实测下来用 YALMIP 建模是效率最高的方式。它可以把线性约束用类似自然语言的方式写出来比如Constraints [Constraints, P_GT P_GT_min];不用手动转成标准矩阵形式。底层求解器用的 Gurobi针对 MILP 问题的求解速度比单纯用 Matlab 内置的intlinprog快不少特别是变量数量上千的时候差距非常明显。3.2 关键参数设置参数设置的准确度很大程度上决定了仿真结果是否可信。下面是我实测用的一组基础参数可以直接用来跑通代码再按需调整参数数值说明调度周期 T24 h一天 24 个时段单位 1h燃气机组功率上下限50 MW / 200 MW对应一台中型燃气轮机电解槽功率上限40 MW额定电解功率电解效率 (\eta_{el})0.7碱性电解槽典型值掺氢比例上限 (\alpha_{max})0.2体积分数上限碳配额 Q300 t24h 内免费配额总量阶梯碳价 (\lambda_1, \lambda_2, \lambda_3)50 / 100 / 150 元/t阶梯递增阶梯区间长度 d1, d2100 t / 100 t每个阶梯覆盖的排碳量CCS 捕集效率0.9捕集 CO₂ 占总排放比例CCS 单位能耗0.2 MWh/t捕集每吨 CO₂ 的耗电量这组参数不是凭空拍的基本参考了典型燃气-蒸汽联合循环机组和商业化电解槽的数据。CCS 能耗我用的是 0.2 MWh/t比文献里常见的 0.1-0.3 MWh/t 取中间偏上偏保守一些这样仿真结果更接近工程实际操作中“有损耗”的状态。3.3 约束条件的代码表达这里挑几个容易出错的约束代码讲。第一个是燃气机组的最小启停时间约束用 YALMIP 表达需要引入二进制变量 (u_t) 表示机组启停状态然后连续启动约束写成for t 2:T Constraints [Constraints, u(:,t) - u(:,t-1) u(:, t-1)]; end这段代码看起来简单但它的含义是“如果机组在 t 时段是开机状态且上一个时段是停机状态那么这个启动动作在之前时段已经完成”实际需要配合最小启停时间约束一起用我贴的只是核心片段。完整的表达一般涉及两个辅助变量 (start_t) 和 (stop_t)以及连续 N 个时段的逻辑约束写起来比较啰嗦建议直接用 YALMIP 的implies函数封装成自定义函数不用每次重复写。第二个是阶梯碳交易的线性化转化。前面提到的分段函数我这里用一组连续变量 (E_{1,t}, E_{2,t}, E_{3,t}) 来表示落在不同阶梯的碳排放量约束为E_total Q E_1 E_2 E_3; Constraints [Constraints, 0 E_1 d1]; Constraints [Constraints, 0 E_2 d2]; Constraints [Constraints, E_3 0];注意这里的诀窍在于目标函数里碳交易成本写成 (\lambda_1 E_1 \lambda_2 E_2 \lambda_3 E_3)由于碳价递增优化器会优先填满低价区间自然满足阶梯逻辑不需要额外加二进制变量。这个技巧非常实用能让模型保持纯线性避免引入额外整数变量拖慢求解速度。第三个是掺氢比例和燃料热值的非线性关系。如果直接把 (LHV_{mix}) 写成 ((1-\alpha)\cdot LHV_{NG} \alpha\cdot LHV_{H2})再乘燃料流量 (F_{fuel,t})就会出现两个连续变量相乘的非线性项。解决办法是把 (\alpha \cdot F_{fuel,t}) 当作一个新的连续变量 (F_{H2,fuel,t})表示掺入的氢气流量然后单独约束它小于等于 (\alpha_{max} \cdot F_{fuel,t})。这样化整为零全部线性化。3.4 求解配置与运行效率我用的求解器组合是 YALMIP Gurobi。YALMIP 负责建模Gurobi 负责求解。求解器配置这块有几个经验值得分享。MILP 问题的求解时间对整数变量数量极其敏感。我的模型里整数变量主要是机组启停状态 (u_t)储能充放电状态如果建模了禁止同时充放一共 24 个时段乘以若干个设备整数变量在 50~100 个左右Gurobi 跑下来通常是几秒到几十秒。如果发现求解时间异常长优先检查是不是约束条件里引入了不必要的二进制变量——尤其是阶梯碳交易那块不要为了分段函数暴力引入一堆整数变量。停机准则我设置成 MIPGap 小于 0.1% 就停止。从工程角度看0.1% 的优化差距对调度结果影响很小但能大幅缩短求解时间。追求 0.01% 的 GAP 在实际工程里没有必要尤其是虚拟电厂调度本身就有预测误差模型只是给一个参考基准。YALMIP 的调用方式很简单ops sdpsettings(solver, gurobi, gurobi.MIPGap, 0.001); optimize(Constraints, Objective, ops);如果想换 Cplex把 solver 改成cplex即可约束和目标函数完全不用改。这也是我为啥推荐 YALMIP 的原因——求解器解耦做得干净以后换求解器成本极低。4. 仿真结果分析与敏感性分析4.1 基准场景调度结果我用的测试场景是典型夏季日风电和光伏都有一定出力负荷晚高峰明显。基准参数下求解得到 24 小时调度方案这里说几个最有代表性的结果。掺氢比例在负荷高峰时段接近 20% 上限低负荷时段掺氢比例回落。原因很好理解负荷高峰时燃气机组出力大碳排放高对应碳成本也高此时掺氢的减排价值最大低谷时段机组出力小碳排放少掺氢带来的减排收益不如氢气的其他用途。储氢罐的变化趋势也印证了这一点——白天光伏大发时段电解槽满负荷制氢储氢罐慢慢蓄满傍晚高峰前一部分氢气进入甲烷化反应器、一部分掺入燃气储氢量下降。CCS 捕集量的分配策略很有参考价值。碳价处于中等水平时捕集到的 CO₂ 大部分送去甲烷化反应器合成天然气少部分封存。因为合成的天然气可以直接替代外购燃气节省燃料成本收益比纯封存高。只有当碳排放超额量逼近第二阶梯时封存比例才上升。这说明优化器在做 CCS 运行策略时优先考虑的是“资源化利用”而不是单纯封存——这个结论和很多只考虑碳减排的论文不同更贴近实际经济运行逻辑。4.2 阶梯碳价对调度策略的影响我做了三组对照实验分别是统一碳价 50 元/t、阶梯碳价基础档 50 元/t 递增至 100、以及递增至 150 元/t。结果差异很明显。统一碳价下燃气机组出力基本不受碳排放约束影响系统的 CO₂ 总排放量最高。阶梯碳价下一旦碳排放进入第二阶梯碳价翻倍优化器会明显加大 CCS 捕集率、提高电解槽出力同时降低燃气机组出力、多从电网购电来填补功率缺口。碳价越高新能源消纳率也越高因为多余的可再生能源被用来驱动 P2G 制氢把本来可能的弃电转化成了可存储的氢气。这个结果揭示了一个关键规律阶梯碳交易的价值不在于单纯提高碳价而在于通过价格递增制造“减排拐点”。运营者会算账当边际碳成本超过边际减排成本时减排技术方案自动获得竞争力调度策略随之改变。4.3 掺氢比例上限的敏感性分析我又扫了一遍 (\alpha_{max}) 从 5% 到 30% 的变化。5% 时掺氢基本只是象征性的系统减排主要靠 CCS20% 时减排贡献里掺氢占的比例显著上升同时燃气机组的燃料成本下降因为氢气部分替代了天然气到 30% 时总运行成本继续下降但下降幅度趋缓——原因是受限于电解槽制氢能力和储氢罐容量氢气供应跟不上掺氢需求了。这告诉我们一个制氢侧和用氢侧需要匹配的道理。单纯提高掺氢上限但制氢和储氢的设备容量不匹配高掺氢比例也只能是纸上谈兵。实际项目如果要追求高掺氢比例不只燃气轮机要改造制氢端规模、储氢罐容积、管网的氢脆风险都要一起评估。这个属于工程项目的整体设计问题调度模型只能告诉你经济上的最优解在什么位置。5. 常见问题与调试经验5.1 典型报错排查速查表写 Matlab 代码跑优化模型最常见的坑无非三类维度不匹配、约束过约束/欠约束、求解器数值问题。我整理一张速查表报错或现象可能原因解决办法YALMIP 报Index exceeds array bounds变量索引维度写错检查sdpvar定义时的维度repmat或reshape统一变量形状Gurobi 报Infeasible model约束条件过强无可行解逐步注释约束二分法定位过约束条件优先检查功率平衡和储氢罐容量约束求解结果里有NaN目标函数存在未定义表达式检查是否有变量乘以变量的非线性项残留用yalmiptest检测非凸项求解时间异常长整数变量过多检查是否有冗余的binvar变量优化阶梯函数线性化方法结果不合理如储氢罐最后时段被清空缺少周期约束加上 (S_T S_0) 约束这里重点说一个我踩过几次的坑功率平衡约束漏项。在虚拟电厂模型里CCS 耗电和电解槽耗电都是负荷侧的一部分漏掉任何一项目标函数就会偏低而且这个错误不报错、不退出只是结果悄悄偏离实际。排查方法是用能量守恒做一次全局校验——所有发电出力加上购电减去所有负荷和耗电设备是否等于储能净充电量。如果对不上优先检查有没有设备耗电漏写在平衡方程里。5.2 参数调优的注意事项参数调优的核心原则是先保证可行性再追求最优性。我的习惯是先用一个宽松的场景把模型跑通比如把储氢罐容量上限调到很大、CCS 捕集率调到很低、阶梯碳价设成同一档这样模型退化成接近普通经济调度问题容易得到可行解。然后逐步收紧参数每调整一组就验证一次结果合理性定位是哪个约束在起作用。碳配额 (Q) 的设置对结果影响特别大。如果 (Q) 给得非常大系统几乎不需要因为碳约束改变调度策略碳交易机制形同虚设如果 (Q) 给得太小系统碳排放始终处于最高阶梯减排压力过大运行成本飙升。合理做法是先跑一次不加碳交易约束的基准场景统计总排放量然后以基准排放量的 80%~90% 作为配额参考值。这样模型就能体现出减排空间又不至于完全脱离实际。电解槽的爬坡约束往往会被新手忽略但它对结果影响不小。没有爬坡约束时优化器会利用光伏骤增的瞬间让电解槽功率从 0 跳到满负荷现实里这是不可能的。设置爬坡约束后电解槽出力曲线明显平滑储氢罐的充放节奏也更合理整体调度方案的可执行性显著提升。5.3 代码扩展方向建议这套代码的框架可扩展性很强我给了自己几个后续可做的方向也分享给同方向的朋友参考。第一个扩展方向是引入需求响应。目前负荷是固定曲线如果加入价格型或激励型需求响应资源目标函数里会多出一块可调负荷的补偿成本约束里增加负荷调节幅度和持续时间限制。模型规模不会增加太多但结果会更丰富也能更真实反映虚拟电厂聚合柔性负荷的能力。第二个扩展方向是加入不确定性优化。风电和光伏出力的预测误差在真实运行中不可忽略可以在现有确定性模型基础上改成鲁棒优化或者随机优化。最常见做法是把新能源出力处理成盒式不确定集改造成两阶段鲁棒模型用 CCG 算法求解。代码改动量不小但这是学术前沿比较认可的方向。第三个方向是把阶梯碳交易扩展成更复杂的碳市场机制比如碳-电耦合市场联合出清、碳配额拍卖机制等。不过这些方向对模型推导能力要求更高建议先把现在的 MILP 模型吃透再逐步加复杂度。最后我实际做这个项目的感受是最难的不是 Matlab 代码本身而是把“阶梯碳交易”“P2G-CCS 耦合”“燃气掺氢”这些物理概念和经济机制转换成数学约束的那一步。这一步想清楚代码只是翻译过程这一步偷懒后面改模型会改到怀疑人生。建议后来者拿到代码先别急着跑结果把论文里的公式和约束和自己代码里的Constraints逐条对照一遍出了错才能快速定位。后期如果想换数据、改参数、换场景这个底子扎实了基本就是改参数表的事。
上一篇/下一篇内容由系统自动关联 返回资讯列表 →