1. 为什么综合能源系统突然成了减碳的主战场
1.1 双碳目标传导下来的真实压力
双碳目标喊了这几年,落到综合能源系统(IES)项目上,我最大的感受就是:以前给某个园区做优化调度方案,业主问的第一句话永远是"能省多少电费",现在问的第一句话变成了"能减多少碳,碳排放强度能不能达标,碳成本有没有算进运行策略里"。
这个转变不是口头上的。我这两年接触到的实际项目,无论是新建的综合能源站,还是存量园区的改造升级,方案评审时几乎都有一项硬指标,就是单位产值的碳排放强度。甚至有些地区的电力公司给大用户做用能规划时,已经开始把碳配额履约成本纳入月度账单的模拟测算。也就是说,碳排放不再是"企业社会责任"这种软约束,而是直接变成了一张要真金白银去履约的硬账单。
综合能源系统的本质,是在同一个物理空间内,把电、气、热、冷多种能源形式通过设备耦合起来,让能源在这个网络里流动时有多条路径可选。正是这种"多条路径",让它成了减碳的关键载体。
举一个最简单的例子:如果没有气网和热网的耦合,电负荷只能由电网和本地电源平衡,那么在冬季晚间风电小、光伏为零的场景下,只能靠火电或者燃气机组顶着,碳排放没得选。但是一旦有电锅炉、热泵、储热罐和燃气轮机这些耦合设备,同样的电负荷,我可以选择"电网直接买电+燃气锅炉补热",也可以选择"燃气轮机热电联产+电制冷代替部分空调电耗",还可以选择"夜间谷电蓄热、白天融热供热"。这些路径的碳排放强度和用能成本差异非常大,优化调度就是在这些路径里找最优组合。
1.2 综合能源系统减碳的底层逻辑:多能互补的整体优势
IES减碳的核心逻辑不在于某一个设备本身有多绿色,而在于"整体互补"带来的结构性红利。我习惯用一个比方来解释这件事:单一能源系统就好比一个只会做单一菜品的餐厅,客人点啥你就做啥,食材品类少了自然容易浪费;而综合能源系统是一个有共享厨房的中央食堂,电饭煲、燃气灶、蒸烤箱一起用,哪个能源便宜、哪个能源排放低,就灵活切换烹饪方式,整体效率自然更高。
落到具体技术上,这个"共享厨房"体现在四个层面。
第一个层面是设备层面的余热回收。燃气轮机发电时会有大量高温烟气,传统火电模式下这部分热量直接排进大气,而IES里可以通过余热锅炉进入蒸汽或热水管网,供热效率比单独烧燃气锅炉高出一大截。同样的天然气,既发了电又供了热,单位天然气的综合能源利用效率可以从40%左右提升到75%以上,碳排放强度随之下降。这就是所谓"温度对口、梯级利用"的基本原则。
第二个层面是储能的时空搬移。传统电力系统是"即发即用",废风光时段的电没人用就浪费。IES里有了电储能、储热、储冷甚至氢储能,可以把低谷期的廉价清洁电力存下来,转移到高峰时段去替代燃气机组发电。特别是储热罐这种东西,成本比电池低得多,寿命又长,在北方园区的冬季供热场景里,用谷电蓄热替代白天天然气直烧,减碳效果非常可观,而且经济性几乎能打平。
第三个层面是异质能源的替代效应。燃气锅炉制热和电热泵制热,在碳排放上是完全不同的两条路径。同样是产生1吉焦热能,天然气锅炉要排放约50到60公斤二氧化碳,而电动热泵如果用的是清洁电力,排放几乎为零,即使电网排放因子算高一点,也只有煤气锅炉的六到七成。优化调度要做的事情,就是在每个时段根据电网排放因子、天然气价格和碳排放配额,动态判断该让哪条路径多出力。
第四个层面是需求侧的柔性互动。现在IES项目一般都会配微网控制系统和需求响应策略,可以引导电负荷、热负荷主动调节用能时段。比如在光伏大发的中午时段适当多用电、在晚间高峰时段少用电,这本质上是通过"削峰填谷"拉高了清洁能源的消纳比例。负荷侧的一减一增,有时比电源侧新装一台机组更便宜,也更低碳。
1.3 调度优化在IES里到底管什么
说完了IES减碳的底气,再来说说调度优化在其中扮演的角色。很多人对"优化调度"的理解就是"排一个运行班表",但实际上,一个完整的IES优化调度要回答以下五个问题:每一台设备在下一秒是开机还是停机;设备的出力定在哪个值;储能设备是充电还是放电、蓄热还是放热;和外部的电网、气网交互多少功率;以及把碳排放配额用在哪些时段最划算。
这些问题互相纠缠,属于典型的混合整数非线性规划问题。之所以"混合",是因为设备的启停状态是0或1的整数变量;之所以"非线性",是因为燃气轮机的效率会随着负荷率变化,热泵的COP也不是恒定的,管网里流量和压降的关系更是一对非线性关系。
我在实际项目里通常把调度问题拆成三个时间尺度来做。日前计划是做未来24小时的设备出力序列,滚动修正阶段是每隔15分钟到1小时根据最新的负荷预测和可再生能源出力预测做一次修正,实时层则只负责处理秒级的频率波动和并网点功率越限问题。三个时间尺度对应的优化目标不完全相同,但共享同一套设备模型和约束条件。
这三年做下来,我个人的体会是:IES低碳优化调度与传统的电力调度相比,最大的不同在于优化目标从"单目标的成本最低"过渡到了"多目标的综合效益最优",而且碳约束是硬约束。这个转变看起来就是多了一项成本、多了一条约束,实际上对建模方法、求解算法和工程实现的影响是根本性的。下面我把这块掰开揉碎了讲。
2. IES低碳调度的建模思路:从单目标到多目标的转变
2.1 传统经济调度和低碳调度的本质区别
在传统的园区微网经济调度里,目标函数写出来通常就是一句话:让总运行成本最小。总运行成本无非是购电费、燃气费和设备启停维护加起来。这种模型运行得很顺,因为所有东西最终都折算成了钱,单一目标函数,求解器友好,业务上也好解释。
低碳调度多出来的是两样东西:碳排放约束和碳交易成本。这两样东西往模型里一放,事情就变得复杂了。首先,碳排放和能源成本的时间分布不对称。天然气在凌晨低谷时段烧和傍晚高峰时段烧,如果热价、电价是一样的,那么成本是一样的;但碳排放不会因为你夜间烧气而打折扣,排放一吨就是实实在在的一吨。其次,很多IES设备在成本和排放两个维度的优先级是冲突的。举个例子:燃气轮机发电成本比电网购电便宜很多,但度电碳排放却高得多。在纯经济模型里,燃气轮机大概率多发电;在低碳模型里,它会受到碳配额和碳价的双重压制,发电量被压制下去后,电网购电量会上升,而电网的排放因子又决定了这个替代是否真的低碳。
这就需要模型把两本账同时算清楚:一本是钱的账,一本是碳的账。
我在建模时最常用的思路是"碳排放积分制"。给每一台设备建立单位出力的碳排放因子:电网购电的排放因子按当地电网平均碳排放水平填,燃气轮机按气耗乘排放系数算,燃气锅炉按天然气排放系数算,电热泵和电锅炉则要看电从哪来。然后给整个园区设定一个日碳排放配额,所有设备的碳排放量加起来不能超过这个配额,如果超过了,超出部分要么在碳市场购买配额,要么接受罚款。这样一来,碳排放就同时以"约束"和"成本"两种身份参与了优化,设备出力自然会被压到一个碳排放和金钱的平衡点上。
2.2 碳交易机制怎么进入模型:配额、碳价与阶梯成本
碳交易机制进入优化模型,我见过三种典型做法。
最简单的做法是把碳配额当作固定约束:全天碳排放量必须低于某个值,比如以历史平均排放量打九折作为上限。这种做法工程上好实施,但不反映真实碳市场的交易机制,而且当碳配额设得太紧时,模型可能无解。
第二种做法是给碳排放在目标函数里加一个固定碳价,比如每吨50元。这样碳排放就变成了运行成本的一部分,每个设备的"真实成本 = 能源成本 + 排放量×碳价"。模型会自动去权衡"多买一度电"和"多排一公斤碳"哪个更划算。这种做法是我推荐做技术验证的人先上手的。
第三种做法是我现在在项目里主推的,采用阶梯碳价,模拟真实碳市场中"配额内低价、超配额高价"的特征。基础配额以内的排放按较低碳价算(比如50元/吨),超出基础配额的按一个更高的碳价计价(比如70元/吨),如果超过某个严重阈值,再往上跳到100元/吨。阶梯碳价的本质是给碳排放画了一条"价格递增的警戒线",模型会在接近警戒线时自动调整运行策略,尽量把排放压在低价的台阶上。
阶梯碳价写进目标函数以后,会出现一个很有意思的现象:某些时段,设备出力会出现"排队"效应。排在最前面的是零碳或低碳设备(风电、光伏、水电、储能放电),然后是中等排放设备(电网购电、电热泵),最后才是高排放设备(燃气轮机、燃气锅炉)。碳价越高,高排放设备被调用的概率就越低。这个"排队序列"比任何碳排放后处理分析都直观。
2.3 碳捕集和P2G:让碳排放真的"循环"起来
单纯的"少用化石能源"只能把碳排放降到一定程度,要把排放指标做得更漂亮,必须在系统里引入负碳或近零碳技术。现在IES项目里最常出现的是碳捕集装置(CCS)和电转气(P2G)这对组合。
碳捕集装置装在燃气轮机和燃气锅炉的排烟管路上,用化学吸收法把烟气里的二氧化碳分离出来。捕集率一般在85%到90%之间,捕集下来的二氧化碳可以压缩后用于食品行业,也可以就地封存,或者直接送到旁边的甲醇合成装置去做碳利用。在优化调度里加入碳捕集设备,模型会多一组决策变量:碳捕集装置的运行状态和捕集功率。捕集功率本身要消耗电或热,这部分能耗会让汽轮机的净出力下降,但同时会减少系统对外的净碳排放。这本质上是一个"花掉一部分能量、换回一部分碳配额"的即时交易。
P2G设备则是把富余的可再生能源电力转化成氢气或合成天然气。电解槽在谷电时段或者光伏大发时段运行,把水电解成氢气和氧气,氢气一部分直接作为工业原料或掺入天然气管网,另一部分进入甲烷化反应器生成合成天然气。合成天然气再送到燃气轮机里发电,这就形成了"电→氢→气→电"的循环链条。从煤气化到燃烧的全过程来看,碳被多次利用,净排放大幅降低。P2G带来的问题是效率损失:电解制氢效率60%到70%,甲烷化再损失一批,最后再发电又损失一批,全程效率可能只有30%多。但从系统层面看,如果本来就要弃电,那么这部分废弃电力通过P2G存下来替代天然气,碳排放上反而划算,因为省下的天然气是实实在在的化石燃料。
我把碳捕集和P2G都放进模型后,目标函数就变成了一种多层的权衡结构。第一层是能源经济层,决定各设备出力;第二层是碳循环层,决定碳捕集和P2G的去向;第三层才是整个系统的碳交易层,决定要买多少配额。这三层之间没有天然的主从关系,必须统一放进同一个优化框架里同步求解,否则很容易出现"捕集了所以排放少了,但运行成本涨得离谱"这类顾此失彼的现象。
3. 求解方法与工具链选型:工程可用性的真实考量
3.1 模型复杂度决定求解器选择
IES低碳优化调度模型,按照我之前描述的框架搭出来,数学上是一个混合整数线性规划(MILP)问题,条件好的话可以简化成混合整数二次规划(MIQP)。如果有管网水力计算参与,就会变成混合整数非线性规划(MINLP),那复杂度就上了一个大台阶。
我在选求解器时的判断依据很简单:看模型规模和非线性程度。一个中等规模的园区IES,典型的时间步长是15分钟,一天96个时段,设备数量二三十台,变量数大概在几千到一两万个,约束几万个,这种规模用商用MILP求解器完全可以搞定,通常几分钟到十几分钟能出结果。但如果加入了管网的非线性水力方程、设备效率随负荷率的二次曲线变化,或者可再生能源出力的随机场景,模型就变成MINLP了,此时商用求解器直接求解的效率会断崖式下降,经常跑到一两个小时都不收敛。
工程上不是非要追求全局最优解。我见过很多项目用"分段线性化"把非线性问题转成MILP:把燃气轮机的效率曲线拆成三段到五段直线,把管网压降方程做分段近似,把P2G的效率损失按不同运行区间做线性化。损失的是非常小的一部分精确度,换来的是求解速度提升一个数量级,而且结果可以复现、可以解释。这是工程上的主流做法,也是我现在最推荐的。
3.2 从数学软件原型到工程代码落地
在学术研究阶段,我最常用的是MATLAB环境下的YALMIP工具箱加商用求解器的组合。这套组合最大的优势是建模速度快,一套完整的IES低碳优化模型,两三天就能搭出能跑的原型,适合大量推演不同碳价、不同配额场景。
但到了工程落地阶段,我几乎全部转向了Python生态。原因是工程交付要的不是"能跑出一个好结果",而是"稳定、可版本控制、可自动化部署、能和业务系统对接"。MATLAB在许可证和部署上太麻烦,而且和现有的数据库、监控系统对接也不方便,Python则天然适合做这些事情。
我现在的主力工具链是这样的:用Python的pyomo或直接写求解器的Python接口来做建模,数据预处理用pandas,不确定场景生成用numpy加scipy,可视化用matplotlib。如果调度周期是日前、需要用商业求解器,就直接调用其Python接口;如果调度周期是实时的、模型规模又不大,我会选择开源的求解器,省去license依赖。
这里有一个实操上的忠告:无论用哪种建模语言,都不要把模型写成一整块几千行的庞然大物。我最初的几个项目就是这么干的,结果调试一个约束条件要找半天逻辑,出问题后根本不知道是哪个布置错了。现在我都是把模型拆成模块:设备模型模块、网络约束模块、碳交易模块、目标函数模块、场景生成模块。每个模块独立测试、独立维护,调度主程序只负责把模块组合起来。这种架构第一次搭的时候确实慢,但从第二个项目开始复用的好处极其明显。
3.3 不确定性处理方法:什么时候该上鲁棒优化
IES优化调度中最大的不确定来源是两个:可再生能源出力预测误差和负荷预测误差。如果只拿一个点预测值去做日前调度,等到实际运行时往往偏差很大。比如光伏大发那天的预测值是100兆瓦,实际只有60兆瓦,日前计划里"燃气轮机少开一台"的决策就可能导致晚高峰供电不足。
我处理不确定性的方法分三个层次。最简单的是滚动修正:日前做一次优化,运行当天每15分钟根据最新的超短期预测重新优化一次,只执行未来1到2小时的决策。这种"短窗滚动"能把大多数预测误差对冲掉,工程上最实用。
如果项目对可靠性要求更高,我会用场景法:基于历史数据生成几十到上百个可能的风光出力场景,每个场景搭配一个概率,目标函数变成"所有场景下的期望运行成本最小"。场景法的缺点是模型规模翻倍,求解时间变长,但结果稳健。还有一种更讲究的分布鲁棒优化,它在不确定集合内寻找最坏情况下的最优解,适合电网有硬性安全约束的场景,但这种方法的保守性也很明显,运行成本往往会偏高。
我的经验是:刚开始做IES调度时,不要一上来就玩高级的鲁棒优化或者随机优化。先用确定性模型加滚动修正把整个流程跑通,把数据管好、把设备模型校准好、把碳交易逻辑理顺,再考虑加复杂度。很多项目里的"调度结果不理想",根子上根本不在算法不够高级,而是太阳能预测数据本身就没处理好。有句话我经常在项目总结里写:预测的坑不填平,任何高级优化算法都是在沙滩上盖楼。
4. 一个模拟园区项目的完整调度流程与代码骨架
4.1 案例配置:设备容量与基础参数
为了讲清楚完整的建模和调度流程,我设计了一个模拟的综合能源园区案例。这不是某个真实项目,参数经过脱敏和调整,但结构具有代表性:北方某综合能源园区,有一个规模不大的区域电网接入点。
园区的主要设备包括:一台50兆瓦的燃气轮机(带余热锅炉),一台20兆瓦的燃气锅炉作为调峰热源,30兆瓦的光伏电站和20兆瓦的风电场作为可再生能源电源,一套10兆瓦/40兆瓦时的磷酸铁锂储能系统,两台合计25兆瓦的电锅炉,一个2000立方米的储热罐,以及一套处理量为5兆瓦的P2G装置。热负荷峰值约60兆瓦,电负荷峰值约80兆瓦,全天电热负荷曲线按典型的北方冬季工况设置。
碳排放相关参数设置如下:电网购电排放因子取0.581千克二氧化碳每千瓦时(按华北区域电网的平均水平),天然气排放系数取2.16千克二氧化碳每标准立方米,燃气轮机气耗率约0.22标准立方米每千瓦时。园区日免费碳排放配额按历史基准排放量的95%设定,碳价分阶梯:配额内50元/吨,超配额10%以内70元/吨,超配额10%以上100元/吨。
这些参数不需要在每篇博文里看懂,但有一点可以留意:把碳排放因子从电网整体平均值细化到分时因子,是低碳调度建模的关键一步。我现在用的是分时排放因子:后半夜负荷低谷时电网排放因子低(大机组压负荷,且有风电在发),晚高峰时排放因子高(火电顶上),这个分时数据对调度结果的影响比很多人想象中大得多。
4.2 目标函数与关键约束的数学表达
这个园区日运行调度的目标函数如下:
min Σ(t=1..96) [ C_gas(t) + C_grid(t) + C_om(t) + C_carbon(t) ]
其中:
- C_gas(t) 是t时段购天然气费用;
- C_grid(t) 是t时段电网购电费用,电价采用分时电价,峰谷价差约0.6元/千瓦时;
- C_om(t) 是设备启停和运维费用;
- C_carbon(t) 是碳交易成本,按下式算:
如果园区实际碳排放量E_total ≤ 免费配额E_alloc: C_carbon(t) = 0 否则分两档计价: E_total ≤ 1.1×E_alloc 时,超出部分按70元/吨计; E_total > 1.1×E_alloc 时,超出10%以内的部分仍按70元/吨,再超出部分按100元/吨。
约束条件分为四类。第一类是各时段的电功率平衡、热功率平衡、气功率平衡;第二类是各设备的出力上下限、爬坡速率约束,储能系统有SOC上下限和充放电功率限制,储热罐同样有蓄热上下限;第三类是设备启停逻辑,燃气轮机和燃气锅炉的状态变量是0/1,启停次数有上限;第四类是碳捕集和P2G的运行范围约束。事实上整个模型一共有十组左右的约束,实际代码里写出来有将近两百行。
4.3 我的核心代码骨架(可直接改参数复用)
下面给出我常用的调度主程序骨架,这段代码的核心逻辑是把数学模型直接翻译成建模语言的约束表达式。为了便于看清楚,我省略了求解器相关的配置细节。
import pandas as pd import numpy as np def build_ies_scheduling(data, params): """ data: 包含电负荷、热负荷、光伏出力、风电出力预测的DataFrame params: 设备参数、电价、碳价、排放因子等的字典 返回值: model的约束和变量集合,实际使用时需要接入求解器 """ T = len(data) # 时段数,通常96 # 决策变量定义,以虚拟代码形式给出 # P_gt[t] 燃气轮机出力;P_gb[t] 燃气锅炉出力 # P_grid[t] 电网购电量;P_es_ch/P_es_dis 储能充放电 # z_gt[t] 燃气轮机启停状态(0/1) # E_carb[t] 碳捕集装置运行状态 # ============ 目标函数 ============ # 购气成本 obj_gas = sum(data['gas_price'].iloc[t] * (data['P_gt'].iloc[t] / params['gt_eff'] + data['P_gb'].iloc[t] / params['gb_eff']) for t in range(T)) # 电网购电成本 obj_grid = sum(data['elec_price'].iloc[t] * data['P_grid'].iloc[t] for t in range(T)) # 碳交易成本(阶梯碳价) # 这里简化为先算总排放,再按阶梯计价 E_total = sum( data['P_gt'].iloc[t] * params['gt_emission'] + data['P_gb'].iloc[t] * params['gb_emission'] + data['P_grid'].iloc[t] * params['grid_emission'] * 0.85 - data['P_ccs'].iloc[t] * params['ccs_capture_rate'] for t in range(T) ) e_alloc = params['daily_quota'] if E_total <= e_alloc: cost_carbon = 0 elif E_total <= 1.1 * e_alloc: cost_carbon = (E_total - e_alloc) * 70 else: cost_carbon = 0.1 * e_alloc * 70 + (E_total - 1.1 * e_alloc) * 100 # ============ 主要约束 ============ # 1. 电功率平衡(简化示意) for t in range(T): # P_gt + P_grid + P_pv + P_wind + P_es_dis # == P_load + P_es_ch + P_eb + P_p2g pass # 2. 热功率平衡(简化示意) for t in range(T): # 燃气轮机余热 + 燃气锅炉 + 电锅炉 + 储热罐放热 # == H_load + 储热罐蓄热 pass # 3. 燃气轮机爬坡约束与启停约束 # 4. 储能SOC递推约束 # 5. 碳捕集设备出力上下限 return {"objective": obj_gas + obj_grid, "E_total": E_total}这是一个高度精简的骨架,实际工程代码里每一类约束都会单独做函数封装,并且写入完整的中文注释。我不建议任何人直接拿这段代码去生产环境跑,但把它变成自己的模型框架是完全够用的。
4.4 两种运行模式的结果对比
为了验证低碳调度逻辑是否真的起作用,我做了两个对照组:第一个是纯经济调度,目标函数里完全不考虑碳排放和碳交易成本;第二个是低碳调度,即考虑阶梯碳价和碳排放配额约束。
在我的模拟园区里,纯经济调度下,燃气轮机几乎全天满发,因为天然气发电的综合成本低于高峰时段电网购电价格,电锅炉只在深谷电价时段蓄热。结果是日运行成本约9.8万元,碳排放总量约185吨。低碳调度下,价格信号发生了变化:高峰时段燃气轮机发电不仅要算气费,还要承担70元/吨甚至100元/吨的碳成本,边际成本倒挂,模型会让电网购电替代一部分气电,同时让储热罐在夜间谷电时段多蓄热,白天尽量少启动燃气锅炉。
结果很有意思:日运行成本上升到约10.8万元,直接成本增加了约10%,但碳排放总量降到了142吨,下降了约23%。如果把碳交易费用的净支出也加进去算综合成本,低碳调度的总代价反而比纯经济调度略低——因为纯经济调度模式下要超额购买清单外的高价配额,而低碳模式用一部分设备切换换来了更小的碳缺口。
这个对比说明一件事:低碳调度不是单纯"花钱买减排",它是把碳价这个信号嵌入到每一个设备出力的边际决策中,让系统在算经济账时自动把减排的账也顺带算了。我在给业主汇报时用这张对比表,直观展示了"少排的碳换回了更低的综合履约成本"这个结论。
5. 实操中绕不开的坑:数据、约束与收敛性
5.1 碳价数据的时间尺度和建模精度
碳排放数据有一个和电价数据很不一样的地方:电价是分时波动的,而碳价通常是日级、月级甚至更长时间尺度才变化一次。这导致一个建模上的尴尬:如果我们用碳价参与每个小时的设备出力决策,那么碳价在一天内是常数,它只会整体抬高或压低全天的排放成本,但无法引导"把碳排放从高峰时段挪到低谷时段"这种时序上的优化。
解决这个问题有两种思路。第一种是配合分时电网排放因子来做:虽然碳价是常数,但电网购电的排放因子是分时的,后半夜购电排放低、晚高峰购电排放高,模型会在总排放约束下自然把购电行为往排放低的时段挪。第二种是给碳配额设置"日内使用曲线",比如把日配额按照负荷高峰特性平均分配到每个时段,高峰时段配额紧张、低谷时段配额宽松,这样碳约束就具备了时序引导功能。第二种做法在工程上更贴合碳配额履约的考核节奏,但数据准备要更精细。
这里还有一个数据口径的坑:碳排放因子到底是"生产地口径"还是"消费地口径"。电网排放因子如果按全国平均算,和按当地实际电源结构算,差距能到30%以上。我在一个项目上遇到的情况是:当地测算的电网排放因子比区域平均值低15%,因为本地有较大比例的水电和核电。如果用全国平均因子,模型会低估"用气电替代电网购电"的减排价值,得出的调度方案就会偏向多开燃气轮机,反而和实际碳排放最优背道而驰。在项目开始时花半天时间把排放因子的口径和来源核实清楚,是整个调度项目里性价比最高的投入之一。
5.2 热力系统约束是IES的"照妖镜"
很多初次做IES调度的人,把精力全花在电力系统的各类约束上,等到跑出来的结果被热力工程师劈头盖脸地否定一遍才明白:热力系统的约束比电力系统麻烦得多。
首先,热力系统有很强的"慢动态"特性。电是光速传输的,但热在管道里流动是有热惯性的:供热管道里的水温从热源出口到用户末端需要几十分钟到一个小时,这个延迟让"日前24小时的热力平衡"变得不可靠——某个时段热源出力满足热负荷,不代表用户端真的感到了热,因为热量还在路上。模型如果不加热网传输延迟约束,调度结果就是"纸面平衡、实际失调"。
其次,热电联产机组的"以热定电"特性是IES建模的一大难点。燃气轮机带余热锅炉时,它的热出力一旦定了,电出力就被"绑架"在一个区间内。很多初版模型把汽轮机的电、热出力当成两个独立变量分别优化,结果算出来的方案在实际运行中根本执行不了。我在建模时用的是一个"电热运行域"的概念:把汽轮机的可行运行区域用一个四边形或梯形来表示,在区域内电、热出力才是同时可取的。这个运行域放进去以后,模型才能真正表达"热负荷高峰时,汽轮机被迫发很多电,多余的电要么存储、要么卖给电网"这种被迫的耦合行为。
另外,供热系统还带着舒适度约束。热负荷不是一条固定曲线,而是有一个舒适温度区间,比如室内温度在18到22摄氏度之间都算合格。这意味着热负荷本身是柔性的,可以参与调度。但要把这个柔性表达进模型,就必须引入建筑热动态模型,这会让模型规模再上一个台阶。我做过的项目里,只有供热面积特别大、热惯性特别强的区域才值得加这个复杂度,一般园区项目用固定热负荷曲线加蓄热罐就足够。
5.3 风光不确定性:场景削减做不好,模型全是空中楼阁
如果建了很精细的低碳调度模型,喂进去的光伏、风电预测数据却是"半吊子"的,那所有优化结果都很脆弱。这里所谓的"半吊子",指的是一份预测曲线里只有一个平均值,连误差条都没有。
我一开始做日前调度时,直接用了光伏预测软件给的一条单点预测曲线,结果调度方案在晴天时表现完美,一到多云天气就漏洞百出:光伏出力突然掉到预测值的50%,燃气轮机爬坡来不及,只能紧急从电网买高价电,碳排放也超标。后来我在模型里引入了预测区间:不只给一个"明天的光伏出力是100MW"的点值,还要给出50MW到150MW的区间。再把这个区间离散成若干个典型场景,给每个典型场景分配不同权重,优化目标变成"所有场景下的期望成本最小"。
场景太多求解会陷入维度灾难,我这里有一个很实用的做法:采用K均值聚类做场景削减。把历史数据聚类成二三十个典型场景,再为每个典型场景设置概率。原本需要几千个场景的模型,缩减到几十个之后求解时间可控,结果又比单点预测稳健得多。还有一个细节:聚类的时候要同时聚风光出力的联合场景,不要把光伏和风电各自单独聚类再拼起来,否则风光互补的相关性信息会丢失。
5.4 求解器报错的排查链路
最后讲一个非常实操的话题:求解器报错怎么办。MILP求解器给出的报错信息一向不够友好,很多时候就是一行"infeasible"(不可行),让人一头雾水。
我经过几次挫折以后,总结了一套排查链路,基本能解决九成的问题。第一步,检查数据单位是否一致。这个错误极其常见,比如某个参数从Excel取值是按兆瓦填的,但另一处代码里又按千瓦参与运算,差了一千倍,约束当然满足不了。我在建模之前有一个强制习惯:所有输入数据统一折算成标幺值或者统一单位,然后在模型里写一个数据校验模块,把所有变量数量级打印出来做肉眼检查。
第二步,用松弛法定位不可行约束。把模型中每一个约束逐条"放松",比如把电功率平衡约束改成"电功率不平衡量允许在一定范围内",然后看求解器是否变得可行。如果放松了某条约束后模型变成可行,那问题就锁定在这条约束对应的设备或物理关系上,再集中去查这条约束牵扯的数据和逻辑。
第三步,查看求解器的IIS(不可行子系统)报告。商用求解器一般都有这个功能,它能输出一个最小的不可行约束集合。我一直不太喜欢看这个报告,因为输出格式确实不友好,但事实证明确实有效;有一次我用IIS报告直接查出一个储热罐的SOC递推公式写反了蓄热方向,节省了一整天的排查时间。
还有一个和求解器无关、但问题特别多的环节:预测数据和调度程序的时间戳对齐。光伏预测软件用的是当地时间,而调度程序默认按UTC处理,结果预测数据偏了8个小时,白白让调度结果错了两天。这种低级错误,凡是跨过时区或者接过多套系统的人几乎都遇到过,我后来直接在数据入口加一个日期时间校验函数,凡是小时数对不上就报警,绝不进入求解环节。
6. 结果剖析与后续演进:低碳调度不是终点
6.1 低碳调度为什么能"省钱":数字背后的机理
在4.4小节的模拟园区里,低碳模式比经济模式直接成本增加了约10%,但扣除碳交易净支出后综合成本反而更低。这个看似反直觉的结果,背后其实是一个很清晰的经济逻辑:碳排放配额是有价格的,而且阶梯碳价让超排的边际成本越来越高。当碳价超过某个临界值后,用设备切换去减少碳排放,比直接购买排放配额更便宜。
这里的关键是搞清楚"哪个设备做切换"收益最大。在我们这个案例里,机组切换的主要对象是燃气轮机和电网购电。燃气轮机的度电成本约0.55元,电网高峰购电价约0.85元,看起来燃气轮机更划算;但如果加上碳排放成本,燃气轮机每度电要承担约0.14元的碳成本(按每度电排放0.45千克、碳价70元/吨折算),电网购电的高峰排放因子对应的碳成本只有约0.04元。这样一算,高峰时段电网购电的"总成本"反而低于燃气轮机发电。这个差额就是低碳调度模型发现的套利空间。
我还在结果里发现,低碳调度模式下储热罐的动作明显更积极。它在深谷电价时段大量蓄热,白天的热负荷高峰时段尽量让燃气锅炉和汽轮机少出力,用储热来顶上。表面上看储热的充放效率有损耗,但因为谷电本身便宜且排放因子低,这个"搬移"操作既减少了燃气消耗又降低了碳排放,两个维度都划得来。
这些结果虽然在理论上不复杂,但真要在工程上实现,必须把设备模型校准得足够精确。比如燃气轮机的效率曲线如果偏差了5%,碳成本的临界点计算就会差出一大截,设备切换的决策就会随之出错。所以我在项目里一直强调一个原则:先做设备实测与模型校准,再谈优化调度。
6.2 碳排放约束如何改变设备运行优先级
在纯经济调度模式下,IES设备的投运优先级完全由边际成本决定。以我的模拟园区为例,白天的优先级大致是:光伏、风电(边际成本为零)排在前面,然后是燃气轮机,最后才是高峰时段电网购电。但在低碳调度模式下,这个"队列"发生了两个明显的变化。
第一个变化是燃气轮机的地位下降了。原因前面已经分析过,碳排放让它的边际真实成本超过了电网购电。这个下降不是全局性的,而是时段性的:在电网排放因子高的高峰时段,燃气轮机的相对地位是下降的;但在夜间排放因子低的低谷时段,电网购电的碳排放优势反而体现不出来,燃气轮机又可能被重新排到前面。
第二个变化是储能设备的"身份"变了。在纯经济调度里,储能的主要功能是峰谷套利:低价充电、高价放电。在低碳调度里,储能多了一个"碳套利"的功能:在高排放因子的时段放电,替代高排放的机组出力,即使电价的峰谷差不足以覆盖充放电损耗,碳成本的节省也可能让它变成经济运行的选择。我在代码里专门增加了一个统计模块,用来拆解储能放电量里有多少是"电套利"驱动、多少是"碳套利"驱动,这个分析结果对项目业主特别有说服力。
碳排放约束还改变了系统的备用逻辑。传统调度会预留一定比例的旋转备用,用来应对预测偏差。低碳调度中,如果备用容量由燃气轮机承担,那这部分备用本身也会产生碳排放成本。因此,模型会倾向于优先调用储能、需求响应这类不产生额外碳排放的备用资源。换句话说,碳排放约束相当于给不同备用资源加上了不同的"备用价格",这会彻底改变备用容量的分配结构。
6.3 后续可以做的扩展方向,按投入产出比排个序
最后一个问题:这套低碳调度框架,后续往哪些方向扩展性价比最高?我根据自己的项目经验排了一个优先级清单。
排在第一位的,是接入更加精细的电网分时排放因子数据。现在不少地方已经能提供小时级的实时碳排放因子,如果调度系统能直接读取这个数据,模型就可以真正做到"实时碳感知",这是目前投入小、效果最大的升级方向。
排在第二位的,是在模型里加入需求响应和可调负荷。我早期做的IES模型都是把负荷当刚性边界,后来才发现热负荷和一部分工业电负荷是很有弹性的。如果把可调负荷纳入优化变量,系统在"减碳"和"省钱"之间的腾挪空间会大得多。这个方向需要协调用户侧的配合,工程上偏重管理机制的设计,技术难度反而适中,投入产出比相当高。
排在第三位的,是引入绿电交易和绿证机制。碳配额解决的是"化石能源用了多少",绿电交易解决的是"可再生能源用够不够"。这二者的政策账目在不少地区可以打通,比如购买绿电可以抵扣一部分碳排放核算。把绿电交易成本放进优化模型后,调度策略会进一步向加大绿电消纳倾斜。这个方向目前在个别省市已经有了比较成熟的市场规则,值得提前做技术储备。
排在第四位的,是碳排放流追踪和分析。现在的模型算的是"总排放量",但具体到每台设备、每个时段、每条能流的碳排放贡献并不清晰。如果做碳排放流追踪,把碳排放责任按能流分摊到各条线路和各个用户,就能实现碳排放的"责任归属"。这对园区内部做碳排放考核很有价值,不过数学模型比较复杂,工程落地周期较长,适合有研究力量支撑的团队去做。
我在实际项目里的一个体会是:低碳优化调度不能只停留在"算法能跑出结果"这个层面,更重要的是让每一个调度决策都能被解释、被复核。煤炭减少了几吨、排放降低了几百公斤、钱省在哪里,这些要能讲清楚。我写好一组调度结果以后,一定会做一张与设备实际运行曲线对比的复盘表,把模型建议的调度计划和现场实际执行的计划摆在一起,找出那些两个计划不一致的时段,再分析是模型参数不准还是现场操作偏离。这个"闭环复盘"的习惯,我强烈建议做IES调度的同行培养起来。
至于那些"通用大模型能否直接参与调度决策"的话题,目前我持谨慎乐观的态度。大模型可以做辅助分析和报告生成,但调度决策是要对安全责任负责的,每一套约束条件背后都关联着设备的物理极限和安全边界,至少要等可解释、可验证性成熟以后才能考虑。当下踏踏实实把模型层级挖得更深一些,把碳市场的机制理解得更透一点,比追逐新概念更有实际价值。