去年有一段时间,我一直在带课题组做虚拟电厂与综合能源调度方向的模型。“计及电转气的含碳捕集与垃圾焚烧虚拟电厂优化调度”这个题目,最初是一位合作单位工程师给我的需求:他们运营着一座垃圾焚烧发电厂,想评估如果把碳捕集和电转气都搬进厂里,整个虚拟电厂该怎么排产、怎么应对电价波动和碳约束。说实话,我第一反应是怀疑——碳捕集要耗电,电转气也要耗电,两个“电老虎”凑在一起,调度到底图什么?等模型建完、算例跑完,我才发现自己低估了这两台设备和焚烧机组之间的耦合关系。
这篇文章把我实际搭模型时的思路完整拆开讲一遍:系统边界怎么划、焚烧机组和传统火电建模有什么本质区别、电-气-碳三条流在哪里交汇、优化问题如何写成可求解的MILP形式、算例怎么设计才能说明问题,以及最后那些只有真正跑过模型才会踩的坑。适合准备拿这个方向做选题的研究生,或者正在做垃圾焚烧电厂灵活性改造预研的工程师,按这套思路基本能复现一版可运行的日前调度模型。
1. 先把系统边界和角色定位想清楚
1.1 为什么是“垃圾焚烧”而不是普通火电
虚拟电厂本身不发电,它做的事情是把分散的资源聚合起来,像一个电厂一样参与调度和市场。一般的虚拟电厂会聚合风电、光伏、储能、可调负荷,而这里多了一个特殊角色:垃圾焚烧机组。
垃圾焚烧机组和燃煤机组最大的差异是“燃料不可控”。燃煤电厂的煤可以按计划采购、储存、搭配,调度员想让机组多发就多发;但垃圾焚烧电厂烧的是城市当天收运来的生活垃圾,环卫车拉来了,你就必须处理掉,否则第二天城区的垃圾就堆成山。所以它的发电出力不是纯市场化决策,而是“处理垃圾”这个刚性任务的副产品。
焚烧炉的运行方式也和锅炉不一样。为了保证二噁英充分分解,焚烧炉膛温度通常要维持在850℃以上,这意味着机组不能轻易深度调峰或压火;垃圾的热值又不稳定,夏天瓜果皮多、冬天塑料多,同样的处理量对应的热功率可能差出一大截。再加上机械炉排的惯性,焚烧机组的爬坡速率通常比燃煤机组慢很多。
| 对比项 | 燃煤火电机组 | 垃圾焚烧机组 |
|---|---|---|
| 燃料来源 | 可按需采购、掺配 | 城市垃圾收运量决定,不可中断 |
| 刚性约束 | 发电计划、环保排放 | 垃圾必须当日处理,炉温需持续维持 |
| 调节能力 | 中等偏上,可启停调峰 | 长期连续运行,深度调峰受限 |
| 碳排放口径 | 化石碳为主 | 化石碳+生物源碳混合 |
| 收益构成 | 电能量+辅助服务 | 电能量+垃圾处理费+碳相关收益 |
垃圾焚烧机组的建模如果直接套燃煤机组模型,调度的结果会很“好看”,但实际根本执行不下去。这算是我踩过的第一个坑,后面会细说。
1.2 CCS和P2G在这个系统里到底是生产设备还是负荷
碳捕集系统(CCS)在运行边界上是一个“可控负荷”。它可以通过调节捕集率,让自身耗电在零和满负荷之间变化;当它从汽轮机抽汽作为再生热源时,还会折减机组的电出力。不捕集时是旁路运行,捕集时就是一个可以随时调整的灵活负荷。这里面有个很容易被忽略的调度价值:弃风弃光高峰时,提高捕集率就等于给系统增加用电负荷,相当于把原来需要储能做的事情,用碳捕集的“运行模式”做了一部分。
电转气(P2G)更复杂一些,它同时是柔性电负荷、气源和碳汇。电解槽吃电、产出氢气,氢气再和二氧化碳甲烷化,得到的就是可以直接进燃气管道或储气罐的合成天然气。从电网侧看,它是一台可以启停、可以调节功率的用电设备;从气网侧看,它是一个天然气源;从碳账本看,它消耗了碳捕集装置捕下来的二氧化碳。这三个身份叠加在一起,让它成了整个虚拟电厂里最有调度灵活性的成员。
不过P2G在物理上并不是一台单一设备,而是“电解槽+氢气缓冲罐+甲烷化反应器+压缩机”的级联装置。电解槽对功率波动有一定耐受度,但甲烷化反应器对氢碳比和温度很敏感,启停和快速变负荷都有困难。建模时如果把它简化成“功率调大就多产气”的线性设备,会高估它的调节能力。
1.3 模型边界:聚合什么、外购什么、时间尺度怎么定
我建议把研究对象画成这样:虚拟电厂内部聚合风电、光伏、储能、垃圾焚烧机组、碳捕集装置、电转气装置、储气罐和储CO2罐;外部交互有三条,一是向上级电网购电或售电,二是从天然气网购气或向气网售气,三是参与碳市场做配额结算。负荷侧可以放一个区域电负荷和相应的用气负荷,这样电平衡、气平衡、碳平衡都能闭合。
时间尺度上,日前调度按1小时一个时段是比较稳妥的起点。15分钟颗粒度会让整数变量数量成倍上升,求解时间可能从几分钟变成几小时。交流潮流在虚拟电厂聚合层面的应用价值不大,母线功率平衡模型已经足够回答“CCS和P2G在什么时段运行最划算”这类问题。想精细到网架潮流,那是输配电系统层面的另一套工作。
2. 元件建模:垃圾焚烧、碳捕集、电转气各自的水有多深
2.1 垃圾焚烧机组:炉温和处理量才是硬约束
垃圾焚烧机组的热功率输入可以写成:
P_thermal(t) = M(t) × LHV × η_boiler
其中M(t)是时段内的垃圾处理量,LHV是垃圾低位热值,η_boiler是焚烧锅炉效率。汽轮发电机组再把热功率转换为电出力,整体纯凝发电效率通常在20%-27%之间。以日处理800吨的典型中型焚烧电厂为例,吨垃圾发电量大约在300-550 kWh,折算下来装机容量差不多在20-30 MW量级。
建模时有三个约束绕不开。第一是当日处理总量,城市环卫系统每天送来的垃圾量M_collect基本是给定的,调度必须在一天内完成,所以所有时段的处理量之和要等于M_collect。第二是处理量上下限,焚烧炉不能压得太低,太小了炉温维持不住,二噁英控制就成了环保事故;太大则超过炉排和烟气处理系统的能力。第三是运行连续性,焚烧炉是长期运行设备,尽量避免启停,在模型中通常直接把它设成“必开机组”来压低整数变量数量。
垃圾热值的波动对模型结果影响很大。我常用的做法是用一个随时间变化的LHV曲线来描述“早晚高峰垃圾水分低、热值高,凌晨水洗后垃圾热值偏低”这种日内规律,比用固定值更贴近实际。
2.2 碳捕集装置:捕集效率可以连续调,但需要0-1变量
燃烧后胺法捕集是垃圾焚烧电厂最现实的碳捕集路线。它从烟气中吸收CO2,再用蒸汽加热再生气,释放高浓度CO2。这里有两个物理量要分开:一个是烟气里的CO2总量,它正比于垃圾处理量和垃圾含碳率;另一个是实际捕集量,由捕集效率λ决定。
E_exhaust(t) = μ_CO2 × M(t) E_capture(t) = λ(t) × E_exhaust(t) E_emit(t) = (1 - λ(t)) × E_exhaust(t)
捕集效率λ不能无限高,胺法工程上一般取0.80-0.90。捕集能耗包括再生塔的热耗和压缩机的电耗,热耗通常为2.5-4.0 GJ/tCO2,如果从汽轮机中压缸抽汽,相当于每捕集1吨CO2会损失约0.3-0.5 MWh的电出力;电耗再叠加进去,总等效电耗在0.4-0.6 MWh/tCO2左右。
建模时需要引入一个0-1变量来表示碳捕集系统是否投入运行。系统停运时是旁路状态,烟气直接经烟气净化系统排放;系统投入后,捕集率可以在给定范围内连续调整。这个“可调范围”使得碳捕集装置有了负荷调节能力:系统需要消纳风电时,把捕集率从80%提到90%;电网峰荷需要出力时,把捕集率降到下限,省下来的抽汽就能多发电。
2.3 电转气:先搞懂效率,再做运行约束
电转气的核心化学反应是Sabatier反应:
CO2 + 4H2 → CH4 + 2H2O
从工程效率角度看,我会先算一笔账,这笔账决定了整个模型的可行性判断。电解水制氢的先进水平大约是5 kWh/Nm3H2,按化学计量比,1 Nm3CH4需要4 Nm3H2,也就是每立方米合成天然气大约消耗20 kWh电和1 Nm3CO2。甲烷的低位热值约为9.97 kWh/Nm3,所以电转气的综合效率大概在50%左右,其余能量变成了反应热,理论上可以回收,但工程上未必都收得回来。
产气量和耗电量的线性关系可以写成:
Q_CH4(t) = η_p2g × P_p2g(t) / LHV_CH4
其中η_p2g取0.50-0.55。CO2消耗量则按每Nm3甲烷需要1.96 kg CO2折算,也就是说,一座10 MW的P2G装置满负荷运行24小时,耗电240 MWh,产甲烷约12,000 Nm3,同时消耗约23.5吨CO2。
运行约束部分,电解槽有最小稳定运行功率,一般不能低于额定功率的10%-20%;甲烷化反应器对爬坡速率有要求,建议设一个不超过每小时20%-30%额定产气量的爬坡限制;反应器启停代价大,最好也用一个0-1变量控制是否运行,避免调度模型频繁启停造成工程上无法执行的情况。储气罐的作用是解耦产气和用气在时间上的不匹配,燃气可以存起来,等到电价低时产、气价高时卖。
2.4 储能、风电和光伏的钱要花在刀刃上
储能模型相对成熟,用SOC递推方程就行。风电和光伏的接入给系统带来了不确定性,建模上我建议先做两件事:一是把历史出力做场景削减,选出5-10个典型场景;二是给风电光伏加上可弃的限制,弃风弃光在模型中应该被允许,但要放到目标函数里作为惩罚项,这样P2G和CCS才有“消纳可再生能源”的价值体现。如果强制要求全额消纳,模型直接就牺牲经济性来做减碳,得出的结果不具备参考意义。
3. 三流耦合:电、气、碳到底在哪个节点交汇
3.1 电网侧:一条母线把所有功率穿起来
所有用电和发电最终都要落到电功率平衡上:
P_grid(t) + P_wind(t) + P_pv(t) + P_wte(t) + P_discharge(t) = P_load(t) + P_ccs(t) + P_p2g(t) + P_charge(t)
左边是电源侧加购电,右边是负荷加耗电设备。注意这里P_p2g和P_ccs都出现在负荷侧,它们是虚拟电厂内部的“可控负荷”,也是整个调度模型的调节抓手。P_grid可以拆成购电和售电两个非负变量,通常购电价和上网电价不一样,拆开后目标函数里才好分别计价。
这个平衡式看着简单,但它是全模型的核心骨架。每次调试运行时不收敛,我都会先看这个等式两边能不能对上,这是最快的排错方式。
3.2 天然气侧:储气罐就是缓冲池
P2G产出的合成天然气要有一个去处。最简单的模型是接一个储气罐,调度周期结束时储气量回到初始值附近,这样模型不会把一天的气都产出在某个时段。
Q_p2g(t) + Q_buy(t) = Q_gas_load(t) + Q_inject(t) - Q_withdraw(t)
储气罐的SOC递推和电池类似,只是效率和容量的物理量纲换成立方米和立方米/时。如果周边有燃气机组,模型还可以把燃气机组作为一个气转电的下游需求,构成“电-气-电”循环;不过在我处理过的场景里,燃气机组通常是外部对象,内部只保留储气和售气出口就够了。
3.3 碳流闭环:捕集、利用、排放的账怎么记
碳流是这个模型最容易算错的地方。我的处理思路是这样的:垃圾焚烧烟气里的CO2总量等于处理量乘排放因子,其中一部分被捕集,捕集的那部分再被P2G消耗,剩下真正排放到大气中的是烟气未被捕集的部分。
E_net(t) = E_exhaust(t) - E_capture_used(t)
这里有一个资产口径问题:如果P2G产出的甲烷最终在别处燃烧,那被“利用”的CO2又会变成排放,只是排放的时间和地点换了。在虚拟电厂内部结算时,我们只对“本系统边界内的净排放”负责。也就是说,捕集后用于P2G的CO2,在本系统内是循环利用,不算当期外排;但如果对外宣称减碳效果,需要明确这是碳循环还是碳封存,这是两个完全不同的概念。
耦合的精彩之处在于,CCS捕集的CO2不是废弃物,而是P2G的原料。没有CCS,P2G要么花高价外购CO2,要么因为缺碳源而无法满负荷运行;没有P2G,CCS捕下来的CO2要么压缩运输去封存,要么就地液化储存,哪一样都是成本,而不是收益。两者一接上,碳从“要花钱处理的废物流”变成了“能产气卖钱的原料流”。
3.4 非线性从哪里来,又该怎么处理
构成主要非线性的是三个乘法关系:捕集能耗与捕集量之间是乘积关系;P2G转化效率在不同负荷率下会有变化;碳排放成本和排放量的乘积是二次的。工程上最省事的处理方法是分段线性化。比如把P2G的效率曲线按负荷率分成三段,每段用一个线性斜率,模型就变成混合整数线性规划(MILP),交给Gurobi或CPLEX求解就很稳。
逻辑关系方面,比如“CCS不运行时,P2G不能从厂内获取CO2”这种约束,用大M法加0-1变量就能表达。加上这些线性化之后,模型规模和求解难度都在可控范围内。
4. 优化问题落成MILP:目标函数、关键约束和求解器
4.1 目标函数:成本项要一项项拆,不能只写“总成本最小”
我的日前调度目标函数长这样:
min ∑[ C_buy(t)×P_buy(t) − C_sell(t)×P_sell(t)
- C_gas_buy(t)×Q_buy(t) − C_gas_sell(t)×Q_sell(t)
- C_co2(t)×(E_net(t) − E_quota(t))
- SUC_burn(t) + SUC_p2g(t)
- C_curtail(t)×(P_wind_avail(t) − P_wind(t)) ]
拆开看就是购电成本减去售电收益,加上购气成本减去售气收益,再加上碳交易成本、设备启停成本、弃风弃光惩罚。垃圾焚烧机组在这里比较特殊,它的核心收入来自垃圾处理费,在运行调度模型中处理费是固定收益,不影响时段间决策,所以可以不放进目标函数。
碳交易这个约束我用了配额制:设定一个碳排放配额,如果净排放超过配额就要买入碳配额,低于配额则可以卖出获得收益。碳价是外部参数,在算例里可以按情景设定,这样结果能体现出“碳价高低对调度策略的影响”。
4.2 关键约束的数学化表达
功率平衡、储气SOC这些最基础的约束按前面建好的元件模型逐条加进去。有几条相对容易出错的我要特别提醒:
第一,垃圾处理总量约束必须是硬约束,∑M(t) = M_collect,不能加罚函数替代,否则模型为了省钱会把垃圾处理量压到零,虽然目标函数“好看”了,但物理上完全不可行。第二,CCS的捕集能耗要加上抽汽折减的发电损失,这个损失相当于减少了焚烧机组的可调出力上限。第三,P2G的产气量要和CO2消耗量绑定,中间还应有一个储CO2罐来解耦“捕集”和“利用”在时间上的错配,否则模型需要每个时段捕集量都必须正好等于利用量,可行域会被压得非常窄。
逻辑约束示例:
# 用大M处理P2G产气和碳捕集的联动 # yccs[t]=1 表示CCS运行,ep2g[t]为CO2消耗量 ep2g[t] <= bigM * yccs[t] ep2g[t] <= eta_capture * mu_co2 * M_proc[t]这种写法可以保证P2G只能消耗系统中实际捕集下来的CO2,不能让模型“凭空消耗”二氧化碳。
4.3 不确定性:先跑场景法,再考虑鲁棒
风电光伏出力有波动,最稳妥的起步做法是场景法:把天气历史数据聚类成几个场景,每个场景给一个概率,目标函数改成期望成本。这样模型能够回答“在典型风况下,CCS和P2G应该如何运行”的问题。
想要更严谨,再往分布鲁棒方向走。用Wasserstein距离构造模糊集,把场景法得到的经验分布在模糊集内做最坏情况优化,求得的结果对分布偏移有更好的鲁棒性。不过说实话,对于垃圾焚烧虚拟电厂的日前调度,最大的不确定性往往不是风光,而是垃圾热值和市场电价。这两个量在场景生成时优先级应该排在风光之前。
求解器方面,我习惯用Python调Gurobi,模型规模在24时段、两台焚烧机组、5个场景的情况下,整数变量大概一两千个,求解时间通常在一分钟以内,完全够用。
5. 算例设计:四个对比方案能说明什么
5.1 算例参数怎么搭才有说服力
搭算例时最忌讳的是所有参数都“拍脑袋”。我的做法是找一个中型城市垃圾焚烧电厂的真实轮廓:日处理垃圾800吨,装机容量25 MW,配置5 MW风电、3 MW光伏、5 MW/20 MWh储能、10 MW电转气装置和一套能处理90%烟气CO2的碳捕集系统。垃圾热值取10 MJ/kg,排放因子取0.7 tCO2/t垃圾,P2G综合效率55%。
电价采用峰谷价差明显的曲线,谷时0.25元/kWh,峰时0.75元/kWh。碳价先设一个中性情景40元/t,然后在敏感性分析中再从0元扫到120元/t,看策略转折点出现在哪里。这套参数不一定要绝对精确,但每个数都要有来源可查,审核论文或项目报告时才不会被问住。
5.2 四种方案跑出来的差异
我一般会设计四个方案做对比:
| 方案 | 碳捕集 | 电转气 | 说明 |
|---|---|---|---|
| A | 无 | 无 | 基准场景 |
| B | 有 | 无 | 只看碳捕集单独作用 |
| C | 无 | 有 | P2G需外购CO2 |
| D | 有 | 有 | 本文讨论的完整耦合系统 |
跑完结果,典型结论是这样的:方案B的运行成本比A高,因为它多了一台耗电设备,尽管减少了碳交易支出,但在中等碳价下不足以覆盖成本;方案C的P2G因为外购CO2价格高,利用率很低,弃风率改善有限;方案D的总成本在碳价较低时比A高,但当碳价上升到某个临界值后,反而低于B,甚至低于A。
更有意思的是弃风弃光率指标。方案D的弃风弃光率通常能比A下降10-20个百分点,原因是峰谷两个低谷时段P2G和CCS同时增耗电,正好把原本要弃掉的风光余电“吃”掉了。这个消纳收益在目标函数里未必直接显现为电费节省,但叠加碳交易收益和售气收益后,整体经济账就活了。
5.3 结果图应该盯哪几条曲线
我拿到求解结果后,从来不会只看总成本数,而是先看四个关键曲线:一是电功率平衡图,确认P2G和CCS的用电曲线是否出现在电价低谷;二是捕集率曲线,看它是不是在弃风时段升高;三是储气罐SOC曲线,确认产气和用气在时间上被合理解耦;四是碳净排放累积曲线,看哪个时段碳排放强度最高。
有一次跑出来发现P2G在凌晨三点启动,但储气罐SOC显示产出的气根本存不下,仔细排查才发现储气罐容量设小了。这种问题光看总成本是发现不了的,所以建议你也养成看曲线细节的习惯。
6. 踩过的坑与工程落地时的现实考验
6.1 垃圾热值和排放因子的口径陷阱
垃圾焚烧的排放因子是一个很容易被做高估的环节。垃圾里有一部分是可再生来源的生物质碳,比如厨余、纸张、木竹,焚烧它们产生的CO2在生命周期口径下属于短周期碳循环,不能和塑料这类化石碳混为一谈。很多文章把两者合并成一个总排放因子,然后减碳效果就有水分了。
我的建议是把排放因子拆成两项:化石碳因子和生物碳因子,模型里分别跟踪。如果以后要做“负排放”或“碳移除”的叙事,必须明确只有化石碳捕集和封存才是真正的减排,生物碳部分只能算“加速碳循环回归”。这个口径说清楚,评审和业主都能理解。
6.2 求解无可行解的排查顺序
MILP模型给你返回“infeasible”的时候,不要慌。我的排查顺序固定是这样:第一步查平衡约束,母线功率平衡和气体平衡是不是漏了时段;第二步查储物约束,储气罐SOC初值和终值设置有没有冲突;第三步查总量约束,垃圾处理总量和机组上下限是否矛盾,比如总收运量800吨,但机组日最小处理量只能到750吨,那就无解了;第四步查大M系数,取太小会把可行域错误切除,取太大又会出现数值病态。
大部分第一次建模的人会栽在垃圾处理总量和机组最小处理量的矛盾上,因为这两者单独看都没有问题,放在一起就冲突了。
6.3 模型复杂度爆炸的应对思路
把东西都建进去之后,模型规模很容易失控。我的经验是可以做三个降维操作:一是把焚烧机组的启停变量直接固定为1,因为城市固废处理决定了焚烧机组必须连续运行,“燃煤机组式”的启停优化在垃圾焚烧场景里没有意义;二是把24个时段按负荷特性聚合成几段做预调度,得到一个粗略的启停和运行计划,再回到完整时段细化;三是先跑确定性模型,模型通过后再加场景。
如果还是慢,就果断放弃15分钟颗粒度,回到1小时颗粒度。先证明调度策略本身是对的,再追求时间精度。
6.4 对外汇报时的表达底线
每次给合作方汇报时,我都会提醒自己避免一个表述:“实现了零碳运行”。这不可能。P2G产出的甲烷只要被燃烧利用,CO2最终还是会回到大气;流程只是把化石源碳的排放时间延迟了,或者把生物源碳的排放路径改了一下,中间绕过了一圈能源转换。真正的零碳需要把CO2封存在地下或长期固化在材料里,那不是运行调度模型能承诺的事。
在写结论时我会用“单位供电碳排放强度下降”和“碳循环利用率提升”这类表述,既准确又不夸大。另一个现实提醒是经济性的外部依赖:整个系统在碳价偏低、弃电率偏高的环境下最有利;如果碳价很低、天然气价格又高,P2G的经济账就很难算平,这时与其硬建,不如先做气价和碳价的敏感性分析。
我个人在完成这套模型后的体感是:CCS和P2G放在垃圾焚烧虚拟电厂里,不是简单的“1+1”,而是让碳从废弃物管理变成了调度资源。捕集设备可以当作可调负荷去填谷,P2G可以当作碳汇和产气设备去提升消纳和降低碳成本。真要说这套模型教会了我什么,那就是减碳设备不能孤零零地看单台设备效率,一定要放进整个系统的时间维度和能量维度里重新定价。如果有条件继续往下做,我建议先把日前调度扩展成“日前+日内滚动”两级框架,让P2G的启停决策更贴近实时风光的实际出力,然后再考虑把合成天然气接入更完整的燃气网市场。这样模型的价值还能再往上走一截。