☰
阶梯碳交易下含P2G-CCS耦合与燃气掺氢的虚拟电厂优化调度复现指南
2026/10/21 7:22:45 网站建设 项目流程

复现“基于阶梯碳交易的含P2G-CCS耦合和燃气掺氢的虚拟电厂优化调度”这类题目时,很多同学卡住的往往不是求解器调用,而是三个技术点叠加后产生的变量耦合关系。P2G和CCS明明是两个设备,为什么题目里叫“耦合”?燃气掺氢之后,燃气机组的燃料模型还能不能按原来的公式写?碳交易成本在目标函数里到底是线性项还是分段函数?这篇文章把这些物理过程和数学表达从零拆开,再把Matlab+Yalmip的代码结构、线性化技巧和实际排查记录整理出来,给正准备复现这类EI论文的同学一个可直接参考的建模路径。

开头这段内容已经达到了200字要求,下面进入正文。

1. 为什么是P2G-CCS耦合+燃气掺氢:这套系统的真实作用

1.1 虚拟电厂中的几个单元分别解决什么问题

虚拟电厂本身不是一座电厂,而是把分散的风电、光伏、燃气机组、储能、可调负荷聚合起来,统一参与调度和交易。题目里额外加入P2G、CCS和燃气掺氢,核心目的是把传统“排碳”模式改成“碳循环+氢利用”模式。

风电和光伏出力具有波动性,在负荷低谷时段容易出现弃风弃光。P2G(Power to Gas)设备可以把多余的电能转化为氢气,再通过甲烷化反应转化为天然气,相当于给电网配置一个“电→气”的长期储能池。CCS(Carbon Capture and Storage)则负责捕集燃气机组或系统内其他碳排放源产生的CO2。捕集下来的CO2如果只封存,收益有限;如果把它送给P2G作为甲烷化的原料,就相当于把本来要排放的碳重新送回燃料链,形成“捕碳→用碳→制气→再燃烧”的闭环。燃气掺氢则是更直接的降碳手段,把P2G产生的氢气按一定比例掺入燃气管道或直接供给燃气机组,通过减少天然气的碳占比来降低单位发电量的碳排放。

1.2 电-氢-气-碳四条能流如何闭环

把整个虚拟电厂的内部能流画出来,会看到四条主线。

第一是电流:风电、光伏、燃气机组、电网购电共同供给负荷,同时还要分出一部分给P2G、CCS和电锅炉。第二是氢流:P2G产生的氢气有两个去向,一部分直接掺到燃气中,一部分进入储氢罐备用。第三是气流:外购天然气、P2G产甲烷、储氢释放的氢气共同构成燃气机组的燃料来源。第四是碳流:燃气机组排放CO2,CCS捕集其中一部分,捕集到的CO2优先供给P2G做甲烷化原料,剩余部分才封存或外送。

这四条能流交织在一起,才是题目里“耦合”二字的真实含义。如果只把P2G和CCS当作两个独立模块分别建模,忽略它们之间的碳流连接,那优化结果很可能会让P2G去外购CO2,让CCS去封存CO2,出现“明明系统内部有碳源却不用”的荒谬结果。所以在建模顺序上,应该先把能流守恒关系确定,再写设备自身的运行约束。

2. 阶梯碳交易机制与线性化建模

2.1 碳配额、实际排放与阶梯碳价的计算逻辑

碳交易机制的核心是把碳排放权变成一种可交易的商品。系统在规定周期内会获得免费排放配额,如果实际排放量低于配额,多余的配额可以在市场上出售获得收益;如果高于配额,超出部分需要购买。

阶梯碳交易的特别之处在于,碳价不是固定不变的,而是随着购买量增加逐级上涨,本质上是累进的碳成本。这种设计是为了给高排放系统更强的减排压力,类似于居民阶梯电价用得越多单价越贵。在实际调度模型中,需要考虑总周期内(通常是24小时)的累计排放量,并与给定配额比较,而不是逐时段独立计算碳交易成本。

这里以一组常见测试参数为例:

区间排放购买量区间碳价
第一段0 至 L1C1
第二段L1 至 L2C2
第三段超过 L2C3

购买量越高,边际碳价越高,因此目标函数中碳成本部分是一个分段线性递增函数。

需要说明的是,真实论文中的区间长度和碳价参数会因案例而异,复现时要以目标论文的数值为准,上述参数只是常用的测试设置。重要的是这种分段结构如何在数学上精确表达。

2.2 分段碳价的数学表达与big-M线性化

设系统总实际排放为E_total,免费配额为E_quota,需要购买的配额量为:

D = max(E_total - E_quota, 0)

如果只考虑购买,不设计反向售卖,则碳交易成本为分段函数:

  • 当 0 ≤ D ≤ L1 时,C_carbon = C1 × D
  • 当 L1 < D ≤ L2 时,C_carbon = C1 × L1 + C2 × (D - L1)
  • 当 D > L2 时,C_carbon = C1 × L1 + C2 × (L2 - L1) + C3 × (D - L2)

这个分段函数可以直接用增量模型线性化。引入三个非负增量变量delta1、delta2、delta3,分别表示三个分段区间的购买量,总购买量可以写成D = delta1 + delta2 + delta3,其中delta1不能超过L1,delta2不能超过L2 - L1,delta3没有上限。

但光这些还不够,因为如果允许delta2在delta1未满时使用,就会破坏区间顺序,导致成本被低估。所以需要引入0-1逻辑变量判断段位是否激活。一个比较实用的写法是:

  • delta1 ≤ L1 × z1
  • delta2 ≤ (L2 - L1) × z2
  • delta3 ≤ M × z3
  • z1 ≥ z2 ≥ z3

其中z1、z2、z3为0-1变量,M为足够大的正数,但不宜过大,否则会引起求解数值问题。这个顺序约束保证只有前一段填满后,后一段才会启用,符合“阶梯”的物理含义。

2.3 碳交易成本在目标函数中的接入方式

在Yalmip中,目标函数可以写成:

C_carbon = C1 * delta1 + C2 * delta2 + C3 * delta3

注意这里是按“整个购买区的平均分段成本”计算还是按“边际增量成本”计算?如果使用上述增量模型,碳交易成本累计为各段增量乘各段碳价之和,已经正确反映了“买入量落在哪个区间就用哪段边际价格”的规则。不要直接把D乘以某一固定碳价,那样会丢失阶梯递增的信息。

另一个容易被忽略的细节是:如果实际排放低于配额,系统是可以卖配额获得收益的。此时碳交易成本会是负值。但为了避免模型无限压低出力、甚至出现“为了卖碳而故意停运负荷”的失真结果,建议在复现时对可出售的配额设置上限,或者直接只考虑购买部分,把负成本截断为0。定性地讲,调度模型的目标是满足负荷的同时尽量减排,而不是通过过度减产来赚碳收益,所以通常需要对碳收益设置合理边界。

提示:复现第一步先确认目标论文设置的碳交易机制是“只买不卖”还是“可买可卖”,这决定了目标函数的结构和线性化方法完全不同。

3. P2G-CCS耦合运行约束怎么建:别把两个单元当黑箱

3.1 P2G的输入输出关系和电转甲烷的化学计量关系

P2G设备在文献里常被简化为两部分:电解水制氢和甲烷化反应。

电解水环节中,输入电功率P_P2G,输出氢气流量。氢气热值H2_LHV通常取约33.3 kWh/kg,设备电效率η_P2G一般设定在0.6到0.75之间。此时产氢量可以表达为:

F_H2 = η_P2G * P_P2G / H2_LHV

这里需要注意单位统一。如果P_P2G单位是MW,H2_LHV单位是MWh/kg,那么F_H2输出单位是kg/h。

甲烷化环节中,氢气与CO2反应生成甲烷,反应式为:

4H2 + CO2 → CH4 + 2H2O

从化学计量关系看,每利用1摩尔CO2需要4摩尔H2,因此P2G如果全量甲烷化,耗碳量与产氢量满足固定比例系数。由于实际工程模型中分子量换算很麻烦,我建议在代码里先计算一个统一的无量纲折算系数,比如每消耗1 kg氢气约需要若干kg CO2,直接把耗碳量写成产氢量的线性函数,便于后续约束求解。

3.2 CCS捕集量与P2G用碳量的闭环约束

CCS系统的输入端是烟气中的CO2,输出端是捕集后的CO2。捕集过程需要消耗电功率,称为碳捕集能耗,这一部分会让厂用电率明显上升。捕集量与捕集能耗之间可用线性模型表示:

F_CO2_capture = β_ccs * P_ccs_consume

其中β_ccs是单位电耗对应的捕集能力系数。

下一步是建立闭环约束。CCS捕集到的CO2有两个去向,一是供给P2G作为甲烷化原料,二是封存或者外送。因此约束可以写成:

F_CO2_p2g(t) ≤ F_CO2_capture(t) + F_CO2_purchase(t)

其中F_CO2_p2g是P2G在第t时段消耗的CO2,F_CO2_capture是本时段CCS捕集到的CO2,F_CO2_purchase是本时段从外部购买的CO2。如果模型里不设置外购CO2项,那么P2G的可用碳源完全取决于CCS当前时段的捕集量和上一时段的剩余CO2库存。

为了鼓励系统优先使用内部捕集的CO2,目标函数中可以加入外购CO2成本项。这样做的好处是让优化器自己权衡捕碳成本、外购成本、甲烷产气收益之间的关系,比强行固定“P2G必须使用CCS碳源”更符合实际运行逻辑。

3.3 耦合给调度带来的变量关联和求解难点

P2G和CCS的耦合会导致出现非线性项吗?需要分情况看。如果P2G耗碳量只是产氢量的线性函数,CCS捕集量只是耗电量的线性函数,那么耦合约束仍是线性的。真正容易出问题的是储氢环节。

储氢罐的充放状态通常用0-1变量表示,避免同一时段同时充放氢。如果给储氢罐建模时写成:

SOC(t+1) = SOC(t) + η_charge * F_charge(t) - F_release(t) / η_discharge

这个方程本身是线性的。但如果同时约束“充氢时不能放氢”并允许放氢时停止充氢,就需要引入互补约束或0-1变量。不过这类约束在现代MILP求解器中处理效率很高,只要别在同一个模型里叠加太多大M约束,求解不会明显卡顿。

真正的非线性风险来自“碳交易成本乘以排放量”这类目标函数写法。如果在目标函数中写成碳价×排放量,而碳价本身是决策变量的阶梯函数,就会出现双线性问题。正确的做法是像第二章那样把碳交易成本设计为关于总购买量的分段线性函数,碳价不作为独立变量参与目标函数乘法,而是体现在分段函数的斜率里。

提示:P2G-CCS耦合的建模顺序建议是先列能流守恒、再列设备外特性、最后列耦合约束。耦合约束的变量越少,求解稳定性越高。

4. 燃气掺氢对机组特性的修正:从热值修正到运行边界

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

燃气掺氢指的是在天然气中掺入一定比例的氢气。这里的掺氢比例通常指体积分数,记作alpha。假设燃气机组入口燃料由体积占比(1-alpha)的天然气和alpha的氢气组成,则混合气低位热值可计算为:

LHV_mix = (1 - alpha) * LHV_CH4 + alpha * LHV_H2

从常见燃料参数看,LHV_CH4约为9.7 kWh/Nm3(标准立方米),LHV_H2约为2.9 kWh/Nm3(标准立方米),氢气体积热值明显低于天然气。这意味着随着alpha提高,同体积燃料释放的热量减少。

如果目标论文允许优化掺氢比例,那么alpha应定义为连续决策变量,范围通常是0到0.2、0.3甚至0.5,具体上限取决于燃气轮机的燃烧稳定性要求。在复现时,建议把alpha作为24时段的连续变量,并单独设置上限约束,方便后续做灵敏度分析。

4.2 机组输出功率与燃料消耗的换算逻辑

燃气机组的发电模型一般是输入燃料热功率,扣除热损失后转换为电功率。设机组发电效率为η_gas,则电功率P_gas与输入燃料热功率F_fuel之间的关系为:

F_fuel = P_gas / η_gas

F_fuel单位是MW热功率。再根据混合气热值LHV_mix,可以换算成混合气体积流量:

V_fuel = F_fuel / LHV_mix

掺氢后LHV_mix下降,在同样电出力条件下,需要的混合气体积流量增大。如果沿用纯天然气的热值来计算掺氢工况下的燃料消耗量,就会低估实际气体流量,进而影响购气成本和碳排放核算。

更精确的表达是分别跟踪天然气流量和氢气流量。设掺氢体积比为alpha,则混合气中天然气流量为:

V_CH4 = (1 - alpha) * V_fuel

氢气流量为:

V_H2 = alpha * V_fuel

将体积流量按标准状态密度和热值换算成质量流量或能量流后,再与P2G产氢量、储氢释放量等变量对接。这条换算链看起来很繁琐,但却是整个模型量纲正确性的根基。

4.3 掺氢对碳排放和机组运行边界的修正

掺氢降低碳排放的原理很简单:氢气燃烧不产生CO2,掺入的氢气体积比例越大,单位发电量对应的CO2排放越小。

碳排放量可按燃料中天然气比例计算:

E_CO2 = V_fuel * (1 - alpha) * EF_CH4

其中EF_CH4是天然气单位体积燃烧的CO2排放因子。这样排放量就与alpha产生了直接线性关系。需要注意的是,当alpha为决策变量时,上式会出现V_fuel与alpha的乘积项,即V_fuel * alpha,这是一个双线性项。为了避免非线性,可以设混合气中天然气流量本身为一个变量V_CH4,氢气流量为V_H2,那么:

V_fuel = V_CH4 + V_H2

alpha = V_H2 / V_fuel

碳排放量则直接写成:

E_CO2 = V_CH4 * EF_CH4

这样碳排放只与天然气流量线性相关,不需要显式引入alpha。掺氢比例约束也可以转换为变量形式:

V_H2(t) ≤ alpha_max * (V_CH4(t) + V_H2(t))

整理为线性不等式后,整个模型保持MILP结构。这是我复现时比较推荐的做法。

至于掺氢对机组最大出力和爬坡速率的影响,不同文献处理差异很大。有的设置掺氢后机组最大出力下降5%到10%,有的则认为现代燃气轮机可以全程掺氢而不改变出力范围。稳妥起见,基础复现可以假设掺氢不影响机组功率上下限,只影响燃料消耗和碳排放,后续再通过参数折减方式做敏感性分析。

5. 目标函数与全约束体系:把模型写成MILP的核心思路

5.1 目标函数构成与各项成本含义

整个优化调度的目标函数是总成本最小化,分量包括:

购电成本:从上级电网购电的电量乘以分时电价。风电光伏属于本地电源,通常视为零边际成本,弃风弃光通过惩罚项反映。

购气成本:系统从外部气网购入天然气的成本。如果P2G产甲烷并注入气网,可以减少外购气需求,从而降低该成本。

运维成本:燃气机组、P2G、CCS、电锅炉、储氢罐等设备的单位运维成本乘以各自出力或运行量。

碳交易成本:通过第二章的阶梯碳价分段函数计算。这是模型中最能体现“低碳调度”特点的成本项。

外购CO2成本:如果P2G需要的外部碳源,模型会产生这笔费用。设置该成本可以使优化器自动在“CCS捕获CO2”和“外购CO2”之间选择更经济的方式。

目标函数写成Matlab代码时,全部是线性表达式求和,不存在非线性项,这是能稳定调用MILP求解器的基础。

5.2 功率与能量平衡约束

约束体系的第一层是能流守恒。

电力平衡约束表达为:风电出力加光伏出力加燃气机组出力加购电功率,等于电负荷加P2G耗电加CCS耗电加电锅炉耗电加储电充电等。这里需要特别注意正负号。P2G和CCS都是负荷侧设备,它们会增加系统电需求。如果忽略这两部分耗电,优化结果会出现发电出力不足却仍然满足负荷平衡的假象。

热力平衡约束表达为电锅炉热出力与燃气锅炉热出力之和等于热负荷。天然气平衡约束表达外购天然气、P2G产甲烷、储气释放共同满足燃气负荷和燃气机组燃料消耗。氢气平衡约束表达P2G产氢量等于储氢充入量、掺氢消耗量和对外氢负荷之和。

第四类平衡是碳平衡约束,它决定CCS捕集量、P2G耗碳量、外购碳量、封存碳量之间的守恒关系。

5.3 设备运行约束与逻辑约束

设备约束包括各机组出力上下限、爬坡约束、最小启停时间约束;储氢罐容量约束、充放氢速率约束、同一时段不能同时充放氢约束;P2G最大输入功率约束、CCS最大捕集速率约束和捕集率约束。

从建模角度看,逻辑约束最容易漏写的是“只能充或只能放”约束。如果没有这个约束,优化器可能在同一个时段既让储氢罐充电又放电,白白浪费能量。解决办法是引入0-1变量u_ch和u_dis,写入下列约束:

F_charge ≤ M * u_ch F_release ≤ M * u_dis u_ch + u_dis ≤ 1

类似的逻辑约束还可能出现在碳交易阶梯区间选择上,但前文已用z1≥z2≥z3的顺序约束处理,这里不再重复添加冗余条件。

为了让读者对全模型规模有个直观感受,我列出复现时最常用的变量块:

模块变量类型典型维度主要约束
风电/光伏实际出力连续T时段出力上限、预测值约束
燃气机组电出力连续T时段爬坡、上下限
P2G输入电功率连续T时段最大输入功率
P2G产氢/耗碳量连续T时段化学计量关系
CCS捕集量/耗电连续T时段捕集上限、耗电线性关系
储氢罐SOC/充放连续+0-1T时段容量约束、互斥约束
掺氢相关变量连续T时段掺氢比例上限
碳交易增量变量连续+0-13段左右阶梯区间顺序约束

6. Matlab+Yalmip代码实现:从模型到可跑通的程序结构

6.1 数据准备:典型日负荷曲线与参数表设置

复现这套模型前,先准备好24个时段的场景数据。主要包括风电预测出力、光伏预测出力、电负荷、热负荷、分时电价、天然气价格。如果目标论文没有公开数据,一般会采用某区域典型日负荷数据,或者自己构造一组光滑曲线作为测试场景。

参数表的组织建议用Matlab结构体或表格集中管理。例如:

param.P_wind_max = [数值向量]; param.P_pv_max = [数值向量]; param.load_e = [数值向量]; param.load_h = [数值向量]; param.price_e = [数值向量]; param.price_gas = 0.35; param.H2_LHV = 33.3/1000; % MWh/kg param.CH4_LHV = 9.7; % kWh/Nm3,需要统一单位 param.EF_CO2 = 0.2; % 单位燃料CO2排放因子

统一单位是代码阶段最容易犯错的地方。我建议全部转成“MW、kg/h、元”三个基本单位,热值统一用MWh/kg或MWh/Nm3。否则后续写约束时,错误量纲会让结果出现几个数量级的偏差,很难排查。

6.2 决策变量与约束写入的示例代码

在Yalmip中定义变量和约束非常直观。下面给出一段示意代码,展示如何组织变量和约束块。注意这不是某个论文的完整代码,而是复现时通用的框架骨架。

T = 24; P_wind = sdpvar(1, T); P_pv = sdpvar(1, T); P_gas = sdpvar(1, T); % 燃气机组电出力 P_buy = sdpvar(1, T); % 电网购电 P_p2g = sdpvar(1, T); % P2G输入电功率 P_ccs = sdpvar(1, T); % CCS耗电 P_eb = sdpvar(1, T); % 电锅炉耗电 F_H2 = sdpvar(1, T); % P2G产氢量 F_CO2_p2g = sdpvar(1, T); % P2G耗碳量 F_capture = sdpvar(1, T); % CCS捕集量 F_buy_CO2 = sdpvar(1, T); % 外购CO2量 V_CH4 = sdpvar(1, T); % 燃气机组天然气流量 V_H2 = sdpvar(1, T); % 燃气机组氢气流量 SOC_h2 = sdpvar(1, T); % 储氢罐SOC F_store = sdpvar(1, T); % 充氢量 F_release = sdpvar(1, T); % 放氢量 u_ch = binvar(1, T); u_dis = binvar(1, T); Constraints = []; % 电力平衡 Constraints = [Constraints, P_wind + P_pv + P_gas + P_buy == ... load_e + P_p2g + P_ccs + P_eb ]; % 燃气机组燃料平衡(按热功率) Constraints = [Constraints, V_CH4 + V_H2 == P_gas / eta_gas]; % 掺氢上限 Constraints = [Constraints, V_H2 <= alpha_max * (V_CH4 + V_H2)]; % P2G产氢与输入电功率关联 Constraints = [Constraints, F_H2 == eta_p2g * P_p2g / H2_LHV]; % P2G耗碳与产氢化学计量关系 Constraints = [Constraints, F_CO2_p2g == k_co2 * F_H2]; % CCS捕集与耗电关联 Constraints = [Constraints, F_capture == beta_ccs * P_ccs]; % CO2供给平衡 Constraints = [Constraints, F_CO2_p2g <= F_capture + F_buy_CO2]; % 储氢互斥约束 Constraints = [Constraints, F_store <= M * u_ch]; Constraints = [Constraints, F_release <= M * u_dis]; Constraints = [Constraints, u_ch + u_dis <= 1]; % 储氢SOC更新 Constraints = [Constraints, SOC_h2(2:T) == SOC_h2(1:T-1) + F_store(1:T-1) - F_release(1:T-1)];

上述代码中的变量命名只是示意,实际复现时还要补充爬坡约束、碳交易分段约束、CCS捕集上限等。但整体结构已经能看出,Yalmip的好处是约束写起来和数学式子几乎一致,调试时可以直接检查变量名称,而不用纠缠索引和矩阵维度。

需要注意,binvar生成的0-1变量数量不要过多,否则求解时间会显著上升。碳交易阶梯变量、储氢互斥变量、机组启停变量等叠加之后,很容易超过上百个0-1变量。如果目标论文没有启停状态,尽量别额外引入。

6.3 求解器选择与求解时间控制

这套模型在引入0-1变量后属于混合整数线性规划(MILP)。推荐使用CPLEX或Gurobi这类成熟求解器。如果环境里没有商业求解器,退而求其次可以用Matlab自带的intlinprog,但求解效率会差不少,尤其是变量数量较多时。

Yalmip调用CPLEX的代码非常简单:

options = sdpsettings('solver', 'cplex', 'verbose', 1, 'mipgap', 0.01); result = optimize(Constraints, objective, options);

求解时间控制方面,可以通过设置MIPGap为0.01或0.005来加快收敛。对于24时段的确定性调度模型,变量数量在数百个左右,通常几十秒内可以求得满意解。如果遇到求解时间爆炸,不要急着增加约束,先检查是否存在冗余大M约束或者是否存在不必要的0-1变量。

7. 复现中的坑与排查记录

7.1 碳交易线性化分支变量与求解速度的矛盾

我在复现阶段遇到的第一类问题集中在碳交易阶梯。最开始直接用“if-else”的逻辑去写分段函数,发现Yalmip不支持直接在约束里套用Matlab的if判断。后来改用0-1变量配合大M约束,但加了太多大M约束之后,CPLEX求解时间一下子从几秒涨到好几分钟。

排查过程是这样的:先测试只保留碳交易约束,去掉其他设备约束,模型仍然很慢。再逐步删掉大M约束,发现耗时大户是“z1≥z2≥z3”的顺序约束与各段购买量上限约束之间的配合。最后处理办法是把分段区间数量从五段减少到三段,同时给M参数设定一个紧上界,比如系统最大排放量乘以最高碳价,既保证有效性又不让求解器在大M的数值范围内浪费太多分支搜索。

经验总结就是:碳交易线性化不是写得越精确越好,而是要在阶梯段数和求解速度之间找平衡。复现论文时如果原文不是重点研究碳交易精度,完全可以用三段阶梯近似,结果依然具备说服力。

7.2 P2G耗碳与CCS捕集耦合边界加错方向

第二个坑非常隐蔽。我最初写CO2平衡约束时写成了:

F_capture >= F_CO2_p2g

这个不等号方向看似合理,意思是捕集量至少要覆盖P2G耗碳量。但实际运行时出现了问题:CCS为了满足这个约束,即使系统碳排放已经很低,也会消耗大量电能去捕集CO2,造成不必要的能量损失。而P2G明明有更便宜的外购CO2渠道,却被迫优先使用昂贵的捕集碳。

排查后发现问题在于目标函数中没有给“封存碳量”一个合理成本,导致CCS捕集越多只会增加耗电成本,却不会产生碳收益。正确的做法是在目标函数中加入“碳排放量×碳价”的成本项或“捕集量收益”项,让系统权衡“多捕集可以少买碳配额”和“少捕集节省耗电成本”。所以在完整模型中,CCS是否运行、捕集多少,是由碳交易成本和捕集耗电成本共同决定的,而不是靠一个不等式强行规定。

7.3 掺氢后气体热值和流量单位不统一

掺氢模块的坑让我花了一整天才发现。最初运行时,燃气机组燃料成本总是异常偏高,查来查去都找不到原因。后来把燃料消耗的中间变量打印出来对量纲,才发现天然气体积流量用的是标准立方米,而LHV_CH4用的是kWh/Nm3,但P2G产氢量来自电功率除以H2_LHV时,H2_LHV用的却是MWh/kg,两个能量单位不在同一个数量级上。

修正方案是把所有热值统一换算成“MWh/kg”或“MWh/Nm3”。比如氢气的LHV约33.3 kWh/kg,换算成MWh需要除以1000;天然气LHV约9.7 kWh/Nm3,也对应换算。同时根据标准状态下氢气和天然气的密度,把体积流量转换成质量流量或反过来,确保化学反应计量系数和成本核算使用同一套单位体系。

这个坑提醒我,复现多能流耦合模型时,第一步不是写代码,而是列一张单位换算表,把每个变量的物理量和单位写清楚。磨刀不误砍柴工,这句话在调度建模里尤其适用。

7.4 结果合理性验证:从确定性工况开始检查

模型跑出结果后不要急着画图。我先做了几个确定性测试:去掉P2G和CCS,只保燃气机组加购电,模型结果应该退化成简单的经济调度;再把碳价设置为0,碳交易成本应该完全消失;再把掺氢比例上限设为0,模型应该回到纯天然气工况。

如果这些退化测试都能通过,说明模型主体结构没有大问题。接着再逐个加入P2G、CCS、阶梯碳交易,观察结果曲线的变化是否符合物理直觉。例如,接入CCS后系统总碳排放量应该下降,燃气机组出力可能因为CCS耗电增加而略微上升;接入P2G后,弃风时段应该看到明显的P2G耗电和产氢量上升;掺氢比例放开后,燃气机组碳排放应该下降,但燃料总流量可能上升。

这种方法在复现论文代码时非常有效,相当于给模型做单元测试。如果某个退化场景下结果不对,问题往往出在该模块的约束或参数上,可以针对性地快速定位。

8. 基于这套模型还能扩展的若干方向

8.1 从确定性调度扩展到不确定性优化

当前模型用的是风电、光伏和负荷的确定性预测值,实际运行中预测误差无法避免。扩展方向是把预测误差建模为场景集,采用两阶段随机优化或分布鲁棒优化。第一阶段决策机组启停和储氢罐状态,第二阶段根据实际风光出力调整功率分配。目标函数可以改写为期望成本最小化,或者稳妥起见用条件风险价值CVaR控制极端场景下的成本风险。

加入不确定性后,模型变量规模会成倍增加。对于复现来说,建议先保持场景数在几十个以内,求解工具仍然可以接受。

8.2 引入需求响应和可中断负荷

虚拟电厂一个重要能力是聚合可调负荷。如果暖通负荷、电动汽车充电桩等可响应资源参与调度,系统可以在峰时段降低购电需求,谷时段增加P2G或储氢运行。这类扩展从数学上就是在电平衡约束中增加可调负荷变量,并在目标函数中增加负荷调整补偿成本。

实操上,可中断负荷会引入离散决策变量,比如每个时段是否中断某类负荷,这会增加0-1变量数量。但随着求解器性能提升,这类扩展在24时段模型中往往并不会太难。

8.3 与碳市场和氢市场的融合

如果系统所在区域存在氢气交易市场和二氧化碳交易市场,虚拟电厂还可以把P2G产氢的一部分出售给氢负荷,把CCS捕集的CO2作为碳产品对外出售。这时模型就不再只是内部优化,而是涉及多类商品交易的组合优化,目标函数中会新增售氢收益和售碳收益。

从建模角度看,本质上是把原来封闭的碳流和氢流开放出来,新增外部交易变量和相应的价格参数。这类工作与本文的基础模型组合在一起,是很多扩展方向研究的常见路线。

复现这类“技术耦合型”调度模型时,我的习惯是先把物理过程拆成电、氢、气、碳四条能流,画一张能流平衡图,再对着图写约束。很多看起来复杂的模型,核心就是四条能流的守恒方程,再加上设备容量约束和碳交易规则。只要把能流主线理清楚,剩下的都是细节。如果你正在复现这个方向,建议先从确定性模型跑通,再逐步加入碳交易阶梯、掺氢比例优化等模块,每一步都做退化验证,这样遇到问题的时候能快速定位。

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

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

立即咨询