开篇先聊两句大实话:双碳目标从“口号”变成“硬约束”之后,能源系统优化这件事,难度直接上了一个台阶。过去做综合能源系统调度,核心就两个字——省钱,顶多再考虑下弃风弃光率;现在不一样了,碳排放成了真金白银的成本项,碳交易机制把排放从“道德约束”变成了“价格信号”,系统内每一个设备的出力选择,都会改变碳配额盈亏,进而影响总成本。
我这两年一直在做区域综合能源系统的运行优化,最开始完全按传统经济调度思路做,结果碳成本算进去之后,方案面目全非。后来把需求响应也加进优化模型,发现负荷侧的柔性资源,对碳减排的贡献甚至不亚于换一台高效机组。很多朋友问我要这套模型的思路,我干脆把整个建模、求解、踩坑过程写成一篇文章,尽量把关键点讲透。
这篇文章适合谁?主要是三类人:搞园区级综合能源系统规划或运行的工程师、做能源系统优化方向的研究生、以及刚接触碳交易机制和需求响应建模、想快速搭建可复现模型的从业者。
1. 碳交易机制:从“排放成本化”到“碳价梯度”的层层递进
先说碳交易机制为什么能改变运行逻辑。过去我们做优化,目标函数里只有购能成本、运维成本这些,碳排放顶多放在约束里限制一下总量。但碳交易机制的引入,相当于给每一吨二氧化碳贴了一个价格标签,而且是浮动的、分档的,这就让“减排”从一个含糊的方向变成了一个可以在数学上精确求解的决策变量。
1.1 基准配额:免费配额决定了成本的“起跑线”
碳排放权交易体系里,企业会先拿到一定量的免费配额。这个配额的核定方式很关键,常见的有两种:一种是基于历史排放强度,一种是基于行业基准线。在园区级综合能源系统里,通常就简化为按照系统实际供能量乘以一个排放基准系数来核算。
举个例子,假设某园区年供电量为1亿千瓦时,基准排放系数如果定为0.7千克/千瓦时,那么免费配额就是7000吨二氧化碳。实际排放量低于这个值,多余的配额可以拿到市场上出售;高于这个值,超出的部分就需要花钱购买。
这个“基准线”画在哪,直接影响系统的经济性。我见过不少方案,把基准系数设得很低,比如0.5,那系统几乎无论如何都要购买碳配额,燃气机组的灵活性优势就被压缩了;反过来设到0.85,那燃气机组放开跑,系统反而不愿意用外部购电,因为购电的间接排放很高。这里面的权衡是整篇模型的第一个核心矛盾。
1.2 阶梯式碳价:为什么不是单一碳价,而是分段计价
单一碳价的模型当然简单,但实际碳市场很少用一个固定价格。更常见的是阶梯式碳价,即超出的配额越多,单位碳价越贵。这样设计的目的很直接:轻度过量时,企业咬咬牙就买了;严重过量时,成本指数级上升,倒逼企业必须调整运行策略。
在模型里,这个机制可以用分段线性函数来表达。比如:
- 超额量在0~500吨区间,碳价为210元/吨;
- 500~1500吨区间,超出部分按280元/吨计;
- 1500吨以上,按420元/吨计。
在数学建模上,需要引入分段线性化处理。我一般用0-1变量来锁定当前处于哪个阶梯区间,配合big-M约束来让目标函数在这个区间的斜率正确生效。这个处理在CPLEX和Gurobi里都很成熟,关键在于边界点的衔接,必须保证相邻区间在交接点处成本连续,否则求解器会报数值病态。
1.3 碳交易成本函数怎么嵌进目标函数
很多初次接触的人会以为碳交易成本就是一个“单价 × 超额量”的线性项,直接加到总成本里就完事。但对于阶梯式碳价,你需要先把一个非线性分段函数嵌入到目标的线性表达式中,这一块处理不好,模型在求解时会出现跳变。
我常用的做法是把碳交易成本写成一个关于碳排放净量的分段线性函数。设实际排放量为E,免费配额为E0,超额量为ΔE = E − E0。当ΔE≤0时,系统可以出售富余配额,获得收益;当ΔE>0时,需要购买。再把购买部分按分段边界拆成几段变量,每一段对应一个价格区间,目标函数就变成了一个凸的分段线性函数的最小化问题。
这个结构写起来清爽,求解效率也不算低。只要整数变量别太多,24小时粒度的机组启停加碳交易分档,混合整数线性规划(MILP)在几秒到几十秒内就能收敛。
2. 需求响应:把负荷侧资源变成可调度的“虚拟储能”
做综合能源系统优化到了后期,你会意识到供给侧能调的其实有限——机组效率在那儿摆着,能变的只有启停和出力比例。真正的调节潜力在负荷侧。需求响应就是把“用户用能时间”也变成一个可优化变量,让系统的整体调度空间变大,碳成本自然也跟着降。
2.1 需求响应的两类基本形态:可削减与可平移
建模前要先分清楚需求响应资源长什么样。可削减负荷,指的是用户允许在一定时段内减少部分用电,比如空调温度调高两度、工业设备错峰一两小时。这类负荷削减是“硬”减少,削减时段不会在后面补回来。
可平移负荷则不一样,用户只是把用能时间挪了一下,总量不变。典型的就是电动汽车充电、洗衣机、蓄热式电采暖。这种负荷在数学上表现为:移入某个时段,必然有另一个时段的等量移出,净能量守恒。
在模型里,二者要分别建约束。可削减负荷用上下限约束加上最大削减次数限制就行,可平移负荷则需要引入时移变量的守恒约束。要是不做区分,混在一起优化,特别容易出现“平白多出能量”的荒谬结果。
2.2 需求响应补偿成本的设计逻辑
用户不会平白无故让你削负荷。要让需求响应参与成本优化,必须给用户补贴,这个补偿单价是优化模型的关键参数。
补偿单价的取值,直接决定了系统“愿不愿意”调用需求响应。设补偿单价过高,比如1.2元/千瓦时,系统会发现买碳配额都比削减负荷划算,需求响应资源形同虚设;单价设得太低,比如0.1元/千瓦时,系统又可能疯狂削减负荷,导致用户侧体验崩坏。合理的做法是参考可中断负荷电价、现货市场的价格波动幅度,一般取购电电价的1.2到1.5倍比较均衡。
另外,我习惯在模型中对削减总量设置一个上限,比如不超过当日总负荷的15%。这是经验值,否则求解器为了压低碳成本,很可能把负荷削得完全失真,结果看起来经济性极好,实际根本没法落地。
2.3 为什么需求响应不是“固定约束”,而是“柔性调节变量”
这一点是建模认知层面最关键的一次转变。很多初学者把需求响应当成一个硬约束来写——比如“某时段负荷不得超过某个值”,这样确实简化了问题,但等于把灵活性丢掉了。
柔性建模的正确姿势,是把需求响应量定义成连续决策变量,小到0,大到允许的上限,这样系统根据碳价、电价、机组状态综合判断,自动决定响应多少。换句话说,它是一个“目标导向”的决策项,而不是人为提前拍板的边界条件。把需求响应从硬约束改为柔性变量之后,我跑出来的系统总成本大概下降了7%到12%,这个幅度已经相当可观。
3. 综合能源系统的拓扑设计与设备效率对比
聊完了机制,接下来落到系统本体。综合能源系统优化运行模型的底子,是一个描述各种能源设备如何耦合的物理模型。这个模型不要求三百六十度还原热力学过程,但核心的能流约束和效率特性必须抓住。
3.1 典型拓扑:电、气、热三条能流管线的贯通
我习惯用一个典型的园区综合能源系统拓扑来作为建模底座,包含外部电网、天然气管道、风电和光伏,内部设备包括燃气轮机、燃气锅炉、电锅炉、储能蓄电池、蓄热罐、电转气(P2G)装置。
这里面的核心关系是:电负荷由外部购电、风光出力、燃气轮机发电、储能放电共同满足;热负荷由燃气锅炉、电锅炉、燃气轮机余热回收、蓄热罐放热共同满足;天然气负荷则由气网购气和P2G产气满足。电、气、热三条能流管线通过燃气轮机和P2G形成闭环耦合,这给了优化模型很大的辗转空间。
3.2 关键设备效率与耦合约束的工程取值
设备参数的取值直接影响模型结论。我把自己在多个项目中使用的典型效率值列一下,方便大家直接拿来当初始参数:
| 设备 | 效率/关键参数 | 备注 |
|---|---|---|
| 燃气轮机 | 发电效率0.35,热电比1.3 | 余热回收用于供热 |
| 燃气锅炉 | 热效率0.90 | 作为供热备用 |
| 电锅炉 | 热效率0.95 | 弃风/低谷电时段使用 |
| 储能蓄电池 | 充放效率0.95 | 放电深度不超90% |
| 蓄热罐 | 储/释热效率0.90 | 热惯性较大 |
| P2G | 电转气效率0.65 | 产气并网,受时段限制 |
燃气轮机的热电比尤其关键。热电比低,说明发电多、供热少,适合电负荷重的场景;热电比高,则相反。实际系统中,热电比往往不是一个固定值,而是随负荷率变化的曲线。但为了保持模型可解性,我在初始模型里把它设为常数,后续再逐步放开。
3.3 为什么要引入电转气(P2G):闭环的关键拼图
很多人对P2G有误解,觉得电转气能量损失大,多此一举。没错,P2G整体效率只有60%出头,从能量角度看,它不划算。但模型的目标函数不是“能量最大化”,而是“成本最小化”。
引入P2G的最大意义,是给富余风光出力找一条“可存储、可跨时段利用”的出路。当深夜风电大发、电价极低甚至有弃风时,与其让风机停机,不如把电转成天然气存入储气设备,待白天气价电价高企时再释放。放入碳交易机制后再看,这一步的价值更明显:气在系统内部循环,不从外部购气,间接减少了系统的综合排放。
我在模型里专门设了一个约束:P2G的产气量和气网的购气量共同满足气负荷,但优先使用P2G产气。这样写之后,模型不会出现“一边用电转气、一边又从外面买气”的逻辑矛盾。
4. 优化运行模型的完整构建与求解
这部分是整篇文章的“硬核”所在。我把完整建模过程拆成目标函数、约束条件、求解设置三块,给出可直接参照的写法。
4.1 目标函数:五个成本项如何拼装在一起
优化目标设置为系统在一个调度周期(我取24小时)内的综合总成本最小化,共包含五项:
- 购能成本:从电网购电费用,加上从气网购天然气费用;
- 碳交易成本:按阶梯碳价计算,根据实际排放量相对免费配额的偏差得出,可为负值(即出售配额收益);
- 需求响应补偿成本:可削减负荷的补偿支出,以及可平移负荷的调度补偿;
- 设备运维成本:各机组单位出力的维护费用,通常是出力的一次函数;
- 弃风弃光惩罚成本:对未消纳的可再生出力设置一个较高的惩罚单价,倒逼系统优先消纳。
这五个成本项的系数配置,把系统的行为倾向基本框死了。验收过一个项目之后我才意识到,很多“模型跑不出来合理结果”的问题,八成出在惩罚项和补偿项的相对大小上。如果弃风惩罚设得太低,模型宁可弃风也不愿意用P2G;设得太高,又会出现电锅炉全天满负荷的“伪消纳”现象,把热负荷撑爆。我最终用的经验值是:弃风惩罚单价取购电价的1.8倍,需求响应补偿单价取购电价的1.3倍,二者保持一个合理的价差梯度。
4.2 约束条件的工程边界:从功率平衡到多能耦合
约束条件我分成几个层次来讲。
第一层是功率平衡约束。24个时段的电、气、热三条能流母线各自平衡,这是个硬约束,缺了它模型整个失去物理意义。第二层是设备运行约束,包括各机组的出力上下限、爬坡约束、启停时间约束、储能设备的荷电状态(SOC)递推约束。第三层是需求响应约束,包括削减上限、时移守恒、两次响应的最小间隔。第四层是碳相关约束,即碳排放量必须按各能流的排放因子计入,包含外购电力的间接排放和燃气机组燃烧的直接排放。
第四层我特别提一下。外购电力的排放因子不是一个恒定值,它取决于电网的实时碳排放强度。做动态碳因子时,需要基于电网的典型日负荷曲线给出波动数据,比如高峰时段碳因子高、低谷时段低。这样模型在低谷电时段多购电来制热或充电,排放成本也不会失控,逻辑就自洽了。
4.3 参数设计我踩过的坑:单位一致性和标幺化
这是给新手的忠告:建模型之前先把所有功率、能量、价格的单位统一。功率是兆瓦(MW),能量是兆瓦时(MWh),价格单位是元每兆瓦时。我在早期版本里混用千瓦和兆瓦,调度结果差了一千倍,排查了一个下午,最后发现是储能SOC的递推公式里能量单位没统一。
另一个建议是考虑标幺化。综合能源系统优化模型动辄几十上百个变量,如果设备容量是几百兆瓦级,而电转气效率只有0.65,数值尺度相差悬殊,求解器内部的容差设定很容易引发数值问题。把功率和能量都归一到基准容量之下,单位的数量级拉平,求解速度会快不少。
4.4 求解工具与结果分析维度
求解这块,目前主流的商用求解器是Gurobi和CPLEX,可以直接处理MILP。开源方案里,SCIP和HiGHS也够用,但大规模问题下性能差别还是比较明显。用Python的Pyomo或JuMP(Julia)写建模代码,再调用求解器,整体链路已经非常成熟。
求解完成之后我建议从三个维度来看结果。一是能流分布图,看各时刻电能来自哪里、热能来自哪里;二是碳交易成本的时间曲线,看碳成本在哪些时段占了主导;三是需求响应的调用时段分布,看模型倾向于削哪些负荷、避哪些时段。这三个维度摆在一起,模型的策略逻辑就非常清楚了。
5. 场景结果怎么读:模型跑出来的答案说明什么
参数对着真实工程设完之后,模型的实际输出是检验一切的标准。这里我把自己做过的典型测试场景和结果复盘贴出来,给大家一个直观感受。
5.1 典型日的负荷与碳价数据准备
模拟典型冬季日场景(冬季热负荷大,综合能源系统的耦合效应最明显)。电负荷峰出现在晚上18点到21点,热负荷白天平稳、夜间略高,风资源夜间充足、存在较大的弃风窗口。碳交易基准配额按月折算到日,阶梯碳价按前文的价格段位设置,电网购电价格峰谷价差约三倍,天然气价取较为常见的2.1元每立方米。
我特意把碳价峰谷和电价峰谷错开,让模型在决策时面对两套价格信号,这样能更清楚地看出碳成本对运行策略的改变。
5.2 三种运行模式的对比结果
我分别跑过纯经济调度模式、加入传统单一碳价的调度模式、以及加入阶梯碳价与需求响应的完整模型三种工况,同场景、同参数之下,结果对照如下:
| 指标 | 纯经济调度 | 单一碳价模式 | 完整模型(阶梯碳价+需求响应) |
|---|---|---|---|
| 总运行成本(相对值) | 1.000 | 0.935 | 0.861 |
| 碳排放总量(相对值) | 1.000 | 0.912 | 0.803 |
| 弃风率 | 14.2% | 8.6% | 3.1% |
| 需求响应调用量 | 0 | 0 | 5.8 MWh |
三组结果的解释非常清晰。纯经济调度“看不见碳”,系统当然尽量用便宜的燃气机组,碳排放爆高;单一碳价让模型开始“有意识”减排,但手段有限,降碳主要靠压低总体用能;完整模型则通过阶梯碳价在高峰时段进一步施压,模型主动削减部分可转移负荷、在夜间低谷时段通过蓄热和储能系统吸收风光电力,弃风率和碳排同时显著下降。
5.3 结论怎么移植到实际业务
这套模型的结果,对实际园区运行策略有什么参考?我个人觉得最有价值的一点是:它把减碳目标从一个“规划口号”转化成了“可执行的日调度指令”。
比如模型的结论会告诉你,在下午14点到16点时段碳价较高,应优先让蓄热系统放热,而不是启动燃气锅炉;风电大发时段,应适度增加电锅炉出力吸收多余电力,同时削减部分非核心工业负荷;到了晚上用电高峰,再让储能放电兜底。这些调度建议完全可以对接现有EMS系统的日前发电计划模块。
6. 常见问题与排查经验实录
最后这部分,我想把做这类模型时大家大概率会撞上的几个问题,连同我自己的排查经验一起写出来,算是给大家一个速查表。
6.1 模型无解或求解时间过长
模型无解是最常见的。我遇到过的情况,百分之七八十出在约束过死:比如我把储能SOC上下限设成20%到90%,同时又把蓄热罐的放热速率上限设得很低,结果夜间热负荷高峰时段,系统没有任何可行方案。排查无解问题,第一步用求解器的IIS(不可行约束集)功能,把最底层的冲突约束找出来,然后适当放宽边界。
如果模型可行但求解时间过长,就要考虑是不是整数变量太多。可以对启停变量按机组聚合粒度进行冻结,或者引入预调度结果作为热启动解。还有一个很实用的技巧:先放松掉需求响应的整数变量,得到连续解的界之后,再恢复整数约束,这样求解器能更快地剪枝。
6.2 单位不一致导致的“结果离谱”
这个问题我在第4.3节提过一次,但因为吃过大亏,必须放在问题表里重点提醒。特别是在碳排放核算环节,排放系数的单位极易写错。比如外购电力的排放因子写成吨/MWh,设备耗气量的排放因子写成吨/立方米,两者放在同一个等式中比较,单位维度对不上,结果一定错得离谱。
我的习惯是先在纸上把所有参数的单位全部统一到国际单位制,再统一转化为模型使用的输出单位,然后写一个简单的参数自检函数:给定一组已知出力值,手工估算一次碳排量,和模型内部计算结果对照。误差超过1%就立即检查单位换算。
6.3 P2G设备效率写太高会怎样
P2G效率是很多论文里的“魔法系数”,有人为了保证场景好看,直接把电转气效率设到0.8甚至0.9。实际工程中,P2G多级过程(电解氢、加氢甲烷化)的整体效率确实很短。一旦模型在太阳能资源好的地区配上偏高效率的P2G,求解器会非常偏好这条路,导致整个系统几乎所有多余的电都走电转气再转电的链路,这个循环的能量损耗被低效率值掩盖,结果掩盖了真实成本。
仿真中我建议的实测参考线是:碱性电解槽电转氢效率约0.6到0.7,氢再经甲烷化合成天然气整体效率约0.55到0.68。写模型就用0.65这个保守值。实际生产或仿真精度要求更高的场景,建议把P2G当作时段可分步进行的分阶段设备,分别在电解与甲烷化并入时序建模。
6.4 需求响应补偿参数怎么定才好用
补偿单价拍脑袋定,很大概率会得到一个“要么全用、要么全不用”的极端解。比较稳妥的办法是先跑一版不含需求响应模型的纯机组调度情况,得到边际成本曲线;再取各时段边际成本平均值的1.2到1.4倍作补偿单价。这样可以确保需求响应只在边际成本较高的短时段被实际调用,实现“精准弹性调节”,而不是被整日滥用。
调整需求响应的调用总上限时,我习惯做敏感性分析:把上限从5%一步步升到20%,看总成本下降曲线的斜率。斜率变平的那一档,就是系统侧可承受的合理响应规模,再往上加,用户的体验损失会开始大于系统收益。
把这套模型完整跑通,我体会到最核心的思考方式转变就是:把碳排放当作一个真正的“成本信号”放进优化目标里,然后用需求响应的柔性资源去应对它,系统就会自觉找到比单靠设备堆叠更聪明的调度方案。这套逻辑无论对科研、教学还是工程落地,都是值得继续打磨的方向。