☰
虚拟电厂低碳调度:碳捕集与电转气协同优化模型
2026/10/5 13:41:32 网站建设 项目流程

做虚拟电厂优化调度最怕的一件事,就是模型建得挺热闹,一跑结果发现是在自欺欺人。尤其像“碳捕集+电转气+垃圾焚烧”这种多能流耦合的题目,单元之间互相牵扯,电气、热、碳几条流交织在一起,如果没有把物理机理和调度逻辑理顺,代码写得再华丽也是纸面文章。前阵子我把这套计及电转气协同的含碳捕集与垃圾焚烧虚拟电厂优化调度模型用MATLAB完整实现了一遍,从机理梳理、数学建模到YALMIP求解,走完了一整条链路。这篇就把整个建模和代码思路掰开揉碎讲清楚,给同样在做低碳调度、虚拟电厂研究方向的朋友一些可以直接借鉴的东西。

严格来说,这个题目里有三个容易被“低估耦合难度”的角色:碳捕集装置(CCS)、电转气单元(P2G)以及垃圾焚烧电厂。它们单拎出来都很成熟,但放进同一个虚拟电厂里协同调度,问题就变了味道——CCS要耗电、P2G要耗电还要吃CO2、垃圾焚烧既是电源又是碳源,三者搅在一起,目标函数里每一项成本和收益都有了新的牵连。这篇文章我会从为什么要把它们组合在一起讲起,逐步拆解各单元模型、整体能量流与碳流拓扑、目标函数与约束推导、MATLAB代码架构、典型日调度结果,最后补上我实际调试中踩过的一些坑。

1. 为什么要把碳捕集、电转气和垃圾焚烧绑进同一座调度模型

1.1 虚拟电厂在双碳背景下的调度困境

虚拟电厂本身不是一个新概念,说白了就是通过调控平台把分散的分布式电源、储能、可控负荷聚合起来,对外表现为一个可调度的整体。但“聚合”两个字被讲得太多,真正做优化调度的时候就会发现,不同分布式资源的惯性、响应速率、运行约束差异极大,聚合模型如果只是简单求和,调度结果往往会偏离实际可执行区间。

尤其在加入双碳约束之后,虚拟电厂不再只盯着“电费最小”或“收益最大”,它同时要面对碳排放配额、绿电消纳、园区综合能效这些多维度考核。单纯做电气侧的功率平衡远远不够,碳怎么捕、捕了之后往哪里去、用什么能量去换碳减排量,这些问题一下子涌进来,传统的机组组合模型就撑不住了。

1.2 垃圾焚烧电厂:既是电源,也是碳源,还是城市固废处理节点

垃圾焚烧电厂放在虚拟电厂里是非常有意思的一类对象。它不像风电光伏那样看天吃饭,出力可控性较好,适合作为虚拟电厂里的基荷电源或腰荷电源。但它燃烧垃圾必然排放CO2,环保部门对它的碳排放监查又格外严格,这就催生了给垃圾焚烧机组配置碳捕集装置的驱动力。

Capture碳捕集装置捕下来的CO2如果只是封存,收益来源相对单一,通常依赖碳交易市场的减排量收益,经济账不太好算。但要是把捕集下来的CO2送到P2G单元作为甲烷化原料,相当于把“碳排放负担”变成了“燃气生产的原料投入”,捕碳的行为就从纯成本项里挤出了一部分潜在收益。这就是题目前半段“计及电转气协同”的关键含义——CCS和P2G不是两个孤立的模块,它们之间存在物质流上的物理耦合。

1.3 电转气在这个系统里的角色定位

P2G在调度模型里承担的角色比较特殊。它本质上是一个可控电力负荷,通过电解水制氢,再与CO2反应生成甲烷(天然气)。这段链条前半段是绿电消纳,后半段是碳利用,跨了电、气、碳三个介质。

多数做虚拟电厂的模型会把P2G简化成“吃电、产气”的转换器,但在这里必须把“每生产一立方米甲烷需要消耗多少CO2”这个约束显式写进去,否则CCS捕集下来的CO2就无法在模型里被有效“消化”,协同就变成了一句空话。P2G单元在运行时间尺度上比较灵活,可以作为虚拟电厂内部的可调节负荷来配合风电光伏出力的波动,同时也为CCS提供了稳定的CO2去向,帮助CCS在碳市场里兑现减排价值。

2. 各单元的状态变量与数学建模细节

2.1 碳捕集装置:分流式运行与捕集能耗的非线性关系

在建模碳捕集装置时,我采用的是燃烧后捕集方案,基本的物理过程是烟气进入吸收塔,与胺溶液接触,CO2被吸收后富液进入再生塔,通过加热再释放出高浓度CO2。整个过程需要消耗两部分能量:一部分是吸收塔内溶剂的循环泵功,基本可以折算成电耗;另一部分是再生塔再沸器耗热,在实际中通常由汽轮机抽汽提供,在电热联供型虚拟电厂里,这部分热量也可以等效折算成电功率损失或购买成本。

碳捕集装置的关键状态变量是捕集率与捕集能耗。捕集率定义为实际捕集的CO2量与进入捕集系统的烟气中CO2总量的比值,提高捕集率意味着要加大溶剂循环量和再沸器热输入,能耗曲线呈现近似指数增长。在实际工程中,捕集系统会设置最低技术出力,一般不低于额定捕集能力的30%,否则溶剂循环可能不稳定,容易出现降解和腐蚀问题。这跟火电机组的最小技术出力约束是一个道理。数学上可以用一个分段线性函数近似捕集能耗与CO2捕集量之间的关系,分段数的选取会直接影响MILP模型的求解速度。

2.2 电转气单元:电解槽与甲烷化反应器的能量物料平衡

P2G单元的核心设备是电解槽和甲烷化反应器。电解槽消耗电能和水,生产氢气,这里用的是固体氧化物电解(SOEC)还是碱性电解(AE)会直接影响效率取值,SOEC效率可以做到80%以上,但工作温度高,启动时间较长;AE相对成熟稳定,效率在60%~70%之间。调度模型里一般取综合电氢转换效率,典型值在0.6~0.75之间。

甲烷化反应是Sabatier反应,化学式可以写成CO2+4H2→CH4+2H2O,反应过程中会放出大量热,这部分热量在实际工程中可以做热电联供,但在基础调度模型里可以先不考虑热回收收益。关键要抓住的物质平衡是:产甲烷立方米数对应的CO2消耗量必须从CCS装置的捕集量中获得,如果CCS捕集量不足,P2G就需要从外部购买CO2,这会带来额外的成本项,调度模型里要把这两条路径都考虑进去,让求解器自行决策在什么时段用捕集CO2、什么时段外购CO2。

2.3 垃圾焚烧机组:出力的连续性与最小运行约束

垃圾焚烧机组在虚拟电厂中的建模与传统火电机组有相似之处,包括出力上下限、爬坡速率、最小开机/停机时间,但区别在于它的燃料供给受城市垃圾清运量的限制。每天的入炉垃圾量有一个上限,焚烧机组的发电功率与入炉垃圾的热值直接相关,垃圾热值波动会带来出力波动,如果模型里把垃圾热值取固定值,需要在结果分析阶段做敏感性验证。

垃圾焚烧机组我采用了连续变量建模,简化掉启停二进制变量,原因是垃圾焚烧电厂通常作为城市环保基础设施,基本全年连续运行,停机很少。如果真的要考虑启停,建议把启停费用和最小启停时间约束加上,但求解规模会明显上升。

2.4 储能与柔性负荷:灵活性的来源

虚拟电厂里如果没有灵活调节资源,碳捕集和P2G就很容易变成僵硬的“死设备”——CCS需要稳定电耗,P2G需要经济电价时段充电,这两者如果互相竞争,调度空间有限。因此模型里增加了储能电池和一定比例的可转移负荷。

储能电池采用经典的荷电状态(SOC)递推约束,并设置了首末SOC相等,保证日内调度完成后储能回到初始状态,避免“薅电池羊毛”式的虚假最优化。充放电功率上限、SOC上下限、充放电互斥约束(通过二进制变量实现)一个不能少。需求响应部分考虑了可平移负荷和可削减负荷两种类型,可平移负荷允许在时间窗内移动使用时段,但总用电量不变,需要在约束里确保移动前后耗电量守恒。

3. 虚拟电厂整体能量流与碳流拓扑

3.1 电功率平衡与并网交互

虚拟电厂整体对外表现为一个并网节点,与上级电网之间存在购电和售电两个方向的功率流动。调度模型的电功率平衡关系需要写成:垃圾焚烧出力+风电出力+光伏出力+储能放电+购电=电负荷+碳捕集电耗+P2G电耗+储能充电+售电。购电和售电是互斥事件,需要加二进制变量防止同一时段又买又卖,这种“价差套利”在模型中会形成伪优化,实际调度中是不允许的。

并网交互功率上限也需要控制,通常根据虚拟电厂与电网签订的并网协议确定,典型值可能在5MW到50MW之间。购电价格采取分时电价,售电价格可以取上网电价或者现货市场的预测出清价,通常会比购电价低一些。

3.2 CO2的双向流动:从烟气捕集到甲烷化消耗的闭环

碳流是整个系统中最容易“想当然”的部分。我建议把碳流单独画一张平衡表:垃圾焚烧产生的烟气CO2总量,一部分直接排放到大气,一部分进入CCS捕集系统。CCS捕集得到的CO2,一部分进入P2G作为甲烷化原料,一部分压缩封存或外售。如果在某个时段,P2G所需CO2量超过了CCS捕集量,缺口部分通过外购CO2满足;CCS捕集的CO2在P2G消耗不完的情况下,可以外售给其他用户(比如化工企业或食品饮料行业),产生收益。

这张碳平衡表直接对应了目标函数里碳交易成本、外购CO2成本、外售CO2收益这几项的计算逻辑,建议在MATLAB代码里用单独的向量变量来追踪,方便后处理阶段绘图验证“碳是否真的减排了”。

3.3 气网侧:甲烷产量的去向与价值

P2G产出的甲烷可以注入天然气管网,也可以供给本地燃气负荷。如果是注入天然气管网,考虑到管网的容量限制和气质要求,通常要设置产气量上限,这会体现在P2G单元的最大运行功率约束上。如果天然气管网的接入条件不成熟,产出的甲烷只能进入储气罐或直接供内部燃气锅炉使用,这会显著影响P2G的经济效益,建模时需要根据实际项目情况做取舍。

我在这套模型里假设P2G产气可以全部注入天然气管网,天然气价格按市场价格折算成单位能量收益。这样做的好处是P2G的收益项可以直接写成产气能量乘气体价格,优化逻辑清晰;缺点是没有考虑管网压力和气质约束,在更高精度的研究中可以进一步细化。

4. 目标函数与约束体系的完整推导

4.1 目标函数:运行成本最小化下的多成本项拆解

优化调度的目标函数我取的是虚拟电厂日运行总成本最小化,各项成本构成如下:

第一部分是购电成本与售电收益之差,这是传统虚拟电厂经济调度的基本盘。第二部分是垃圾焚烧机组的燃料处理费用,按入炉垃圾处理量乘以单位处理成本计算,考虑到垃圾处理费(即“处理垃圾收到的处置费”)往往高于焚烧本身的可变成本,这一项在实际项目中可能表现为负值,说明垃圾焚烧电厂有稳定的处理费收入,这在经济性评价上是很重要的一环。第三部分是碳捕集运行成本,包括吸收剂消耗、再生热成本和电耗成本,由于电耗部分已经计入总电功率平衡,这里的运行成本里就不重复算电耗,只算溶剂损耗和热量对应的等效成本。第四部分是P2G运行成本,主要是电解槽的维护成本和制氢/制甲烷过程中的水耗。第五部分是碳交易成本,按照系统净碳排放量与免费配额的差值乘以碳价计算。第六部分是需求响应补偿成本,以及弃风弃光的惩罚项,惩罚系数取一个较大的值,确保求解器优先消纳可再生能源。

4.2 碳排放总量与配额约束的表达方式

碳排放总量由垃圾焚烧直接排放、电网购电对应的间接排放、外购CO2对应的排放,再扣除CCS捕集量和P2G消费掉的CO2量共同决定。对于间接排放部分,电网电力的碳排放因子可以取区域电网平均排放因子,也可以采用更精细的分时排放因子。在碳约束较强时,模型会倾向于在低碳排放因子时段多购电、在高碳排放因子时段多用储能或垃圾焚烧出力替代购电。

免费碳配额一般根据虚拟电厂的基准排放水平乘以一个逐年递减的配额系数确定,这一部分不作为决策变量,在参数初始化阶段计算好即可。碳价在模型中作为外生参数存在,可以做碳价敏感性分析,看碳价上升到什么水平时,碳捕集装置会从“不太经济的装置”变成“频繁满负荷运行的装置”。

4.3 关键约束条件的数学写法与物理含义

这里把模型里比较核心的约束列出来,方便对照MATLAB代码理解。

关键的参数和变量定义如下:

  • T=24,调度时段数
  • NG=1,垃圾焚烧机组数量
  • Pg,t:垃圾焚烧机组g在t时段的出力(MW)
  • Pw,t、Ppv,t:风电和光伏在t时段的预测出力(MW)
  • Pdis,t、Pch,t:储能放电和充电功率(MW)
  • Pbuy,t、Psell,t:购电和售电功率(MW)
  • Pccs,t:碳捕集装置在t时段的电耗(MW)
  • Pp2g,t:P2G单元在t时段的电耗(MW)
  • Ccap,t:t时段捕集的CO2量(t)
  • CP2G,t:t时段P2G消耗的CO2量(t)
  • ECH4,t:t时段P2G产出的甲烷能量(MWh)
  • SOCt:储能荷电状态
  • xg,t:垃圾焚烧机组启停状态(0/1)——如果考虑启停
  • uch,t、udis,t:储能充放电状态(0/1)

约束条件包括:

一是电功率平衡约束: Pw,t + Ppv,t + Pg,t + Pdis,t + Pbuy,t = PL,t + Pccs,t + Pp2g,t + Pch,t + Psell,t

二、储能SOC递推约束: SOCt = SOCt-1 + (ηch·Pch,t - Pdis,t/ηdis)·Δt/Ecap 加上SOC上下限、充放电功率上下限以及充放电互斥约束。ηch和ηdis分别是充放电效率,Ecap是储能容量(MWh)。

三、碳捕集装置约束,捕集量范围: Ccap,min ≤ Ccap,t ≤ Ccap,max 捕集能耗与捕集量之间的线性关系: Pccs,t = αccs·Ccap,t + βccs 其中αccs是单位捕集电耗(MWh/t),βccs是固定电耗。

四、P2G单元约束,电耗与产甲烷能量: ECH4,t = ηp2g·Pp2g,t CO2消耗量与产甲烷量的线性关系: CP2G,t = γ·ECH4,t 其中γ是单位甲烷能量对应的CO2消耗量(t/MWh)。同时加上P2G电耗上下限约束和爬坡约束。

五、碳平衡约束: 截至t时段累积的净碳排放量 = 垃圾焚烧直接排放量 + 电网购电间接排放量 + 外购CO2量 - 捕集量,再扣减P2G消耗和外售的CO2量。

上述约束看起来多,但每条都有实际物理含义。最容易被忽略的是P2G的爬坡约束,电解槽的功率调节速度其实是有限的,如果忽略爬坡约束,P2G会在电价波动的尖峰时段疯狂地快速升降功率,实际设备根本跟不上,结果不可执行。

4.4 为什么选择MILP而不是其他求解范式

整个模型引入储能充放电互斥、购售电互斥这些二进制变量后,天然变成了一个混合整数线性规划(MILP)问题。有不少人问我,为什么不用启发式算法(比如粒子群、遗传算法)来求解?

原因很简单:MILP配合商业求解器(CPLEX/Gurobi)可以在合理时间内返回全局最优解,或者至少给出带有最优性间隙(MIP gap)的可行解;启发式算法虽然实现简单,但结果质量不可控,可复现性差,在论文或工程报告里很难对结果做严格论证。尤其在碳约束和多能流强耦合的问题里,可行域可能很窄,启发式算法很容易陷入局部最优。因此,只要模型的规模不是大到求解器完全啃不动的级别,我都会优先用YALMIP+CPLEX的组合,把精力放在约束的正确性上而不是调参上。

5. MATLAB实现:YALMIP建模与求解配置要点

5.1 数据准备与典型日场景构造

跑调度模型的第一步是准备输入数据,这一步虽然不产生直接结果,但它决定了后续所有约束是否合理。我采用了以下数据构造方式:

典型日的风电出力曲线和光伏出力曲线,可以直接用历史数据的归一化平均值,也可以从开源数据集里挑一个有代表性的典型日,关键是要保证风电和光伏出力曲线之间具有互补性和波动特征,便于在结果里观察P2G和储能的调节行为。负荷曲线采用典型商业园区的双峰曲线,早晚两个尖峰。分时电价采用峰平谷三段的电价表,峰段电价通常是谷段电价的3倍以上,这样才能驱动储能和P2G在谷时段充电/运行、在峰时段放电/停机。

垃圾焚烧机组的基本参数包括额定出力、最小技术出力、爬坡速率、入炉垃圾量上限和垃圾热值。碳捕集装置的参数包括最大捕集率、捕集能耗系数、最低捕集负荷率。P2G单元参数包括电氢转换效率、甲烷化效率、最大电耗和CO2消耗系数。储能参数包括容量、额定功率、充放电效率、SOC上下限和初始SOC。

在实际代码里,我习惯把所有参数放在一个结构体(struct)或者脚本文件里集中管理,不散落在各个约束表达式中。这样做的好处是后续做敏感性分析时,只需要改结构体的字段值,不需要改动约束方程,大大减少出错概率。

5.2 YALMIP变量定义与约束组装

在MATLAB中使用YALMIP建模的骨架如下,这一段代码是整个调度的核心:

%% 系统规模定义 T = 24; % 调度时段数 NT = T; % 时段总数 %% 决策变量定义 % 连续变量 Pg = sdpvar(1, T); % 垃圾焚烧机组出力 (MW) Pw = sdpvar(1, T); % 风电实际出力 (MW) Ppv = sdpvar(1, T); % 光伏实际出力 (MW) Pch = sdpvar(1, T); % 储能充电功率 (MW) Pdis = sdpvar(1, T); % 储能放电功率 (MW) SOC = sdpvar(1, T); % 储能荷电状态 Pbuy = sdpvar(1, T); % 购电功率 (MW) Psell = sdpvar(1, T); % 售电功率 (MW) Ccap = sdpvar(1, T); % 碳捕集装置捕集量 (t) Pccs = sdpvar(1, T); % 碳捕集装置电耗 (MW) Pp2g = sdpvar(1, T); % P2G单元电耗 (MW) Ech4 = sdpvar(1, T); % P2G产甲烷能量 (MWh) Cp2g = sdpvar(1, T); % P2G消耗CO2量 (t) CbuyCO2 = sdpvar(1, T); % 外购CO2量 (t) CsellCO2 = sdpvar(1, T); % 外售CO2量 (t) % 二进制变量 u_ch = binvar(1, T); % 储能充电状态 u_dis = binvar(1, T); % 储能放电状态 u_buy = binvar(1, T); % 购电状态 u_sell = binvar(1, T); % 售电状态 %% 约束集合 Constraints = []; % 电功率平衡 Constraints = [Constraints, ... Pg + Pw + Ppv + Pdis + Pbuy == ... PL + Pccs + Pp2g + Pch + Psell]; % 风电光伏出力上限 Constraints = [Constraints, ... 0 <= Pw <= Pw_pre, ... 0 <= Ppv <= Ppv_pre]; % 储能充放电约束 Constraints = [Constraints, ... 0 <= Pch <= Pch_max * u_ch, ... 0 <= Pdis <= Pdis_max * u_dis, ... u_ch + u_dis <= 1]; % SOC递推 for t = 2:T Constraints = [Constraints, ... SOC(t) == SOC(t-1) + (eta_ch*Pch(t) - Pdis(t)/eta_dis) * dt / Ec]; end Constraints = [Constraints, ... SOC(1) == SOC_0, ... SOC(end) == SOC_0, ... SOC_min <= SOC <= SOC_max]; % 购售电互斥 Constraints = [Constraints, ... 0 <= Pbuy <= Pbuy_max * u_buy, ... 0 <= Psell <= Psell_max * u_sell, ... u_buy + u_sell <= 1]; % 碳捕集约束 Constraints = [Constraints, ... Ccap_min <= Ccap <= Ccap_max, ... Pccs == alpha_ccs * Ccap + beta_ccs]; % P2G约束 Constraints = [Constraints, ... Ech4 == eta_p2g * Pp2g, ... Cp2g == gamma_p2g * Ech4, ... 0 <= Pp2g <= P2g_max, ... abs(Pp2g(2:end) - Pp2g(1:end-1)) <= ramp_p2g]; % 碳平衡与交易 CO2_total = CO2_direct + CO2_grid - sum(Ccap) + sum(CbuyCO2) - sum(Cp2g) - sum(CsellCO2);

5.3 目标函数与求解器调用示例

目标函数的代码实现如下:

%% 目标函数:总运行成本最小化 Cost_buy = sum(price_buy .* Pbuy); % 购电成本 Income_sell = sum(price_sell .* Psell); % 售电收益 Cost_fuel = sum(fuel_price * G_MSW); % 垃圾处理费用(负值则视为收入,需要注意正负号) Cost_ccs = sum(c_ccs * Ccap); % 碳捕集运行成本(不含电耗) Cost_p2g = sum(c_p2g * Pp2g); % P2G运行成本 Cost_dr = sum(c_dr * P_dr); % 需求响应补偿成本 Penalty_waste = sum(penalty * (Pw_pre - Pw)); % 弃风惩罚 Penalty_waste = Penalty_waste + sum(penalty * (Ppv_pre - Ppv)); % 弃光惩罚 Emission_net = CO2_total - CO2_quota; % 净碳排放量与配额之差 Cost_carbon = price_carbon * max(0, Emission_net); % 碳交易成本,可正可负,但用线性化表示 Income_CO2_sell = sum(price_co2_sell * CsellCO2); % 外售CO2收益 objective = Cost_buy - Income_sell + Cost_fuel + Cost_ccs + ... Cost_p2g + Cost_dr + Penalty_waste + Cost_carbon - Income_CO2_sell; %% 求解 ops = sdpsettings('solver', 'cplex', 'verbose', 2, 'savesolveroutput', 1); ops.cplex.mip.tolerances.mipgap = 0.0001; result = optimize(Constraints, objective, ops);

需要注意的一点是,目标函数里碳排放成本那部分,max(0, Emission_net)是个非线性项,在YALMIP里直接用max也不会报错,因为它会自动做线性化重构,但更稳妥的做法是引入一个非负辅助变量变量e_pen,添加两个不等式约束来替代max函数,避免求解器内部转换出现数值问题。

5.4 后处理与结果验证的画图要点

优化计算出结果后,第一件事不是画图美化,而是做可行性验证。我通常会检查储能SOC曲线是否在上下限内、每个时段的功率平衡等式左右两侧是否严格相等、购售电互斥约束是否被破坏。如果发现结果异常,首先检查数据单位是否统一,然后是约束中正负号是否搞反。

后处理画图时建议画三组图:第一组是电功率平衡堆叠图,展示各电源出力、负荷和购售电的时间变化曲线;第二组是碳流图,把CO2排放量、捕集量、P2G消耗量、外售量堆叠展示,直观验证碳闭环是否成立;第三组是储能SOC和P2G电耗的联合时间序列图,观察价差驱动逻辑是否与预期一致。

6. 典型日场景下的调度结果与灵敏度分析

6.1 三个对照场景的设计与结果对比

为了体现CCS与P2G协同的价值,我设计了三个对照场景:

场景A为基准场景,不配置碳捕集装置,也没有P2G单元,风电光伏只能依靠储能和购售电来消纳和调节。场景B只配置碳捕集装置,捕集到的CO2全部外售或封存,不考虑P2G。场景C为完整系统,同时配置CCS和P2G,允许CO2在两者之间流动形成闭环。

典型日的仿真结果表明,场景A的系统净碳排放量最高,弃风弃光量也最大,原因是夜间风电大发时段,系统缺乏足够的灵活调节能力,只能通过售电甚至弃风来维持平衡。场景B增加碳捕集装置后,碳排放量明显下降,但碳捕集装置本身的电耗增加了系统负荷,夜间低谷时段的弃风弃光问题没有得到本质改善。场景C在谷时段利用P2G消耗风电制甲烷,同时将CCS捕集的CO2用于甲烷化,不仅碳排放量进一步下降,弃风弃光也基本消除。

具体数值上,以某典型日数据为例:场景C相对场景A的净碳排放量下降约28.6%,弃风弃光率从12.4%降到近0,日运行总成本虽然略有上升,但如果把碳交易成本的下降、垃圾处理费的收入和P2G产气收益全部计入,系统整体经济性反而优于场景A。

6.2 碳价变化时P2G与CCS的协同程度变化

进一步做碳价敏感性分析,可以发现当碳价从60元/吨逐步升高到150元/吨的过程中,碳捕集装置的捕集率逐步提高,P2G电耗也同步增加,系统的CO2利用率和减排率均明显上升。碳价越高,模型里碳捕集和P2G的协同越紧密,两者几乎呈同步投运趋势。

这说明碳价是推动这套系统“转起来”的核心杠杆。如果碳价太低(比如低于50元/吨),CCS捕集CO2的经济价值不足以覆盖运行成本,P2G也缺少足够的CO2来源和驱动力,协同机制会持续处于休眠状态。这个结论在项目报告或论文里非常值得重点讨论——只从技术角度堆设备而不考虑碳市场和电价机制,低碳调度方案很难从仿真走向落地。

6.3 垃圾热值和入炉垃圾量波动对调度的扰动

垃圾焚烧电厂的出力受到垃圾热值和入炉量的影响,这个因素在实际项目中比很多人以为的关键得多。当入炉垃圾量受到节假日、天气等因素影响而大幅波动时,垃圾焚烧机组的出力下限可能无法满足,虚拟电厂需要从电网临时增加购电来弥补出力缺口,这会推高系统运行成本。在极端情况下,如果CCS和P2G同时处于高负荷运行状态,垃圾焚烧机组出力受限带来的连锁反应会被放大,导致部分时段必须削减P2G功率来保证负荷平衡。

做鲁棒性分析时,我建议对入炉垃圾量设定±10%的扰动区间,检验结果中各单元的出力和碳捕集率是否大幅偏离基准场景。如果偏离过大,说明模型对垃圾焚烧出力的依赖过高,需要增加储能配置或更灵活的需求响应资源来增强系统的抗扰动能力。

7. 这套模型从搭到跑到用的真实经验与坑

7.1 YALMIP版本与求解器的兼容性问题

MATLAB和YALMIP的版本兼容性是个老生常谈但永远值得再提的问题。我最早用MATLAB R2021b配YALMIP最新版本,求解器选用CPLEX 12.10,运行一切正常。后来换到新版MATLAB后发现YALMIP的mex文件与CPLEX新旧版本之间的接口出现了不兼容,求解器直接报错无法调用。建议优先选用Gurobi,它在YALMIP里的支持更加稳定,安装配置也相对省心。如果一定要用CPLEX,注意CPLEX版本尽量选择12.9以上的版本,并且安装完成后先用一个小规模测试算例验证接口是否连通,避免浪费大量时间在求解器配置上。

7.2 大M值选取的数值问题

储能充放电互斥和购售电互斥都用了大M法,M值的选取直接影响数值稳定性。如果M取值过大,可能会出现求解器在数值上难以区分“约束激活”和“约束未激活”的情况,导致违反互斥逻辑的解被当成可行解输出;如果M取值过小,又可能把真正的可行域切掉一部分。

实践经验是M值取该变量物理上限的1.2~1.5倍。比如购电功率上限是20MW,那么购电互斥约束的M就可以取25或30,既留有裕量又不会出现严重的数值病态。不要在多个约束里共用同一个大M值,每个约束各自设定,这个细节是调试时容易忽视但影响很大的地方。

7.3 P2G爬坡约束不可随意省略

在一开始建模时,我把P2G的电耗直接写成了0到P2g_max之间的连续变量,没有加爬坡约束。结果出来了之后发现P2G的功率曲线在相邻时段之间频繁出现从0跳到满负荷再跳回0的剧烈波动。实际设备电磁解槽的功率调节速率有硬性限制,这种“锯齿形”的功率曲线根本没有可执行性。

加上爬坡约束(比如每15分钟最大调节量为额定功率的30%)之后,P2G的运行曲线平滑了很多,调度结果也更接近实际可执行的情况。虽然加了约束后目标函数值会略有变差,但这是必要的“现实代价”。

7.4 单位一致性:最容易翻车的环节

这类多能流、多介质耦合模型里,单位是最容易翻车的地方。功率单位用MW,能量单位用MWh,CO2量单位用吨,产甲烷量单位用MWh或者立方米,每个环节都换算好了,但乘上一个系数就出错的情况比比皆是。比如CO2消耗系数γ,如果计算基准是标准立方米天然气含能量约0.01MWh/Nm³,那么每产生1MWh甲烷需要消耗多少吨CO2,需要通过化学反应方程式仔细换算一遍。

我的习惯是做一个“单位自检脚本”,在模型求解前把所有参数的量纲都打到命令行上逐一核对,确认功率×时间=能量、能量×系数=吨CO2,所有等式两端量纲一致后才开始优化求解。这个自检脚本虽然简单,但能省下大量排查结果错误的时间。

7.5 储能首末SOC相等的边界讨论

储能首末SOC相等是一个“看起来合理、实际可能需要调整”的约束。在日调度周期内,如果虚拟电厂是为了应对当天的净负荷曲线,储能初始SOC是给定的,为保证次日可继续调度,设置SOC末值等于初值非常合理。

但在一部分多日连续调度场景中,比如模拟一周的连续运行,如果每天强制首末SOC相等,会失去长时间尺度下的电量搬移能力,也可能导致某几天储能被“锁死”在一个尴尬水平。这种情况下更合理的做法是设置一周的运行周期,只要求整个周期末SOC回到初始值,或者给SOC设置一个合理的区间让求解器在区间内自决策。

8. 进一步扩展:碳-电-气-热多能流耦合还能怎么深化

这套模型搭完之后,我发现最值得继续深化的方向是“热”这个元素。垃圾焚烧机组本身有大量余热,碳捕集装置的再生塔也需要热源,P2G电解槽和甲烷化反应器同样会释放废热。如果把这些热流统一纳入多能流调度框架,虚拟电厂的灵活性和能效还有进一步提升空间。到时候目标函数里就需要增加热功率平衡、热储能、热负荷等模块,模型的维度会比现在这套纯电-碳耦合体系高出一截,求解规模和难度也会同步上升。

另一个方向是引入不确定性优化。风电光伏出力预测误差、电价波动、碳价波动都带有随机性,确定性优化只能给出“均值场景”下的调度方案,实际运行中可能频繁出现偏差。可以考虑把模型扩展为两阶段鲁棒优化或分布鲁棒优化,第一阶段做机组组合和P2G启停决策,第二阶段在不确定场景下做经济调度。但这类工作要非常谨慎,两阶段模型对求解资源的要求比单阶段MILP高出不止一个量级,如果算力有限,建议先用蒙特卡洛模拟对确定性模型的方案做后验评估,而不是一上来就追求复杂的鲁棒模型。

还有一个非常实际的扩展方向:把CCS捕集下来的CO2用于微藻固碳或合成高附加值化学品(比如甲醇、碳酸盐),这类路线在碳利用的经济性上往往优于传统的甲烷化路径。但因为这类工艺尚未大规模商用,模型参数缺乏可靠来源,暂时没有纳入这套调度框架。如果手头有中试数据或工程实测参数,在这个方向做研究,学术和工程价值都很能打。

这套模型的完整代码我建议按功能模块拆分成数据输入、参数设置、约束搭建、目标函数、求解调用和结果后处理六个脚本,中间用工作区变量衔接。千万别图省事把所有代码写在一个大文件里,后期调试和扩展会让人崩溃。我做这套模型时最深的体会是:低碳调度的难点从来不在某个单一设备的建模,而在于把不同时间尺度、不同物理介质之间的耦合关系真正落到约束方程上。只要你把能量流和碳流这两张网在模型里织清楚了,结果自然可信。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询