拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

虚拟电厂优化调度实战:阶梯碳交易+P2G-CCS+燃气掺氢建模与Matlab实现

虚拟电厂优化调度实战:阶梯碳交易+P2G-CCS+燃气掺氢建模与Matlab实现

搞电力系统优化调度的朋友,这两年应该都有一个直观感受:虚拟电厂(VPP)相关的算例越来越常见,而且组合越来越复杂。早几年做VPP,风光储加上需求响应就够一篇论文用了;现在题目动不动就是碳交易机制、电转气(P2G)、碳捕集与封存(CCS)、燃气掺氢,好几个热点叠在一起。这篇想完整梳理一下“基于阶梯碳交易的含P2G-CCS耦合和燃气掺氢的虚拟电厂优化调度”这个模型到底在算什么、怎么建模、怎么在Matlab里落地,以及我在复现这类文献时踩过的一些坑。如果你正在复现相关论文、写这部分毕业设计或者准备投稿,这篇应该能帮你少走不少弯路。

1. 为什么突然流行“阶梯碳交易 + P2G-CCS + 掺氢”:问题的来龙去脉

1.1 虚拟电厂到底是“电厂”还是“平台”

虚拟电厂本质上不是一台物理机组,而是一个聚合器。它把分散的风电、光伏、燃气轮机、储能、电解槽、可控负荷等资源捆在一起,作为一个整体参与电力市场或接受电网调度。和传统电厂相比,VPP的优势在灵活性——风电光伏出力波动大,但燃气轮机和储能可以补位;同时又多了电解槽这种可调节负荷,可以在电价低或弃风弃光时把电能转化成氢气储存起来。所以VPP的调度问题,本质上是一个多能源载体、多时间尺度的资源分配问题。

但这里有个容易被忽略的点:VPP如果只聚合了燃气机组,碳排放就躲不掉。近两年碳排放成本在模型里越占越重,于是碳交易机制被引入。可碳排放配额一旦变成成本项,燃气机组的地位就微妙了——用多了,碳成本高;用少了,系统灵活性又不够。这才引出后面P2G-CCS和掺氢的一整套改造逻辑。

1.2 三个热点技术各自解决了什么问题

碳交易解决的是“外部性定价”问题。碳排放不再是免费的,机组每烧一吨天然气,都要对应购买配额或承受超排惩罚。阶梯碳交易比单一碳价更贴近实际政策,它的边际惩罚随超排量递增,逼着调度策略在某个经济点上主动削减排放,而不是简单按固定碳价算一笔账。

P2G-CCS解决的是“碳往哪走”的问题。P2G用电力制氢,电解水产出氢气,氢气既能当燃料,也能通过甲烷化反应和CO2合成天然气。而CCS把燃气机组排出的CO2捕集下来,一部分封存,一部分直接送给甲烷化单元。这样VPP内部就形成了一条“电→氢→天然气”和“CO2捕集→甲烷化”的耦合回路,本来要排到大气里的碳变成了合成天然气的原料。

燃气掺氢解决的是“氢气怎么用”的问题。P2G辛苦产出的氢气,如果只是储存起来,经济性很差;但氢气可以直接掺入天然气管道,进燃气轮机燃烧。氢燃烧不产生CO2,掺氢比例越高,单位发电量的碳排放强度越低,还能顺便把电解槽的产氢消纳掉。难点在于热值、流量、燃烧稳定性这些工程约束都得进模型。

1.3 三者耦合后,VPP变成了什么样子

把这三块叠在一起,VPP内部就形成了电、氢、碳三条流互相耦合的复杂系统。电网上,风电、光伏、燃气轮机、储能、电解槽、常规负荷共同参与功率平衡;氢网上,电解槽产氢、储氢罐存氢、掺氢机组用氢、甲烷化耗氢;碳网上,燃气机组排碳、CCS捕碳、甲烷化耗碳、碳市场结算碳配额。三条流在燃气轮机和甲烷化反应器处交汇,任何一个环节的决策都会影响另外两条流。

这种耦合带来的直接结果就是:调度模型不再是单纯的机组组合或经济调度,而是一个多能互补的混合整数优化问题。你既要决定每一台机组发多少电,又要决定电解槽开多大功率、储氢罐充放多少、掺氢比调到多少、碳捕集量定在什么水平,最后还要面对碳市场的阶梯价格。这也是为什么这类模型适合用Matlab做——变量多、约束多、求解器接口成熟,非常适合理清逻辑后快速迭代。

2. 阶梯碳交易模型:配额、超排区间与碳价阶梯的数学表达

2.1 配额怎么来,实际碳排放怎么算

碳交易的第一步是核算配额。模型里最常见的做法是按VPP的发电量或负荷水平给一个免费配额:如果VPP年度基准发电量为某值,那每兆瓦时电量免费发一定数量的CO2配额。也可以用历史排放法,取过去几年的平均排放打个折扣作为初始配额。在模拟调度里,通常把配额设成常数或线性函数,比如:

免费配额 E_free = α × 系统总负荷(或总发电量)

其中α的单位是“吨CO2 / MWh”。这样配额就和调度结果挂钩了,你发得越多,给的免费额度也越多,但边际配额往往小于实际边际排放,所以多发多排仍然要买配额。

实际碳排放需要分项加总。最常见的排放源是燃气轮机:天然气燃烧直接排放CO2,按每标准立方米天然气对应的碳排放因子计算。如果VPP从外部电网购电,购电部分还要按电网平均碳排放因子折算间接排放。P2G本身用电不排碳,但它的电耗相当于增加了系统负荷,如果这部分电来自外购高碳电力,间接排放还是要算。CCS捕集掉的碳可以在排放总量里扣除,不过要按捕集率和捕集量来做减法。

碳排放总量 E_total = E_gt + E_buy - E_capture + ...

其中E_gt是燃气轮机燃烧排放,E_buy是外购电力的间接排放,E_capture是CCS实际捕集并封存或利用的CO2量。净排放与配额的差就是需要参与碳市场交易的部分。

2.2 阶梯碳价的分段函数与线性化技巧

阶梯碳交易的核心是:净排放量 E_net = E_total - E_free,它越大,单位碳排放要付的钱越多。举个例子,某个算例可以这样设三档:

阶梯区间超出配额量(吨)碳价(元/吨)
第一档0 ~ 100100
第二档100 ~ 250150
第三档250 以上200

在这个结构下,碳交易成本 C_carbon 不是一个线性函数,而是一个分段线性凸函数。很多人一看到“分段”就想到二进制变量,其实这里有个更好的处理方式:因为是凸的阶梯函数,直接用连续变量加顺序约束就可以。

设 E_1、E_2、E_3 分别表示落入三个阶梯的排放量,满足:

E_net = E_1 + E_2 + E_3 0 ≤ E_1 ≤ 100 0 ≤ E_2 ≤ 150 E_3 ≥ 0

碳成本直接写为:

C_carbon = 100×E_1 + 150×E_2 + 200×E_3

为什么这样可行?因为阶梯价格是递增的,优化目标会自动先填满低价档再进入高价档。你不会出现“第一档没装满就先去买高价碳”的情况,因为那只会让成本更高。这就是凸分段线性函数的经典线性化方式,不需要引入0-1整数变量,求解速度会快很多。我见过一些论文为了省事直接上大M法和二进制变量,结果模型规模大了好几倍,求解时间明显变长,其实完全没必要。

2.3 为什么阶梯机制优于单一碳价

单一碳价等于给每吨碳排放一个恒定价格,优化器算出来的减排量完全取决于碳价水平和边际减排成本曲线的交点。问题在于,真实碳市场的设计意图不是“等量惩罚”,而是“越超排越疼”。当排放量处于低位时,每吨碳的边际环境代价相对低;当超排越来越严重,就应该承担更高的边际惩罚。阶梯碳价刚好模拟了这个逻辑。

对调度决策来说,阶梯碳价还带来了一个很有意思的现象:它会引导系统在临界点附近做“跳跃式”调整。比如碳排放刚好超过第一档上限时,多排一吨碳的成本瞬间从100元跳到150元,那么优化器就会倾向于通过调整掺氢比、增加CCS捕集率或减少燃气出力,把排放压回较低档位。这种不连续的边际信号恰恰是单一碳价给不出来的。

3. P2G-CCS耦合的建模核心:化学计量、能量损耗与碳流闭环

3.1 电解水制氢:效率和氢气产能的关系

P2G的第一步是电解水制氢。电解槽消耗电能,产出氢气和氧气,核心关系为:

V_H2 = η_ele × P_el / LHV_H2

其中P_el是电解槽输入电功率,η_ele是电解效率(典型值0.6~0.75),LHV_H2是氢气低热值(约10.8 MJ/Nm³,换算约3 kWh/Nm³)。举个例子,一个1 MW电解槽,效率取0.7,每小时大概能产氢气 0.7×1000/3 ≈ 233 Nm³。这个数值不算大,但也够一台小型燃气轮机掺氢用了。

建模时容易忽略的是电解槽的可调节范围。它不是0到额定功率随便开的,部分负荷下效率通常会下降。很多文献为了保持线性,把效率设成常数,这是可以接受的简化;但如果你在复现结果时发现电解槽频繁在低功率运行,就要意识到实际效率没那么理想,结果只能作为理论指导。

3.2 甲烷化反应:CO2转化路径与化学计量

P2G的第二条路径是甲烷化,也就是把氢气与CO2合成为CH4,即 Sabatier 反应:

CO2 + 4H2 → CH4 + 2H2O

这个反应的化学计量关系非常关键:每消耗1份CO2,需要4份H2,产生1份CH4。模型里最常用的简化写法是:

V_CH4_out = V_H2_to_meth / 4 = V_CO2_to_meth

也就是说,进入甲烷化单元的氢气量除以4,就等于产出的合成甲烷量和消耗的CO2量。这里的单位必须保持一致,Nm³对Nm³最省事。实际工程中反应会有过量的氢气循环和催化剂损耗,但调度优化模型用理想化学计量是学界和工程仿真里的通用做法。

甲烷化的意义在于把难以储存的氢气转化成可注入天然气管网的常规燃气。你可能要问:既然氢气可以直接掺入燃气轮机,为什么还要费劲甲烷化?原因在于掺氢比例有上限、储氢容量有限,而天然气管道和燃气轮机对甲烷的兼容性远好于纯氢。所以P2G-CCS耦合的完整流程是:电解槽产氢,一部分直接掺燃,一部分进甲烷化;CCS捕集的CO2正好作为甲烷化的碳源。碳在这里没有排放到大气,而是重新变成燃料回到机组里。

3.3 CCS捕集与能耗:这个环节最容易被漏算

CCS在模型里通常简化为一个捕集效率和一个能耗系数。捕集量正比于燃气轮机产生的CO2量:

E_capture = η_ccs × E_gt

η_ccs一般取0.85~0.95,不可能做到100%,总有部分逃逸。捕集下来的CO2中,一部分去甲烷化,剩下的封存或外送。去甲烷化的CO2量由甲烷化单元的耗碳需求决定,其余部分按封存处理。

CCS最大的坑在能耗。胺法捕集每吨CO2大约要消耗200~400 kWh电能和一定热量,这部分能耗必须进入系统的功率平衡。我见过不少初稿模型把CCS当成零能耗设备,只算捕集量,结果燃气机组出力提高后电负荷反而没增加,明显失真。正确的做法是把CCS电耗 P_ccs 加到系统总负荷侧,或者从燃气轮机净出力里直接扣除,二选一,注意不要两边都扣。

P2G-CCS耦合让原本的“排碳”环节变成了“耗碳”环节。燃气轮机燃烧化石天然气排出的CO2被CCS捕集,再和电解氢合成甲烷,重新进燃气轮机燃烧,碳在系统里形成闭环。当然因为捕集率不是100%、甲烷化有损耗,这个循环还是需要化石天然气不断补充,所以它是“减碳”而不是“零碳”。模型的意义正在于:在给定碳价和耦合效率下,让优化器自己决定循环跑多快、补多少化石气最经济。

4. 燃气掺氢机组出力方程:热值换算与碳排放因子的修正

4.1 掺氢比的定义与混合气热值的换算

燃气轮机的燃料从纯天然气变成天然气和氢气的混合物后,首先要面对的是热值变化。掺氢比一般按体积比定义:

α = V_H2 / (V_H2 + V_CH4)

天然气低热值约35.9 MJ/Nm³,氢气低热值约10.8 MJ/Nm³,两者按体积混合后,混合气低热值为:

LHV_mix = (1 - α) × LHV_CH4 + α × LHV_H2

直观地说,α越大,混合气热值越低。如果机组想维持同样的输出功率,就必须增大混合燃气总流量。这个流量上限就构成了掺氢比的硬约束。很多文献直接给一个“最大掺氢比例10%~30%”,其实背后是燃烧器回火风险、气体流速限制和压气机喘振裕度在起作用。建模时不必细究燃烧动力学,把α设定在合理范围并加上“掺氢比爬坡限制”就足够贴近工程实际了。

4.2 掺氢对机组出力和排放强度的影响

掺氢机组的出力公式可以写成:

P_gt = η_gt × F_mix × LHV_mix

其中F_mix是混合气体体积流量,η_gt是机组发电效率。这里要分两种情况:一种是固定掺氢比,把这个公式直接代入功率平衡;另一种是掺氢比可调,则F_mix和α同时成为决策变量,约束就变成非线性了。实际工程文献里最常用的处理办法是固定热效率、把混合气流量和热值的关系线性化,或者预先设定几个掺氢比档位做比选。直接做连续非线性太费劲,而且求解器容易陷入局部最优。

碳排放强度方面,氢气和天然气的差异非常明显:

EF_mix = (1 - α) × EF_CH4

每标准立方米天然气燃烧排放约1.964 kg CO2,氢气燃烧零碳排放。所以在燃气轮机出力不变的前提下,掺氢比例越高,碳排放越低。这个线性关系给优化器提供了一个很直接的减排杠杆:碳价足够高时,它会主动把α往上限推。

4.3 掺氢比例决策的现实约束

掺氢比不是想调多高就调多高。从建模角度,我建议至少加上这三类约束:

  • 掺氢比上限:α ≤ α_max,比如0.2或0.3,取决于机组燃烧器改造程度。
  • 掺氢比爬坡限制:相邻时段α的变化不能太大,燃气轮机燃烧系统对燃料组成突变很敏感,工程上一般不允许剧烈切换。
  • 氢气可用量约束:每个时刻送入机组的氢气量不能超过储氢罐可释放量,这部分把氢流和电粘连在了一起。

还有一个容易被忽略的问题:掺氢之后机组的热耗率会变化,如果模型里用的是固定效率η_gt,那热值降低时燃料量增加、发电效率其实会有小幅波动。对于规划级优化调度,固定效率是普遍接受的简化;但如果你在做运行级仿真、追求结果精度,就得考虑效率随掺氢比变化的修正系数。

5. 优化调度全模型:目标函数、决策变量与完整约束体系

5.1 目标函数:经济性和碳成本的平衡

把所有成本项放到一起,目标函数可以写成:

min C = C_fuel + C_om + C_grid + C_carbon + C_p2g_ccs

  • C_fuel:外购天然气成本。注意要扣除甲烷化产出的合成天然气对天然气消耗的替代量,否则P2G-CCS的收益体现不出来。
  • C_om:各设备运维成本,通常按出力线性折算,燃气轮机、电解槽、CCS、储能都要计。
  • C_grid:与外部电网的购售电费用,购电为正、售电为负。
  • C_carbon:阶梯碳交易成本,按第2章的分段函数计算。
  • C_p2g_ccs:电解槽、甲烷化、CCS的固定加变动运行成本,用来反映设备启停、催化剂更换、吸收剂损耗这些开销。

这里要特别注意成本项之间的耦合关系。电解槽多耗电会提高C_grid或降低售电收益,但产出的氢气可以减少C_fuel(因为甲烷化产气)并降低C_carbon(因为掺氢减排)。CCS捕集会提高C_p2g_ccs和系统电耗,但会降低C_carbon。优化器本质上是在这些互相冲突的成本之间找平衡点。

5.2 关键约束:功率平衡、储能、P2G、碳交易一网打尽

决策变量我用一个表列出来,方便对号入座:

设备/模块决策变量
燃气轮机出力P_gt、掺氢比α、天然气流量V_CH4
电解槽输入电功率P_el、产氢量V_H2
储氢罐存氢量S_H2、充放氢量
甲烷化单元耗氢量V_H2_meth、耗碳量V_CO2_meth、产甲烷量V_CH4_out
CCS捕集量E_capture、电耗P_ccs
储能电池充放电功率、SOC
电网交互购电P_buy、售电P_sell
碳交易各阶梯排放量E_1/E_2/E_3

约束体系至少包含:

功率平衡约束:风电+光伏+燃气轮机+电池放电+购电 = 负荷+电解槽电耗+CCS电耗+电池充电+售电。这个等式把所有电功率串在一起,是最核心的耦合约束。

燃气轮机约束:出力上下限、爬坡速率、掺氢比上下限。如果模型是小时级调度,爬坡约束一般取每15分钟到1小时的功率变化率折算。

储能电池约束:SOC递推方程、充放电功率上限、充放电互斥(可以用二进制变量,也可以用互补条件线性化)。P2G和储能同时大充放电会导致功率平衡失真,所以必须约束。

氢系统约束:电解槽产氢量关系、储氢罐递推方程、甲烷化耗氢/耗碳/产甲烷化学计量关系、进入燃气轮机的掺氢流量与储氢罐释放量的平衡。

碳约束:燃气机组碳排放计算、CCS捕集量计算、净排放量的阶梯分解约束。这部分直接对接第2章的线性化写法。

很多初稿模型在这里会失控——每条设备约束单独看都对,但合在一起后变量间单位不统一或者某个耦合关系写反了。我的经验是先从功率平衡和碳平衡两个“总账”出发,再逐台设备填细节,比从设备端往系统端搭要快得多。

5.3 模型类型判断:LP、MILP还是NLP

如果所有约束都保持线性,目标函数也是线性的,那这就是一个线性规划问题。但储能充放电互斥通常需要引入二进制变量,变成MILP。掺氢比如果作为连续变量并且和燃气流量相乘,就会引入双线性项,变成NLP或需要分段线性化。

我的建议是:第一版模型尽量保持MILP。理由很实际——Yalmip配上Gurobi或CPLEX对MILP的求解速度飞快,24时段模型几百个变量几秒就能出结果。等模型跑通、逻辑验证无误,再考虑要不要加非线性项去逼近更精细的工程特性。我见过不少项目一上来就追求完全忠实描述设备非线性,结果连可行解都找不到,最后被迫砍约束,得不偿失。

6. Matlab + Yalmip 代码框架:从数学式到可运行模型

6.1 变量声明与参数初始化

用Matlab做这类优化调度,最顺手的组合是Yalmip + Gurobi/CPLEX。Yalmip把建模和求解器解耦,你只需要声明决策变量、写约束、写目标函数,剩下的交给求解器。下面是一个简化但完整的代码骨架,变量按24小时调度周期展开:

%% 基本参数 T = 24; dt = 1; % 时间步长,小时 P_gt_max = 2; % 燃气轮机最大出力,MW P_el_max = 1.5; % 电解槽最大功率,MW eta_ele = 0.7; % 电解效率 LHV_H2 = 3; % 氢气低热值,kWh/Nm3 alpha_max = 0.3; % 最大掺氢比 eta_ccs = 0.9; % 碳捕集率 quota = 0.4; % 免费配额,吨/MWh %% 决策变量 P_gt = sdpvar(1, T); % 燃气轮机出力 P_el = sdpvar(1, T); % 电解槽电功率 P_bat = sdpvar(1, T); % 储能净放电功率,正为放电 S_bat = sdpvar(1, T); % 储能SOC V_H2 = sdpvar(1, T); % 产氢量 S_h2 = sdpvar(1, T); % 储氢量 alpha = sdpvar(1, T); % 掺氢比 V_ch4 = sdpvar(1, T); % 天然气耗量,Nm3/h P_buy = sdpvar(1, T); % 购电功率 P_sell= sdpvar(1, T); % 售电功率

这里用sdpvar一次性声明整个时段的变量向量,比在循环里逐个声明清爽得多。功率用MW、氢气用Nm³/h、储能SOC用MWh,单位统一后约束写起来才不会乱。

6.2 约束写入与阶梯碳价的代码实现

约束用Yalmip的方括号累加方式非常直白。功率平衡、机组出力限制、掺氢约束可以这样写:

C = []; % 功率平衡:风电+光伏+燃气+储能放电+购电 = 负荷+电解槽+售电 C = [C, P_wind + P_pv + P_gt + P_bat + P_buy == P_load + P_el + P_sell]; % 燃气轮机上下限 C = [C, 0 <= P_gt <= P_gt_max]; % 电解槽上下限 C = [C, 0 <= P_el <= P_el_max]; % 产氢量关系 C = [C, V_H2 == eta_ele * P_el / LHV_H2]; % 掺氢比限制 C = [C, 0 <= alpha <= alpha_max]; % 掺氢使用的氢气总量约束:掺氢流量 = alpha/(1-alpha) * V_ch4 C = [C, alpha .* V_ch4 == (1 - alpha) .* (V_h2_to_gt)];

最后一行是非线性约束,因为alpha和V_ch4相乘。如果不想引入非线性,可以固定alpha或者把alpha离散成几个档位。这是我在实际复现中最常做的取舍——先跑固定档位场景,再考虑连续可调。氢气流量拆分可以用一个总氢平衡约束把产氢量分配到“掺氢燃烧”和“甲烷化”两路:

V_H2_out_gt = sdpvar(1, T); % 去燃气轮机的氢气 V_H2_out_meth = sdpvar(1, T); % 去甲烷化的氢气 C = [C, V_H2 == V_H2_out_gt + V_H2_out_meth]; % 掺氢耗氢与燃烧天然气量的比例关系 C = [C, V_H2_out_gt == alpha .* V_ch4 ./ (1 - alpha)];

碳交易部分最核心的阶梯线性化,代码是这样:

%% 阶梯碳价线性化 E_net = sdpvar(1, T); E_1 = sdpvar(1, T); E_2 = sdpvar(1, T); E_3 = sdpvar(1, T); B1 = 100; B2 = 150; % 阶梯边界 C = [C, E_net == E_1 + E_2 + E_3]; C = [C, 0 <= E_1 <= B1, 0 <= E_2 <= B2, E_3 >= 0]; % 碳成本(阶段价格) lambda = [100, 150, 200]; C_carbon = lambda(1)*sum(E_1) + lambda(2)*sum(E_2) + lambda(3)*sum(E_3);

这里E_net要对应整个调度周期内的碳排放与配额之差,或者分时段计算再汇总。注意E_2的区间实际上应当写成0到B2-B1,B2是第二档的累计边界。如果你把B2直接当成第二档宽度,阶梯边界就错了。我建议在代码注释里写清楚“B1是第一档宽度,B2是第二档累计宽度”,防止自己过两天看代码也搞混。

6.3 求解、结果整理与绘图

约束和目标函数都写好之后,求解就是一行命令的事:

objective = C_fuel + C_om + C_grid + C_carbon + C_p2g_ccs; ops = sdpsettings('solver', 'gurobi', 'verbose', 2); sol = optimize(C, objective, ops); if sol.problem == 0 P_gt_opt = value(P_gt); alpha_opt = value(alpha); C_carbon_opt = value(C_carbon); else disp('求解失败,检查约束或参数'); end

结果可视化通常要画三张图:第一张是各电源出力与负荷的堆叠曲线,第二张是储氢量、掺氢比和电解槽功率的时序曲线,第三张是碳排放量与碳交易成本的累计曲线。用Matlab的stairs或plot就能画得比较专业。

我再强调一点:写代码前先把单位统一成同一套体系。我的习惯是功率都用MW、能量都用MWh、气体都用Nm³、热值都用kWh/Nm³,这样公式里没有莫名其妙的10³系数,排查约束错误时非常省心。

7. 做这类模型最容易翻车的几个细节

7.1 单位换算:Nm³、MWh、MJ的连环坑

这是最不起眼但杀伤力最大的问题。天然气的低热值如果按MJ/Nm³写(35.9),氢气按kWh/Nm³写(约3),两者直接相加就会导致热值偏大或偏小。我的建议是全部统一成kWh/Nm³:天然气约9.97 kWh/Nm³,氢气约3 kWh/Nm³。在Matlab里把所有单位系数定义成带明确注释的参数,比如:

LHV_ch4_kWh_per_Nm3 = 35.9 / 3.6; % MJ 转 kWh LHV_h2_kWh_per_Nm3 = 10.8 / 3.6;

这样公式里只出现热值和流量相乘,单位自然闭合,调试时也能快速发现量级问题。

7.2 碳捕集能耗修正机组净出力的正确姿势

CCS的能耗到底是算在“燃气轮机机组”里还是算在“VPP内部负荷”里,会直接影响功率平衡和各设备利用率。如果算在机组净出力里,相当于燃气轮机发出的电先喂给CCS一部分,剩下的才进系统;如果算在负荷侧,则是燃气轮机发多少电不变,系统总负荷变大。两种写法在结果上可能差异不大,但代码里的表达和参数标定完全不同。

我的做法是统一算在系统负荷侧,因为这样更直观:P_ccs = e_ccs × E_capture,单位是MWh,直接加到功率平衡方程的右侧。这样不会影响P_gt的数值,后续做灵敏度分析时也更容易解释。

7.3 参数的敏感性分析与求解调试经验

这类模型的结论是否可靠,很大程度上取决于几个关键参数的设定:阶梯碳价区间宽度、掺氢比上限、电解槽效率、储氢容量。我强烈建议写完主模型后跑参数敏感性分析——把掺氢比上限从0.1、0.2、0.3逐档变化,看总成本和碳排放的变化趋势;再把阶梯边界从50、100、200逐档变化,看碳价机制对调度结果的影响。这些都是论文里最讨喜的图表,也是你验证模型行为是否符合直觉的手段。

求解器报不可行时,不要急着改参数。先把约束分成几组逐段放开:只留功率平衡和机组限制,能解;再加上氢约束,能解;再加碳交易分段约束,这时不可行了,问题就锁定在碳交易那块。这个排查链路我几乎每次都要走一遍,比对着警告信息猜快得多。另外可以给目标函数里的变量加个小范围的初始值辅助,比如把P_gt初始化为零向量,Yalmip在调试期会友好很多。

做完整套模型后,我的体会是:这类“多技术叠 buff”的调度问题,最忌讳一上来就想把所有耦合关系全部线性忠实刻画。先把阶梯碳价、电解槽、掺氢三个模块分别在简化算例里跑通,验证每个模块的行为都符合实际物理直觉,再合并成完整VPP模型,调试成本会直线下降。等整个模型稳定了,再考虑加入风电场景抽样、预测误差鲁棒约束、或者是把甲烷化单元的动态响应写进去做更高精度的分析,每一步扩展都建立在前面已验证的代码基础上,心里才有底。

返回列表