
做虚拟电厂优化调度的人应该都有同感真正让人头疼的不是某个单一设备的建模而是把特性差异巨大、彼此耦合的多个单元放在同一个时间尺度里协调。这两年碳捕集CCS和电转气P2G在低碳调度里频繁出现在各类文献中而垃圾焚烧作为城市型虚拟电厂里极具潜力的可控基底电源却常常被简化为一个负的固定出力一笔带过。这个项目做的就是一件很具体的事用MATLAB把碳捕集、电转气、垃圾焚烧三类单元一起塞进虚拟电厂VPP优化调度模型跑出一个计及协同效应的日前调度方案。它解决的问题很直接——当碳捕集装置需要消耗电能来脱碳、电转气装置又需要吸收电能来产气时虚拟电厂内部到底怎么分配电量才最划算垃圾焚烧机组在这个链条里又能发挥什么特殊作用如果你是做电力系统优化、储能调度或者综合能源系统方向的学生或工程师这篇文章提供一个可以照着跑的完整思路从数学模型怎么列、约束怎么处理到MATLAB代码怎么组织、求解器怎么调都会讲到。1. 项目整体设计与思路拆解1.1 为什么是这三样东西组合先说碳捕集和电转气。这俩单独拿出来都不新鲜但把它们放进同一个虚拟电厂框架里事情就不一样了。碳捕集装置的本质是一个电换碳的设备输入电能输出捕集到的CO2和减少的烟气碳排放。电转气装置的本质是一个电换气的设备输入电能生成氢气或者进一步甲烷化生成天然气。单独看一个在降碳一个在储能貌似各干各的。但把CO2作为电转气甲烷化的原料时它们就有了物理上的协同——碳捕集捕下来的CO2不再是需要封存处理的产品而是直接成为电转气的原料。这一下就把两条独立技术路线焊在了一起。垃圾焚烧在这个组合里的角色更特殊。它首先是一个稳定的发电单元城市生活垃圾从进厂到焚烧发电过程可控、出力平稳不像风电光伏那样看天吃饭。其次垃圾焚烧本身也是一个排碳大户如果虚拟电厂要被纳入碳约束管理垃圾焚烧机组的碳排放必须被严肃对待。第三个容易被忽略的层面是垃圾焚烧机组具有一定的热电联产潜力烟气余热如果能用于碳捕集溶剂的再生能显著降低捕集能耗。这个特性在调度模型里很难精确刻画但至少为协同提供了一个额外的想象空间。所以这个铁三角组合的逻辑是垃圾焚烧提供稳定电力和可控碳排放源碳捕集把碳排放转化为可用的CO2资源电转气再把CO2和可再生能源富余电力转化为燃气回注到能源系统。三个单元串联起来比三个各自独立的模块相加要有意思得多。1.2 系统物理架构与能量流项目采用的虚拟电厂架构是典型的多能互补结构。对外虚拟电厂作为整体与上级电网存在购售电交互也要在碳交易市场上结算碳配额对内包含可再生能源风电、光伏、垃圾焚烧机组、储能装置、电转气装置和碳捕集装置。能量流方面需要理清楚三条主线电力线风电、光伏、垃圾焚烧、储能、电转气、碳捕集、电网购售电都要汇聚到电力平衡这条母线上碳流线垃圾焚烧和电网购电外购电隐含碳排放产生碳排放碳捕集从烟气中分离CO2一部分送去封存一部分送给电转气做原料气流线电转气产出的甲烷气可以卖给天然气网络或者供给本地燃气负荷这是虚拟电厂除了售电之外的第二收入来源这三条线不是独立的。电力线决定碳流线的规模因为碳捕集要用电力去驱动碳流线决定气流线的原料因为电转气需要CO2才能完成甲烷化气流线又反过来影响电力线因为产气可以带来收益相当于给虚拟电厂增加了一条收益渠道而这个收益会间接影响所有机组的出力安排。构建数学模型时必须把这三条线的耦合关系用等式和不等式写清楚这也是这个项目建模阶段最大的难点。1.3 优化调度的目标与决策变量从调度目标看典型做法是经济性低碳性双目标加权也可以把碳排放转化为碳交易成本、碳税成本汇入经济性目标。我这里采用的是单目标形式把碳排放量乘以碳价因子折算成成本再与运行成本一起最小化。这样处理的好处是模型是纯线性或混合整数线性的求解稳定而且碳价可调可以通过敏感性分析观察调度策略随碳价的变化。决策变量可以分成几类连续变量各机组出力、储能充放电功率、碳捕集装置捕集的CO2量、电转气耗电量、购售电功率整数变量如果采用分段线性化模型机组启停状态、储能的充放电状态切换、分段线性化时的分段变量耦合变量碳捕集供给电转气的CO2流量、电转气产出的燃气量把变量分类这件事看似基础但实际建模时很容易搞混。特别要注意的是碳捕集量和电转气产气量之间的CO2流量既是碳流也是物流这个变量在模型里只应该被定义一次然后在碳平衡约束和物料平衡约束里同时引用否则会出现重复定义导致约束冲突。2. 核心数学模型构建2.1 碳捕集系统建模碳捕集系统的核心关系是捕碳量-能耗-碳排放三者之间的平衡。在简化处理中假设碳捕集装置对垃圾焚烧机组烟气中的CO2进行捕集捕集率可以在一定范围内调节。设垃圾焚烧机组t时段发电功率为P_WTE(t)其单位发电量的碳排放强度为e_WTE则总碳排放量为E_total(t) e_WTE * P_WTE(t)如果外购电力的间接碳排放也要考虑还需要加上购电碳排放项。碳捕集装置可以捕集一部分CO2捕集量为C_CCS(t)捕集率η_CCS(t) C_CCS(t) / E_total(t)η_CCS通常有上下限例如0.6到0.95低于下限捕集系统无法稳定运行高于上限则能耗过大不经济。捕集能耗是建模的关键。常用线性化模型为E_CCS(t) λ * C_CCS(t)其中λ为单位捕集能耗kWh/kg CO2或MWh/t CO2。不同文献里λ的取值范围差别很大从0.2到0.5 MWh/t都有具体取决于捕集技术水平和溶剂再生能耗。这个系数在后文的敏感性分析里是一个重要参数。捕集装置本身也有额定容量上限即C_CCS(t) ≤ C_CCS_max。捕集下来的CO2有两个去向一部分送去封存或利用另一部分送往电转气装置作为甲烷化原料。设送往电转气的CO2量为C_P2G_in(t)则C_CCS(t) C_store(t) C_P2G_in(t)2.2 电转气协同建模电转气分两步走。第一步电解水制氢出力关系为H(t) η_ele * P_P2G_ele(t)其中P_P2G_ele(t)是电转气消耗的电功率η_ele是电解效率H(t)是产氢量。第二步是甲烷化反应即CO2与H2反应生成CH4和水。按化学计量关系1 mol CO2需要4 mol H2才能生成1 mol CH4折算成质量流量比例大约是CO2: H2 44 : 8也就是5.5 kg CO2需要1 kg H2。调度模型里不需要做得这么化学精确但这条物料平衡关系最好保留——它保证了碳捕集捕下的CO2送到电转气后真的能变成燃气而不是凭空多出产气量。简化后的电转气产气量G_P2G(t) η_meth * α * H(t)其中η_meth是甲烷化效率α是CO2和H2反应的比例系数。可以把两步合并为一个综合效率η_P2G直接建立从耗电到产气的映射G_P2G(t) η_P2G * P_P2G_ele(t)这个综合效率通常在0.45到0.65之间也就是说1 MWh电进去出来的燃气能量只有0.45到0.65 MWh。电转气电-气-电的往返效率非常低但在虚拟电厂里它的价值本来就不是储能套利而是产气出售收益和消纳可再生能源。如果直接对标储能效率来评价电转气会得出这玩意毫无性价比的结论这是设计目标上的常见误解。电转气运行时还需要满足耗电功率上下限约束和爬坡约束。爬坡约束对电转气尤其重要因为电解槽的负荷调节速率不是无限的。2.3 垃圾焚烧机组约束垃圾焚烧机组在虚拟电厂里承担承上启下的角色向上它是可控电源出力调节范围比风电光伏大得多向下它的连续运行特性决定了它不能被随意启停。垃圾焚烧机组的出力约束P_WTE_min * u(t) ≤ P_WTE(t) ≤ P_WTE_max * u(t)其中u(t)是0-1变量表示机组启停状态。实际上垃圾焚烧机组很少做日内停机的操作因为停炉再启动的热应力问题很严重所以模型中通常要求全天连续运行或者设定最小运行/停机时间约束。我在模型里采用了强制连续运行的简化策略。更重要的是垃圾焚烧机组的天气相关性约束——它烧的是城市生活垃圾垃圾进厂量基本是日稳定的量所以机组的总焚烧处理量在一个调度周期内应保持相对稳定。处理方式有两种一是固定日处理量调度只分配各时段焚烧量二是允许在±10%范围内波动模拟垃圾储坑的缓冲能力。第二种方式更具灵活性但需要额外增加一个全天总处理量固定的约束来保证调度结果符合垃圾供应的物理现实。垃圾焚烧机组的碳排放强度比天然气机组低但比风电光伏高介于两者之间。这个强度值直接决定了碳捕集装置需要配多大容量是一个影响全局设计的关键参数。2.4 目标函数与约束条件汇总目标函数可以写成全天24小时的总成本最小化各项成本包括电网交互成本购电费用减售电收益采用分时电价燃料成本垃圾焚烧机组燃料成本如果垃圾处理有补贴这里可以设为负值即处理垃圾本身有收益碳成本总碳排放量乘以碳价扣除碳捕集量后计算净排放成本。这部分是碳捕集装置存在的经济驱动力运行维护成本各机组单位出力对应的运维费用弃风弃光惩罚成本没有消纳的可再生能源电量乘以惩罚系数目的是让模型优先消纳风光约束条件汇总电力平衡约束各机组出力上下限和爬坡约束储能SOC递推方程和充放电约束碳捕集捕集率上下限和额定容量约束电转气耗电功率上下限、产气量约束、爬坡约束CO2物料平衡约束与上级电网交互功率限制约束可再生能源出力上限约束即弃风弃光允许发生但会受惩罚3. MATLAB实现与实测过程3.1 代码架构与文件组织MATLAB代码的组织方式直接影响调试效率。这个项目我采用的是主程序参数脚本数据脚本模型构建函数结果输出五层结构实测下来思路清晰改参数也方便。VPP_Optimization/ ├── main.m # 主程序入口 ├── load_data.m # 数据加载负荷、风光出力、电价、碳价 ├── set_parameters.m # 设备参数集中配置 ├── build_model.m # 构建优化模型YALMIP变量与约束 ├── solve_model.m # 调用求解器并解析结果 ├── plot_results.m # 结果可视化 └── data/ ├── load_profile.xlsx # 日负荷曲线 ├── wind_profile.xlsx # 风电出力曲线 ├── pv_profile.xlsx # 光伏出力曲线 └── price_profile.xlsx # 分时电价参数集中配置到set_parameters.m里用结构体存。这样做的好处很明显如果要做碳价敏感性分析只需要在脚本里循环改c_price一个变量不需要去代码里翻找。我在第一个版本里把参数散落在各代码文件中结果换一组数据时漏改了某处参数模型跑出来的结果自己都知道不对排查了两天才发现是垃圾焚烧燃料成本参数没更新。3.2 核心函数实现节选模型构建用YALMIP建模语言求解器用CPLEX或者Gurobi。先定义决策变量然后逐类添加约束。关键代码段如下% 定义决策变量 % 机组出力 P_wte sdpvar(24, 1); % 垃圾焚烧发电出力 P_wind sdpvar(24, 1); % 风电实际出力≤ 预测值 P_pv sdpvar(24, 1); % 光伏实际出力≤ 预测值 % 储能 P_ess sdpvar(24, 1); % 储能净放电功率正放电负充电 SOC sdpvar(25, 1); % 荷电状态取25个时刻点 % 电转气与碳捕集 P_P2G sdpvar(24, 1); % 电转气耗电功率 C_CCS sdpvar(24, 1); % 碳捕集量 C_store sdpvar(24, 1); % CO2封存量 C_to_P2G sdpvar(24, 1); % CO2送电转气量 G_P2G sdpvar(24, 1); % 电转气产气量 % 电网交互 P_grid sdpvar(24, 1); % 与电网交换功率正购电负售电 % 启停状态 u_wte binvar(24, 1); % 垃圾焚烧机组启停状态碳捕集和电转气的耦合约束是项目核心代码里必须把这层关系明确反映出来% 碳捕集约束 E_total e_wte .* P_wte; % 垃圾焚烧总碳排放 0 C_CCS eta_CCS_max * E_total; % 捕集量上限由捕集率上限确定 C_CCS eta_CCS_min * E_total; % 捕集率下限 % 捕集能耗约束 P_CCS lambda_CCS * C_CCS; % 捕集装置耗电 % CO2物料平衡捕集的CO2一部分封存一部分送P2G C_CCS C_store C_to_P2G; % 电转气约束 G_P2G eta_P2G * P_P2G; % 电功率转燃气映射 C_to_P2G beta_P2G * G_P2G; % CO2需求与产气量的化学计量比例这两条约束一写碳捕集和电转气的协同就完全耦合起来了。C_to_P2G这个变量在两个等式约束里同时出现相当于把碳流和气流绑在了一起。注意beta_P2G这个参数要从化学反应计量关系推算。按前面说的5.5 kg CO2对应1 kg H2折算到能量维度约是0.55 t CO2 / MWh燃气。3.3 求解器配置与参数设置用YALMIP调用CPLEX需要设置几个关键参数。Reltol相对对偶间隙和MIPGap是最常需要调整的默认值往往不够好。% 求解器参数配置 ops sdpsettings(solver, cplex, ... verbose, 2, ... showprogress, 1, ... cplex.mip.tolerances.mipgap, 1e-4, ... cplex.mip.tolerances.integrality, 1e-6, ... cplex.mip.tolerances.absmipgap, 1e-2, ... cplex.timelimit, 600);mipgap设为1e-4在实际算例中通常足够再小只会拖长求解时间而不带来可感知的目标值改进。另外400个连续变量加上24个二进制变量的混合整数规划模型在CPLEX里求解时间通常在几秒到几分钟之间属于轻松求解的规模。真正会让求解变慢的是把电转气产气后的燃气在虚拟电厂内部再折算成发电——如果加入燃气轮机作为第四个发电单元模型规模会翻倍MIPGap收敛会明显变慢。储能SOC递推方程也要注意初始值设定。SOC(1)是前一天最后一个时段的荷电状态运行时需要给它赋初值SOC(1) SOC_init; for t 1:24 SOC(t1) SOC(t) - P_ess(t) / cap_ess eta_self * SOC(t); end 0.1 SOC 0.9;这里要提醒一个细节P_ess是净放电功率我在建模时没有单独设充放电两个变量而是用一个连续变量代替再通过一个小约束防止充放电同时发生。如果充放电同时发生对于优化问题来说其实不会更优——充电和放电本身都有损耗同时充放等于白白浪费能量最优解自然会避开这种情况。所以这个简化在纯最小化问题里是安全的。4. 常见问题与排查技巧实录4.1 模型不可行从哪查起第一次跑通模型时几乎一定会遇到unbounded或者infeasible报错。不可行的根源通常是约束之间互相矛盾。我踩过的坑有两个第一个是储能SOC约束里漏掉了容量边界约束导致SOC跑到负值。这个是低级错误但YALMILINK报错信息不明显需要逐条检查约束范围。排查方法是用check命令检查每个约束的双向偏差值偏差不为0的约束就是问题所在check(constraints)第二个坑是数据单位不一致。电价单位是元/MWh碳排放强度是t CO2/MWh碳价是元/t但有个参数从文献里摘抄时用的单位是kg而不是t导致计算碳成本时差了一千倍。单位混乱是能源系统建模的高频事故建议在参数文件里对每个参数用注释明确标注单位。4.2 求解时间突然变长的应对模型规模不变但换了一组数据后求解时间从几秒暴涨到几十秒甚至超时这种情况多半是数据里出现了极端值。比如风电出力全天都很高、负荷很低时弃风惩罚和解空间的约束会产生大量可行调度方案MIPGap收敛变慢。应对思路有三个一是提高MIPGap容忍度到1e-3二是给求解器设置time limit并接受次优解三是从模型规模下手——把24个时段缩短到12个时段做快速测试验证逻辑正确后再恢复全时段。我通常采用第三种方式因为它能快速定位问题在模型本身还是数据本身。4.3 碳捕集在最优解里不工作的排查不少同学遇到过这种情况模型跑通了结果也很稳定但碳捕集装置出力始终为零电转气也不开工。这个结果看起来正确但不能反应研究价值。一般来说碳捕集不出力只有三个原因碳价过低捕集能耗成本高于碳排放成本经济上不划算捕集装置单位能耗λ设得过大导致捕碳净成本过高电转气的产气收益没有纳入模型或者燃气售出价格过低排查时先检查碳价和电价的关系。如果白天购电价格为0.8元/kWh捕集单位能耗0.3 kWh/kg CO2也就是说捕1 kg CO2需要花0.24元电费。如果碳价只有50元/t也就是0.05元/kg捕碳完全不划算——碳价必须超过捕碳的边际成本碳捕集才会被调度启用。这个账在建模之前先算一笔可以省下大量调试时间。4.4 电转气效率参数对结果的直接影响电转气效率我在模型里设为0.55但实际文献中综合效率可在0.4到0.65之间波动。做敏感性分析时效率每提高0.05电转气的使用小时数会有明显提升。原因在于电转气是否被调度关键看它产气的收益能否覆盖购电成本和碳捕集成本。效率越高相同电量产出的燃气越多收益越高模型就越倾向于启用它。这也解释了为什么在碳捕集和电转气耦合的场景里电转气的经济性不应该单独评价。碳捕集提供的CO2如果本身是需要花钱处理封存的气体电转气等于免费获得了原料同时还省去了碳封存成本——这一层的经济价值要算进电转气的收益里项目整体方案才是完整的。5. 场景仿真与结果分析5.1 四种方案对比为了评估每个技术单元对虚拟电厂调度的影响我按照控制变量法设置了四个场景场景编号情景描述目的S1无碳捕集、无电转气基准场景S2仅有碳捕集单独分析碳捕集的减排与经济性S3仅有电转气单独分析电转气的消纳与产气价值S4碳捕集电转气协同分析协同效应同样一组风光负荷数据和参数条件下四个场景跑完后对比总成本和碳排放量S4的总成本比S1下降了大约7%到12%具体数值取决于电价和碳价参数S4的碳排放净排放量下降幅度更明显可以达到30%以上因为碳捕集直接减少了排放电转气又把一部分CO2转化为燃气实现了碳的资源化利用S1场景下弃风弃光率明显偏高S3加了电转气后弃风弃光率大幅下降说明电转气的负荷调节作用确实能帮助可再生能源消纳S4比S3的碳排放显著更低因为碳捕集装置削减了垃圾焚烧的净排放这个结果说明了一个核心结论单个技术单元在虚拟电厂里都有独立的收益但它们的协同效应才是净减排的主要来源而且是经济性更优的方案。5.2 调度曲线的解读看24小时调度曲线时有几个关键规律值得注意。垃圾焚烧机组在全天范围内基本保持高利用率出力平稳只在夜间负荷低谷期适当压出力。碳捕集装置的工作时段集中在电价较低的时段因为它们耗电较高——负荷低谷时电价便宜此时开碳捕集性价比最高。电转气装置跟碳捕集有类似的行为特征也是更多在电价低谷时段运行但它比碳捕集的启动条件更挑剔只有在风光出力大、电价又低的时段才会明显拉高耗电。反直觉的是碳捕集和电转气同步运行的时段往往伴随着储能的放电。原因是碳捕集和电转气同时工作意味着虚拟电厂内部用电量大增储能如果还有余量会选择在此时放电来满足内部电力需求避免从电网高价购电。这种多单元联动是协同效应在时间尺度上的具体体现。峰值电价时段虚拟电厂倾向于从电网购电减少购电量尽量用内部电源满足负荷有余力时还向电网售电赚取收益。电转气在峰值时段基本停运因为它把电能转为燃气的经济性此时完全不具备竞争力——这是效率决定的物理规律不是模型bug。5.3 碳价对调度策略的影响碳交易价格是影响整个虚拟电厂调度策略最灵敏的参数。我在模型里将碳价从50元/t逐步增加到300元/t观察调度方案的演化碳价在50元/t时碳捕集基本不出力电转气也不运行虚拟电厂更倾向于直接购买碳排放配额来完成履约碳价升到100到150元/t时碳捕集开始部分运行电转气同步启动但整体运行小时数有限碳价超过200元/t时碳捕集接近满负荷运行电转气在最低电价时段接近满负荷运行储能的充放电策略也会相应调整以服务内部用能需求碳价拐点在哪里出现取决于捕集能耗和电转气效率的比值。用公式表达碳捕集启动的经济临界条件大致是碳价 捕集单位能耗 × 当时电价 / 捕集效率。这个简化公式可以作为快速评估碳捕集经济可行性的估算工具不需要跑模型也能给出初步判断。6. 实操总结与后续扩展建议6.1 项目完整复现清单这个项目的全部代码规模大约在400行左右不算大但麻雀虽小五脏俱全。完整复现需要准备的数据和参数如下24小时负荷曲线可以取自某地区典型日数据24小时风电出力预测归一化后乘以装机容量24小时光伏出力预测同上分时电价峰、平、谷三段即可垃圾焚烧机组参数额定容量、最大最小出力、碳排放强度碳捕集参数单位能耗λ、捕集率上下限、额定捕集容量电转气参数综合效率η_P2G、耗电功率上下限、CO2与产气量的比例系数储能参数容量、最大充放电功率、SOC上下限、充放电效率碳价、弃风弃光惩罚系数如果只跑一个算例验证逻辑垃圾焚烧机组的复杂约束可以先简化——把启停状态变量直接固定为1只优化出力大小。这样可以先验证碳捕集和电转气协同的核心逻辑再加回启停约束。6.2 模型进一步扩展的方向如果想把项目做得更深入有几个方向可以在当前框架上直接扩展第一个方向是引入不确定性。风电光伏出力采用场景集或者约束鲁棒优化把确定性调度变成不确定性调度。这会改变模型性质求解难度上一个台阶需要用分布鲁棒或者场景分解方法。第二个方向是把电转气产出的燃气纳入更完整的燃气系统模型而不是简单的产出即收益。可以考虑燃气轮机组发电、天然气负荷形成真正意义上的电-气耦合虚拟电厂。第三个方向是时间尺度细化。当前模型用的是1小时分辨率但碳捕集装置的响应时间和电转气的爬坡特性其实更适合15分钟级调度。细化时间尺度会增加决策变量数量以现在的求解能力来说仍在可接受范围。6.3 我在实际调试中的一点体会跑这个项目的过程中最有价值的收获不是模型本身而是建立了一个对碳捕集电转气协同经济机制的直觉碳捕集的减排价值必须通过碳价来传导电转气的能源转化价值必须通过气价来传导这两条传导路径交织在一起时最优调度绝不是让每个单元单独最优而是整体最优。单独看碳捕集能耗高觉得亏单独看电转气效率低觉得不划算但把它们和垃圾焚烧、风光消纳放在一起组合起来就是虚拟电厂层面的最优解。这个逻辑在工程上也有参考意义——评价新技术时不能只看单点效率要放在系统里看它对其他单元的撬动作用。碳捕集给电转气提供原料本、电转气给碳捕集提供CO2去向双方通过耦合约束互相创造价值这种互生关系在别的多能互补场景里也经常出现。最后分享一个小技巧做这类项目时每一步改动后都保存一组结果图和数据文件标注好参数版本。等到后面回看时你会发现对比不同参数下的调度曲线比看任何理论推导都能更快理解模型行为的规律。