阶梯式碳交易与电制氢在综合能源系统优化调度中的应用
“以热定电”这四个字我是在前年做某园区综合能源年度规划时才对它有了带痛感的理解。热负荷上去了热电联产机组就得跟着扛电出力扛到这个冬天最冷的那天机组几乎是被热负荷“绑架”着满发。当时我们想用碳交易成本去约束排放可加入的是一个固定碳价结果模型只肯小幅下调出力、把缺口扔给燃气锅炉整个系统的实际碳排放反而更难看了。后来把阶梯式碳交易机制和电制氢同时放进优化模型结果才真正对路。这篇文章把整套方案从机制原理到数学模型、从求解技巧到算例结果完整过一遍最后再聊几个我实际踩过的坑做综合能源系统调度、碳约束优化、氢储能并网相关课题或项目的朋友可以直接拿来当参照。1. 单一碳价压不住热电联产阶梯碳价为什么才是正确思路1.1 热电联产独特的“热-电绑定”让碳约束变得棘手普通发电机组面对碳价时可以简单“少发电”反正电力的缺口可以由电网、储能或者其他电源补上。但热电联产机组不行。热负荷由它承担要降低电出力又不能停掉供热于是它的工作点被限制在一个和热出力强相关的可行域内。冬季热负荷越高机组的电出力下限就被抬得越高排放几乎是个随热负荷被动走高的量。在这种结构里单一碳价和碳排放是线性关系排1吨碳贵一个固定价格。优化模型会非常诚实地把这个成本“摊平”——它宁可让机组维持高排放、然后从别处微调几块钱的成本也不愿意做出剧烈改变因为任何剧烈改变都可能威胁到供热可靠性。线性成本本质上不会给模型一个“再想一想有没有别的技术路线”的强信号。这里我要多说一句。固定碳价也不是完全无效它只是对热电联产这类强耦合设备的边际约束很弱。真正有效的是让碳价本身“越来越贵”你排得越多每多排一吨的边际惩罚就越重。1.2 阶梯式碳交易的运行逻辑像阶梯水价一样分段涨价阶梯式碳交易的核心思路是给碳排放量设定多个区间每个区间对应一个递增的边际碳价。用一个园区典型日的参数举例排放区间吨相对配额碳价元/吨0~2000配额内02000~4000804000~60001206000以上180配额内的排放不用花钱这在机制上相当于给企业一个免费排放额度一旦超出配额超出部分的碳价逐段抬高。这里要注意超额累进和全额累进的区别超额累进只对“各自区间内的超出量”按该档价格计价这是行业里更常见的做法也是模型线性化时最方便的一种结构。为什么采用阶梯式而不是直接给一个高碳价因为两者虽然都能“增加减排压力”但信号形状完全不同。固定高碳价对每一吨排放同等施加压力相当于对所有人拔高门槛阶梯碳价则只对那些排得多、且优化后仍排得多的方案下重手反而给了系统内灵活性资源一个清晰的回报预期如果我通过氢储能或储热把峰值排放压下来省下的碳费按最高档价格算那么收益非常大。1.3 非线性碳价会改变模型选型的结果把这种分段递增价格放进优化问题后目标函数里碳成本不再是关于排放量的直线而是折线。这类非线性的关键意义在于系统可能因为“越过某个档位边界”而整体切换运行策略。举个例子在我跑过的算例中固定碳价80元/吨时模型给出的最优解是让一台热电联产机组满发因为它的发电成本低即便加上碳成本还是比燃气锅炉划算但换成阶梯碳价后系统总排放在档位边界附近时继续满发会让一部分排放量落到120元/吨甚至更高价格区间此时模型会主动降低该机组出力同时启动电解槽把多余的电转成氢用它来支撑晚高峰的供电和供热。一个不起眼的档位边界直接改变了机组台数和氢系统的运行计划。这也是我把标题里的“阶梯式”看得比“碳交易”更重要的原因。阶梯式碳交易本质上制造了一个“区间压力场”它比单点价格更能逼出综合能源系统里那些跨时段、跨能源品种的协同能力。2. 电制氢在综合能源系统里的“三重身份”2.1 第一重身份柔性负荷——专治弃风弃光综合能源系统通常配有一定比例的风电和光伏而且大多在配电网或园区微网场景里。这类场景最大的痛点不是发电能力不足而是净负荷波动大中午光伏大发时热电机组因为热负荷不能停工电又没地方去只能弃掉。电解槽在这里的第一身份是大功率柔性负荷。它功率调节范围宽20%~100%分钟级响应快可以在风光出力高峰时加大制氢功率把多余的电力变成氢。这一行为放在调度模型中就是给电平衡方程增加一个“可调负电荷载”并且这个负荷可以被安排在最需要消纳可再生能源的时段。从成本结构看电解槽的耗电成本主要是电价和碳价。风光大发时段电价通常低同时这部分电力对应的碳排放因子也低所以在碳约束下用弃电制氢是一笔非常划算的“碳套利”便宜的电、干净的氢。2.2 第二重身份能量搬移——储氢罐的跨时段能力氢一旦被制出来就可以存进储氢罐。这个罐子让电制氢系统拥有了“能量时间的搬移能力”白天多发的光伏、半夜多发的风电都可以先变成氢等到晚高峰或热负荷尖峰时再用。这和抽水蓄能、电化学储能的思路相似但有两个显著差异。第一氢的能量密度高大规模、长时间储能的成本更有优势适合跨日甚至跨周搬移第二氢的终端应用更灵活既可以重新发电也可以作为工业原料、交通燃料或者直接掺烧供热这意味着它不必受制于“再变回电能”的效率损失。在热电优化模型中储氢罐的建模非常友好它只需要一个储氢量的状态变量每小时满足连续性约束即当前时刻储氢量等于上一时刻储氢量加上制氢量再减去用氢量并且储氢量不能超过上下限即可。相比电池模型它少了复杂的充放电效率和衰减问题反而更容易处理。2.3 第三重身份热电联产源——燃料电池的余热不容小觑很多人对电制氢的理解止步于“把电变成氢”然后忘记氢还能变回电和热。实际上在热电联产系统里燃料电池是电制氢系统中极其关键的一环它消耗储氢罐里的氢来发电同时产生大量可回收余热这部分余热可以直接进入热力管网。算一笔简单的账如果燃料电池的电效率为50%那么它输入的氢能有大约40%~50%会转化为热。在电效率之外回收其中70%的余热燃料电池的综合能量利用率很容易做到80%以上。换句话说燃料电池本质上是一台小型热电联产机组只是它的“燃料”是绿氢。进入优化模型后燃料电池会同时出现在三个平衡方程里电平衡里它是发电设备热平衡里它是热源设备氢平衡里它是氢负荷。一个设备同时影响三条能量流这是综合能源系统“多能互补”最典型的体现。我在帮学生理清模型结构时总说一句话你把燃料电池当成“会发热的发电机”把电解槽当成“会发热的制氢机”很多平衡方程就豁然开朗了。没错电解槽运行时的热损失也可以回收。这个问题我在第6章会专门讲因为它是很多人建模时最容易漏掉的项。3. 模型怎么搭目标函数、约束条件和参数基准3.1 目标函数四块成本怎么累加整个优化模型的目标是系统在一个调度周期典型日24小时内的总运行成本最小化。基于我做的事情目标函数一般包含四块购电成本从上级电网购电的费用按分时电价计算碳交易成本基于阶梯式碳价函数计算的碳费氢系统运行维护成本电解槽、储氢罐、燃料电池的运维费用有些模型里还会折算设备折旧成本弃风弃光惩罚成本让模型优先消纳可再生能源写成文字就是min C C_buy C_carbon C_hydrogen C_penalty不是所有模型都要把四块全部纳入。如果你只关心调度而不涉及容量规划设备造价可以不加如果你关心氢系统的经济性运维成本必须分设备单独列。这里关键是要把“碳成本”这一项的表达式写对它才是整篇的题眼。3.2 热电联产机组的可行运行域怎么线性化热电联产机组的核心约束是电出力和热出力之间的可行域。抽凝式机组的可行域通常是一个凸多边形由若干个线性不等式围成。模型里不能只写“电出力大于等于最小出力”还必须体现“热出力高时电出力下限和上限都会被抬高”这一物理规律。最实用的做法是把可行域写成一组线性不等式P_min α1 * Q ≤ P ≤ P_max - α2 * Q 之类具体系数由机组的特性曲线拟合得到如果机组是多台还要加入启停状态变量保证停机时出力为0启动后出力处于可行域内这个约束一旦写错模型就会给出“机组在低热负荷时仍带很高电出力”这种不合理的解。我自己的习惯是先把单台机组的可行域画出来拿几个极点坐标验证不等式是否吻合再放进模型跑。3.3 电解槽-储氢罐-燃料电池的动态约束怎么写三件套的动态约束是整个氢能链路的骨架。电解槽部分0 ≤ P_P2H(t) ≤ P_P2H_max M_H2(t) η_P2H * P_P2H(t)也就是制氢功率受容量限制产氢速率和耗电功率成正比效率取电解槽的氢基效率LHV基准一般在55%~75%。储氢罐部分S_H2(t1) S_H2(t) M_H2_in(t) - M_H2_out(t) S_H2_min ≤ S_H2(t) ≤ S_H2_max燃料电池部分P_FC(t) η_FC * M_H2_consume(t) Q_FC(t) η_FC_heat * M_H2_consume(t)还要保证同一时刻储氢罐不能同时充氢和放氢这通常用一个0-1变量加大M约束实现充氢时放氢为0放氢时充氢为0。如果你把储氢罐的损耗忽略模型会系统性低估氢气成本所以我建议在连续性方程里加一个小损耗系数比如每时段0.5%~1%。3.4 电/热功率平衡和碳核算边界电功率平衡是节点的所有电源发电量加购电量等于电负荷加电解槽耗电再加网损P_CHP(t) P_FC(t) P_wind(t) P_pv(t) P_buy(t) P_load(t) P_P2H(t)热功率平衡相对容易漏项。热负荷必须由热电联产热出力、燃料电池回收热、电解槽回收热、燃气锅炉补燃共同满足Q_CHP(t) Q_FC(t) Q_P2H_recover(t) Q_boiler(t) Q_load(t)特别强调电解槽回收热这一项。电解槽的效率不是100%电功率中大约20%~30%会变成热。这部分热如果直接散失热平衡里当然可以忽略但只要系统有集中供热管网这部分热就是“免费热源”回收它能让燃气锅炉少烧不少气。建模时给它一个回收系数再乘上电解槽耗电功率即可成本极低、收益明显。碳核算边界上我采用“直接排放间接排放”口径热电联产机组和燃气锅炉的燃料燃烧产生直接排放外购电按电网平均碳排放因子折算间接排放。系统总排放量大于免费配额后进入阶梯碳价计费函数。4. 阶梯碳价函数的分段线性化求解前的关键一步4.1 为什么不能直接写分段函数如果目标函数里直接写“80元/吨适用2000吨120元/吨适用4000吨”这在数学上是一个分段线性函数形式上自然但对求解器不友好。它会在档位边界处引入非凸性很多MILP求解器可能找不到全局最优解或者计算时间猛增。正确做法是把阶梯碳费改写成一个增量成本模型。假定排放量E、各档边界为E0、E1、E2各档边际价格为p0、p1、p2则碳交易成本可以写成C_carbon p0 * ΔE1 p1 * ΔE2 p2 * ΔE3其中ΔE1是第一档超出量ΔE2是第二档超出量等等每一档的取值受边界约束且必须先填满低档才能进入高档。这个结构只要引入少量0-1变量就能保证分段线性函数的凸性求解器可以高效处理。4.2 SOC、启停、充放互斥这些逻辑约束的统一处理模型里除了阶梯碳价还有大量逻辑约束。最常见的三个储氢罐不能同时充放氢、机组启停与出力上下限的关系、燃料电池最小运行时间。这些约束统一靠“0-1变量大M系数”处理。以储氢罐为例M_H2_in(t) ≤ M_in_max * u_in(t) M_H2_out(t) ≤ M_out_max * (1 - u_in(t))u_in(t)为1表示充氢为0表示放氢。大M系数的取值很讲究我建议取“该设备允许的最大功率或流量乘以1.2”不要贪大。大M过大不会改变最优解但会让线性松弛变差明显拖慢求解速度。4.3 求解器选择和规模估算我常用的模型规模大概是24个时段2台热电联产机组、1套电解槽、1个储氢罐、1台燃料电池加上阶梯碳价3个区间大约需要50~80个0-1变量连续变量在2000~3000之间。这个规模对主流的MILP求解器来说都算轻量级几秒到几十秒能给出稳定解。如果你用开源求解器CBC基本能应付SCIP也可以用来验证结果。跑大容量规划问题时往往要扩到8760小时这时就别直接上整年小时级了建议用典型日聚类或者把时间粒度做成15分钟、再配合滚动优化不然求解时间会让人怀疑人生。我一般先跑一个24小时典型日确认逻辑再扩展到更长时间尺度。5. 算例设计、典型日结果和两组灵敏度分析5.1 典型日的构建与基础参数算例我设计的是一个含有2台抽凝式热电联产机组、1套风电、1套光伏、1套电制氢储氢燃料电池系统的园区。典型日曲线模拟冬季某日的负荷变化夜间热负荷高、电负荷低光伏为0风电后半夜大、中午小白天电负荷有两个峰。基础参数如下项目数值热电联产总容量2×100 MW风电场150 MW光伏80 MW电解槽容量100 MW储氢罐容量30 MWh能量当量燃料电池容量50 MW免费碳配额3500 吨/日阶梯碳价区间0~2000/2000~4000/4000对应0/80/120元/吨电网购电分时电价峰时1.2元/kWh、谷时0.4元/kWh上调碳区间的具体数值之前我先用零碳价跑了一遍基线确保系统能够满足所有负荷再逐步加约束。5.2 阶梯碳交易 vs 单一碳价结果对比同一组基础参数下我对比了三种场景场景A是无碳约束场景B是固定碳价80元/吨场景C是阶梯碳价档位设置如上。结果如下场景总碳排放吨/日弃风弃光率总运行成本万元/日无碳约束48609.8%112.6固定碳价80元/吨45207.4%122.4阶梯碳价41853.2%128.1固定碳价只让排放降了约7%弃风率还有7%以上阶梯碳价把排放压低了约14%弃风率几乎降到了原来的三分之一。成本增加是客观的从112.6万涨到128.1万但这中间的差值主要被“少买碳配额”和“多消纳绿电”抵消了一部分。更有意思的是氢系统的利用率阶梯碳价下燃料电池在晚高峰基本满发储氢罐在凌晨和中午光伏大发时充满系统自发地把“低成本绿电→氢→高峰热电”这条链路走起来了。固定碳价下燃料电池出力则小得多系统觉得直接买电加燃气锅炉更省。5.3 电解槽容量的边际效益曲线我做了第二组灵敏度保持其他参数不变把电解槽容量从0逐步加到200 MW看系统总成本和碳排放的变化。结果是一条先陡后平的曲线。从0到80 MW碳排放快速下降并同时拉低弃风率总成本也明显下降超过80 MW之后再加电解槽容量对碳排放和弃风率的影响越来越小总成本在100 MW附近触底后开始反弹。原因不难理解电解槽容量越大可消纳的绿电越多但每个时段的风光出力是有限的储氢罐的容量也是有限的。当“源”和“储”都到瓶颈后再大的电解槽就只能闲置设备折旧和维护成本却一分不少。这个“边际效益拐点”就是容量规划时最应该关注的数字而不是一味追求“氢越装越多越好”。5.4 阶梯区间划分对减排深度的敏感性最后一组灵敏度我把碳价档位边界改窄了50%原来2000吨一档现在变成1000吨一档更高档位对应的碳价维持不变。结果非常直接系统会更早进入高碳价区模型为了防止排到高档位会更激进地使用氢系统碳排放进一步下降但总成本上升的幅度也变大。也就是说阶梯的“陡峭程度”决定了系统减排的力度和成本。碳价曲线整体抬高的效果不如让曲线变陡的效果明显。这组灵敏度对政策制定和园区碳配额设计都有参考意义想让系统多消纳新能源与其把碳价整体抬高不如压缩配额、加密区间让碳价的变化方向更陡。应该说明的是这只是我的算例结论实际场景中还要结合区域电网碳排放因子和氢源成本重新校核。6. 落地过程中最容易踩的五个坑6.1 电解槽余热不计入热平衡结果直接偏掉这是我身边不少人踩过的坑。电解槽的耗电功率有一部分以热量形式损失常见效率70%上下的电解槽意味着30%的输入能量成了热。在纯电力系统里这部分是废热但在热电联产系统里它就是可供应的热源。我第一次跑模型时没有加入电解槽余热回收项结果热负荷全压在燃气锅炉上燃气锅炉出力比预期大了很多总成本也偏高了将近8%。加了一项简单的回收约束后燃料消耗回归正常。所以如果你在园区里装电制氢请务必确认热网能否接上电解槽冷却系统然后在热平衡方程里给它留一个位置。6.2 碳核算边界一直没分清碳排放核算的边界决定了计算结果的可行性。只算本地机组燃烧的排放完全不考虑外购电的间接排放结论必然偏乐观。实际操作中应该把两者拆开直接排放由燃料燃烧产生间接排放由外购电量乘以电网平均碳排放因子得到。然后注意间接排放的碳排放因子在不同省份、不同年份都不一样要用目标年份的区域均值。我之前给某学生改模型时就发现他把购电一律当成零碳电力结果模型让系统大量购电、电解槽全力生产排放数字却奇低。把电网碳排放因子补进去之后最优解立刻发生了明显改变。6.3 量纲换算MW、MWh、吨碳、公斤氢的换算乱麻这个坑看起来低级但非常容易出。功率和能量要区分清楚调度模型里每个时段是一个小时所以功率数值直接等于该时段的能量数值但你要是把时间粒度改成15分钟就得乘0.25。氢的单位更麻烦。常见的有kW对应产氢速率、kg/h表示产量、MWh表示氢能量。它们之间要经过氢的低热值换算约33.33 kWh/kg低热值。把产氢速率和储氢罐容量写成同一单位是起步前就该做好的事。我的习惯是模型内部全部统一为“MW/MWh能量单位”输入输出层再去处理氢的千克数避免公式里反复换算。6.4 模型验证退化测试是我必做的一步每写完一版模型我都会做几个“退化测试”把全部碳价设为0模型应退化为纯经济运行结果应该和没有碳约束时一致把电解槽容量设为0、储氢罐容量设为0模型应退化为传统热电联产加碳交易调度。任何一个测试跑出来对不上说明要么约束漏写了要么某个等式有问题这时别急着加新功能先把逻辑拧清楚。这类测试的价值在于它可以快速定位模型的根本性错误。我在调试过程中多次发现“最优解里储氢罐同时充氢和放氢”这类物理上不可能的方案就是因为互斥约束没写全退化测试一跑就露馅。6.5 求解时间爆炸时别急着换机器当模型规模变大求解时间拉长到几分钟以上时我不建议立刻上高性能服务器而是按三个顺序排查。第一看整数变量数量把冗余的0-1变量压缩掉比如可以合并同一时段多个相同设备的启停变量第二看大M取值M过大会造成数值病态适当收紧可以明显提速第三看目标函数的系数缩放把成本和碳费放在同一量纲下避免百万和千分之一的系数同时存在于一个方程里。实在还慢就把MIPGap从默认的1e-4放宽到1e-3。对于典型日调度这种研究级场景1e-3的精度完全够用求解时间能降一个数量级。最后说一点个人体会整套模型跑下来我最大的感受是碳价曲线的“形状”比碳价本身的“高度”更能决定综合能源系统的转型路径。阶梯式碳交易制造的不是一个静态成本而是一连串“越界警告”它让系统在热、电、氢之间反复权衡而这种权衡恰恰是综合能源系统设计最核心的价值所在。电制氢在这个机制里承担的角色非常灵活——当弃电多时它是负荷当风光不足时它是储能当高峰热电紧张时它又是一台额外的热电联产机组。如果后续你想把这个框架延伸到更长时间尺度建议重点细化储氢罐的寿命模型以及加入氢气对外销售的阶梯价格。最后分享一个总结不出来的小技巧做任何灵敏度分析前先跑一个“碳价全为0、氢系统关闭”的极端基线然后逐层打开碳机制和氢系统观察每一步的可行域变化这个方法比直接看最终结果更能帮你理解模型的内在机理。