多彩编程 多彩编程MZPH · CODE BLOG
ARTICLE DETAIL

文章详情

深耕前端与后端开发技术的一线实战笔记与踩坑复盘。

碳捕集与电转气协同的虚拟电厂优化调度建模与MATLAB实现

碳捕集与电转气协同的虚拟电厂优化调度建模与MATLAB实现 做电力系统优化调度这块的朋友这两年应该没少听到虚拟电厂、碳捕集、电转气这些词。我最近正好完整跑通了一套MATLAB模型计及电转气协同的含碳捕集与垃圾焚烧虚拟电厂优化调度。内容说直接一点就是把垃圾焚烧电厂、碳捕集装置、电转气设备连同风电、光伏、储能一起聚合到一个虚拟电厂框架里用一个优化调度模型去决定未来24小时每个单元怎么出力、怎么捕碳、怎么产气目标是在满足负荷的同时做到运行成本最低、碳排放最少。这个模型我在实际搭建中最大的感受是它卡在了学术和工程的交界处。学术上碳捕集和电转气之间的耦合关系不是简单叠加而是存在真实的物料循环——碳捕集从烟气中分离CO2电转气恰好需要CO2做甲烷化原料工程上垃圾焚烧电厂是真实存在的城市基础设施它的运行不像火电那样可以随意启停处理城市垃圾是硬任务。这套模型对这两点都有体现。适合正在找方向的电力系统研究生也适合做能源互联网规划、综合能源系统评估的工程师参考。下面我把整个模型的设计思路、数学建模、MATLAB实现步骤和踩过的坑完整梳理一遍文章比较长但每一步都可以直接对着写代码。1. 项目背景与整体思路拆解1.1 为什么要把碳捕集和垃圾焚烧放进虚拟电厂提到虚拟电厂大多数人的第一反应是聚合分布式光伏、风电、储能和小型燃气机组通过协调控制参与电网调度。但传统的虚拟电厂框架有一个明显盲区它把电力管理得很好却没有处理碳排放。现在碳配额和碳交易已经实实在在落到企业头上一个聚合了大量电源的虚拟电厂如果不考虑碳流调度结果可能在碳成本上是严重失真的。垃圾焚烧电厂是一个非常特殊的电源。它不能像火电一样随时压负荷或者停机因为城市每天产生的垃圾必须得到处理焚烧炉需要维持稳定的燃烧工况。这就意味着它在虚拟电厂里是一个准基础负荷性质的电源有最低技术出力约束。另一个问题是垃圾焚烧虽然被归类为可再生能源发电但其烟气中仍然含有大量CO2浓度大概在8%到12%之间比煤电烟气低但同样需要纳入碳排放核算。如果我们在这条烟气线上加装碳捕集装置捕集的CO2不直接封存而是送到电转气单元做甲烷化原料就形成了一条碳循环利用链路。这就是这个项目的核心动机把垃圾焚烧电厂的烟气CO2看作是资源而不是废物让虚拟电厂内部同时存在电力流、碳流和气流的耦合。传统虚拟电厂的优化目标是最小化购电成本和运行成本这个模型还要额外处理碳交易成本、捕集能耗、产气收益之间的权衡。1.2 电转气在系统里的角色把弃电变成气把CO2变成燃气电转气Power to GasP2G的技术链条可以分为两步第一步用电力电解水制氢第二步让氢气和二氧化碳发生甲烷化反应生成合成天然气。合成天然气可以直接注入天然气管道也可以用储气罐存起来供后续使用。这个链条里有两个关键输入一是电力二是CO2而这两样东西在虚拟电厂里恰好都可能是冗余资源。电力冗余来自风电和光伏的出力波动。凌晨风电大发、午间光伏满发时如果电网消纳不了就只能弃风弃光。与其直接丢弃不如把这些低成本电力喂给P2G转化成气存储起来相当于一种长时间尺度的储能手段。CO2冗余来自碳捕集装置。捕集下来的CO2如果全部封存需要额外的压缩和输送成本但直接作为P2G原料则变成了一种有价值的碳资源。这个一进一出的循环就是电转气协同的深层含义——用弃电把CO2变成了天然气同时降低了系统的碳排放水平和弃风弃光率。实际建模中P2G和碳捕集并不是两个独立的设备它们之间存在硬耦合约束。单位时间内P2G甲烷化消耗的CO2流量直接来自于碳捕集单元的产物流量如果有中间储罐则可以允许一定缓冲这个耦合关系必须写进优化模型的约束条件中。1.3 完整的系统拓扑与调度框架这个模型所描述的虚拟电厂内部我建议按源-网-荷-储-碳五个维度来理解源侧垃圾焚烧发电机组、风电场、光伏电站必要时可以加一台小型燃气轮机作为灵活调节电源。存储侧电储能锂电池、气储能储气罐分别处理电力和天然气的时空平移。荷侧外部电负荷由虚拟电厂承担内部负荷包括碳捕集装置的电耗和P2G的电解电耗。碳侧烟气中的CO2经过碳捕集装置分离一部分进入P2G甲烷化反应剩余部分可考虑封存或外售。网络侧虚拟电厂与外部电网之间存在购电和售电交互天然气与外网之间也存在注入或提取。调度框架采用日前调度的模式时间分辨率为1小时优化周期24小时。决策变量包括各机组的出力、储能充放电功率、碳捕集率、P2G产气功率、储气罐状态以及与外网的购售电量。模型类型是混合整数线性规划问题用MATLAB的YALMIP工具箱建模Cplex或Gurobi求解。这个框架的好处是通用性强后续想加入需求响应、旋转备用约束都只需要往约束集合里加东西。2. 核心设备建模每个单元的数学表达和物理逻辑2.1 垃圾焚烧机组有处理任务约束的特殊电源垃圾焚烧机组的建模与普通燃煤机组最大的区别在于它有一个垃圾处理量的刚性约束。城市每天产生的垃圾量是相对稳定的焚烧电厂作为处理终端必须接收并处理这部分垃圾不能因为电价低就減少焚烧量。体现在模型里我一般用如下方式处理。设垃圾进料量为 G(t)单位吨/小时发电功率 P_waste(t)单位MW与进料量之间近似呈线性关系P_waste(t) η_waste × G(t) × LHV其中 LHV 是垃圾的低位发热值不同城市差别很大一般取 6~10 MJ/kgη_waste 是焚烧发电的综合效率约 0.20~0.25。实际建模中我习惯直接定义一个可调出力区间这比通过进料量间接推导更直观垃圾焚烧机组的最小技术出力通常为额定容量的50%左右最大出力为额定容量。这个最小出力约束非常关键如果忽略它优化算法很可能会在夜间低负荷时段把焚烧出力压到很低甚至停机这在工程上是完全不现实的因为焚烧炉不能像燃气轮机那样频繁启停。烟气中CO2的排放量也由进料量决定。垃圾中的化石碳比例大约是40%左右也就是总碳中的一部分来自塑料、橡胶等化石原料这部分碳排放需要计入碳交易。单位垃圾焚烧产生的CO2排放因子大致在0.8~1.2 tCO2/吨垃圾范围内。这个排放量经过碳捕集装置时并不是全部被捕集而是由捕集率变量控制。2.2 碳捕集系统能耗和捕集率怎么权衡碳捕集装置我采用燃烧后化学吸收法的简化模型吸收剂选用MEA单乙醇胺。它的原理说白了就是让烟气通过吸收塔CO2被胺溶液吸收然后富液进入再生塔加热释放高浓度CO2溶剂循环使用。这个过程需要消耗大量热能和一部分电能在优化模型里不能只写一个捕集量变量必须把能耗同时写进去。碳捕集模型的核心变量是捕集率 α(t)范围取0到0.9表示t时段捕集的CO2量占烟气总CO2量的比例。捕集能耗可以用一个线性表达式近似P_ccs(t) λ_ccs × M_co2_captured(t)其中 M_co2_captured(t) 是捕集到的CO2质量流量t/hλ_ccs 是单位捕集能耗MWh/tCO2典型值在0.2~0.35。这个参数看似简单但它是整个模型里最敏感的参数之一——捕集能耗太高时优化算法会倾向于把捕集率降到最低因为省下来的碳交易成本抵不过多消耗的电费。捕集下来的CO2去向如何表示我引入一个虚拟的CO2缓冲环节捕集产出可以直接送往P2G装置也可以存储在CO2储罐中留待后续使用还可以外送封存外送封存的成本单独计。在建模中是否建立CO2储罐是一个取舍。如果时间粒度是1小时且P2G装置就在同一个园区内加上储罐模型会更贴近实际否则碳捕集与P2G必须实时匹配容易导致某些时段捕集量富余而另一些时段不足。2.3 电转气单元效率链条与CO2消耗量电转气装置内部包含电解槽和甲烷化反应器两个主要环节。电解槽消耗电能和水产出氢气和氧气氢气和CO2在甲烷化反应器中通过Sabatier反应生成甲烷和水。在调度模型里我通常把这两个环节合并为一个等效单元只保留输入电功率、输出天然气功率和CO2消耗量三个外部接口因为中间氢气的缓冲存储会引入大量非线性关系和非凸问题对MILP模型来说是得不偿失。P2G单元整体效率 η_p2g 大约在0.5到0.65之间等于电解效率0.6~0.75乘以甲烷化效率0.75~0.85。输入电功率 P_p2g(t) 与输出天然气功率 P_gas_out(t) 的关系是P_gas_out(t) η_p2g × P_p2g(t)消耗的CO2质量流量 M_co2_p2g(t) 则由甲烷化反应的热化学计量关系决定。这个换算关系在很多新手代码里容易出错。按反应式 CO2 4H2 → CH4 2H2O每生成1 mol甲烷消耗1 mol CO2。以单位能量MWh天然气来计算甲烷的低位热值约9.7 kWh/Nm³每Nm³甲烷约0.714 kg所以产生1 MWh天然气大约需要 1000/9.7 × 0.714 ≈ 73.6 kg的甲烷对应的CO2消耗量约 73.6 × 44/16 ≈ 202 kg。也就是每输出1 MWh天然气约需要0.2吨CO2。这个0.2 tCO2/MWh的系数可以直接写进模型非常实用。P2G还需要一个最小启动功率约束因为电解槽不是从0功率就能稳定运行的一般存在10%~20%的最小技术出力。同时P2G产出的天然气需要进入储气罐或外送管道储气罐容量约束和初末容量相等约束是保证调度结果可落地的重要边界。2.4 风电、光伏与电储能虚拟电厂的基础成员风电和光伏在日前调度模型中的处理相对成熟。预测出力作为出力上限实际出力在0到预测值之间连续可调弃风弃光量等于预测值减去实际出力并在目标函数中用弃风弃光惩罚系数或负收益来尽量避免削减。这里的逻辑是如果不加惩罚优化算法没有任何动机去消纳风电因为风电的边际成本很低但不是零而负荷需求完全可以由其他电源满足。一个合理的惩罚价格取100元/MWh以上超过煤电边际成本即可。电储能的建模使用标准SOC递推公式SOC(t1) SOC(t) η_ch × P_ch(t) × Δt - P_disch(t) × Δt / η_disch同时要限制充放电功率上限、SOC上下限以及避免同时充放电的0-1变量约束。在虚拟电厂模型里储能的位置有些微妙它既要平抑风电光伏的波动又要配合P2G和碳捕集这两个耗电大户的用电节奏。我在调试中发现如果储能容量设置得太大P2G在谷时的运行会被储能挤占两者产生功能重叠容量太小则起不到削峰填谷作用。这个平衡需要通过算例仿真去试探没有一个放之四海皆准的值。3. 优化调度模型目标函数、约束条件与求解策略3.1 目标函数设计成本构成与碳交易机制的数学化这个模型的目标函数是一个多成本项的线性叠加我用YALMIP表达时大致写成C_total C_grid C_fuel C_om C_carbon C_curtail - R_gas - R_tax逐项拆开来看。C_grid 是与外网交换电力的成本。虚拟电厂可以从电网购电也可以向电网售电但同一时段不能既买又卖需要引入一个0-1变量区分购售状态。在分时电价下夜间低价购电给P2G和储能充电、午间光伏大发时段售电是模型最典型的优化行为。C_fuel 是垃圾焚烧的燃料处理成本这个可以理解为城市生活垃圾处理的单位成本有些项目里表现为垃圾处理补贴收入如果研究对象是焚烧电厂运营方那么这个值是负的收入。具体正负号取决于研究视角但建议在论文中说明清楚。C_carbon 是碳交易成本。碳排放配额机制下虚拟电厂实际碳排放量超过免费配额时需要购买碳配额反之可以出售盈余配额。这里的关键公式是净排放 垃圾焚烧总排放 - 碳捕集量。注意捕集下来的CO2即使送入P2G最后变成甲烷燃烧后又变为CO2在核算边界内仍然应该计算为减排量因为甲烷外售给下游用户后排放责任转移到了下游。模型里对这一块的处理直接决定了调度结果——如果捕集CO2不抵扣碳排放配额那碳捕集装置的减排激励就完全消失了。R_gas 是P2G产出天然气的销售收入价格参考当地天然气门站价。R_tax 可以理解为碳税减免或者绿电溢价等政策性收益看实际场景是否适用。3.2 关键约束的完整清单除了各个设备内部约束外模型需要一组系统级约束把单元耦合在一起。我按重要性列出电力平衡约束风电出力 光伏出力 垃圾焚烧出力 储能放电 购电量 负荷 P2G电耗 碳捕集电耗 储能充电 售电量。这个约束是模型的中枢所有电源和负荷都在这里交汇。垃圾处理量约束一天内垃圾处理总量不得低于城市最低需求同时不得高于焚烧厂接收能力。碳排放与碳捕集耦合约束碳捕集量 ≤ 烟气CO2总排放量 × 最大捕集率P2G消耗的CO2 ≤ 捕集产出 储罐释放CO2储罐的容量递推方程与储能SOC类似。天然气平衡约束P2G产气量 储气罐放气量 外售天然气量 储气罐充气量外售量受管道输送能力上限约束。爬坡约束垃圾焚烧机组相邻时段出力变化幅度限制一般取额定容量的5%~10%每小时。约束数量决定模型规模。以24个时段为例连续变量大约150~200个0-1变量大约40~50个约束方程大约300~400条对Cplex来说属于小规模MILP通常几秒到一分钟内可求出全局最优解。3.3 求解方案为什么选MILP而非启发式这个模型在数学上属于混合整数线性规划选择MILP求解路线而不是遗传算法或粒子群等启发式算法主要原因是可复现性和全局最优性。启发式算法跑一次一个结果连自己都很难复现而MILP求解器给出的是带最优性间隙证明的解审稿人和工程审查都认这套逻辑。另外线性模型的灵敏度分析很直观碳价从50元/吨涨到100元/吨时调度策略如何变化只需要重新求解几次不需要重新推导模型。MATLAB下我推荐用YALMIP建模求解器选择Cplex或Gurobi。YALMIP的优势是语法与数学表达式几乎一一对应变量、约束、目标函数的表达非常自然后期改模型结构也快。有一个细节要注意YALMIP默认适合连续线性规划对于MILP要确保求解器支持二进制变量并在optimize()之前把求解器设置为cplex或gurobi不然默认求解器可能很慢甚至报错。4. 代码架构与实操复现指南4.1 MATLAB代码主框架与模块划分整套代码我建议按四个模块组织方便后期调试和扩展。第一个模块是数据输入定义所有设备参数和预测曲线包括24小时负荷预测、风电光伏预测出力、分时电价、垃圾进料量、碳价等统一放在一个结构体或者Excel读取脚本里。第二个模块是变量定义用YALMIP的sdpvar定义连续变量binvar定义二进制变量变量命名要有规则我一般用P_wind_t、P_waste_t、alpha_t这类带下标的命名方式这样检查约束时能一眼看出变量身份。第三个模块是约束组装。我的经验是一个约束一个cell元素最后统一合并比如constraints [constraints, P_wind(t) P_wind_forecast(t)]这种写法。不要把所有约束一次性堆在一个括号里出了问题非常难定位。第四个模块是求解与结果输出调用optimize()后用value()批量提取变量结果再用bar函数或stairs函数绘制各机组出力堆叠图、SOC曲线、碳流量曲线。4.2 关键参数设置参考表参数初始化是复现的第一步如果你手头没有实际项目数据我给出一个典型算例的参数表这些值来自公开文献和项目可研报告的常见取值范围可以直接作为初始设定参数数值说明垃圾焚烧额定容量30 MW处理能力约1500吨/天垃圾焚烧最小出力15 MW保证炉膛稳定燃烧垃圾焚烧爬坡率3 MW/h额定容量的10%风电装机50 MW典型日出力按预测曲线光伏装机30 MW典型日出力按预测曲线储能容量10 MW / 20 MWh充放电效率95%碳捕集最大捕集率0.9技术上限碳捕集单位能耗0.25 MWh/tCO2含再生能耗折算P2G额定功率5 MW电解槽容量P2G整体效率0.58电解0.7×甲烷化0.83CO2储罐容量100 t缓冲能力碳价80 元/t可做灵敏度分析天然气管网外售价2.5 元/m³折算到功率单位约250元/MWh这些参数要注意单位统一。功率用MW电量用MWh时间步长1小时CO2流量用吨/小时价格统一用元。容易出错的地方在P2G的CO2消耗量——前面推导过约0.2吨/MWh产气很多时候新人容易随手填一个0.5甚至2导致模型始终不可行。4.3 结果分析怎么组织场景对比与灵敏度分析模型跑完之后分析结果比求解本身更花时间。我建议至少设置三个对比场景基准场景不含碳捕集和P2G的普通虚拟电厂、含碳捕集但不含P2G、含碳捕集且含P2G的完整系统。通过这三个场景能清晰拆出碳捕集和P2G各自的贡献。结果对比表可以这样设计指标基准场景含碳捕集含CCSP2G总运行成本万元28.624.121.8碳排放总量吨352138120弃风弃光率%12.38.63.2购电量MWh1129687P2G产气量MWh--31这张表出来之后可以直接支撑一个核心结论碳捕集降低了碳排放但减少了系统净收益P2G的加入则把弃风和低碳CO2转化成了天然气收益使得经济性和低碳性同时改善。至于碳价灵敏度我习惯取50、80、120、200元/吨四个点观察捕集率和P2G产气量的阶梯变化这往往是审稿人比较看重的分析内容。5. 实操中的常见问题与排查实录5.1 模型不可行的几类原因与诊断方法模型报infeasible是调试期最常遇到的情况。我遇到过的不可行原因主要有三类。第一类是垃圾焚烧最小出力与负荷之间的矛盾夜间负荷低风电又大发P2G和储能容量不够吸收多余电力功率平衡找不到解。这属于系统盈余刚性过剩解决方法是给弃风弃光留足够的松弛变量空间而不是强制完全消纳。第二类是碳捕集与P2G之间的物料不匹配。如果P2G额定功率太大而垃圾焚烧烟气CO2产量不足甲烷化反应所需的CO2流量远超捕集量模型就永远找不到物料平衡解。这个问题的诊断思路是手动核算一天的CO2总供给量和总需求量看量级是否匹配。第三类是储能初末SOC约束写错方向。比如要求SOC(24)等于SOC(0)但中间每时段储能的充放写成了只充不放导致能量不断累积最后无法回到初值。这类问题可以通过查看各时段SOC曲线来定位如果SOC一路爬升到上限贴死那大概率就是放电项符号错了。5.2 求解时间过长或收敛性差MILP求解时间爆炸通常不是因为连续变量多而是0-1变量组合太多。购售电状态、储能充放电状态、P2G启停状态每个24维的二进制变量数组都会带来分支指数增长。我的经验有几个有效手段。第一能不用二进制就不用二进制。例如储能充放电互斥约束如果充放电效率不对称且成本函数单调很多时候可以不加互斥0-1变量因为同时充放电在数学上不会是最优解实际跑出来也不会出现。第二给求解器设置合适的MIP gap例如默认0.01%实际工程取0.1%~1%就足够求解时间能缩短一个数量级。第三提供一个合理的初始解先用连续松弛模型求一次把结果作为MIP的mipstart传给求解器Cplex从这个起点开始搜索会快很多。5.3 碳流与气流耦合环节的数值陷阱这个模型比普通虚拟电厂模型多了一条碳流链路数值处理上陷阱不少。最典型的坑是单位混乱。碳捕集的年产量如果是吨优化模型里的步长是小时换算成吨/小时时要除以8760再考虑容量因子。P2G的CO2消耗量也一样0.2吨/MWh是能量单位的换算系数但如果模型里产气量用m³/h还需要额外乘一个密度和热值系数。我建议在代码顶部专门写一个单位换算区把所有系数集中定义并加注释避免在约束里到处写魔法数字。另一个陷阱是CO2储罐的初末容量约束。如果不加储罐捕集和P2G必须实时匹配意味着夜间弃电充足时P2G全力运行但因为白天捕集量大夜间捕集量小夜间可能CO2不够用。加了储罐之后模型会自动安排白天多捕集存起来、夜间放出来甲烷化。但储罐容量参数过大时优化结果可能出现前期大量捕集囤CO2、最后几个时段集中产气的作弊行为虽然数学上可行但工程上不合理。处理办法就是设置合理的储罐容量上限并且约束储气量在整个周期内相对平滑。6. 一点经验体会整套模型跑下来最深的体会是这个课题的本质不是把两个设备塞进虚拟电厂而是在处理电、碳、气三种能量形态之间的时间错配。风电光伏的富余电力出现在凌晨和午间垃圾焚烧烟气的CO2排放是全天持续性的天然气的用能需求可能集中在早晚高峰要让三者配对储电、储气、储CO2缺一不可。我个人的建议是如果自己从头复现这个模型千万不要一上来就搭完整系统。先跑一个只有垃圾焚烧加风电加碳捕集的简化版本确认碳排放约束和捕集能耗的关系走通了再加入P2G单独验证电转气的物料平衡最后才把储气罐和CO2储罐加进去组合成完整模型。这样每一步的调试成本都很低出了问题也容易定位。最后再分享一个我做敏感性分析的小技巧碳价和P2G效率是最值得扫的两个参数碳价决定碳捕集的减排激励P2G效率决定弃电转化天然气的经济性把这两个变量的二维扫描结果画成等高线图投论文时的说服力比单变量灵敏度大得多。
返回列表