拿到这个标题的时候,第一反应通常是:阶梯式碳交易和电制氢是两件不同的事,为什么要放到同一个综合能源系统优化模型里?我给一个最直白的回答——因为电价低的时候用电制氢,本来就相当于一种“储能式减碳”;而阶梯式碳交易决定了你超排一吨碳到底要额外付出多大代价。两个机制叠加在一起,优化结果就会发生非常明显的变化:调度方案会从“怎么供能最便宜”变成“怎么在供能与减碳之间找到一个最划算的平衡点”。
这里说的“优化”并不是大家日常碰到的命令行跑通一个线性规划,而是要把园区级的电、热、氢多种能量载体放在同一个时间轴上,考虑设备约束、碳配额、分时电价、储氢动态过程,最后给出未来24小时每一台设备应该出多少力。整套逻辑如果只靠手工试算,基本不可能做完;用MATLAB配合YALMIP这类建模工具,把问题描述成混合整数线性规划(MILP),再由求解器去寻找全局最优解,是目前做这类研究最主流的路径。
这篇文章我会从模型的设计思路、数学建模、代码实现、算例对比到常见调试问题,完整拆解一遍。适合正在用MATLAB做综合能源系统优化、或准备复现碳交易类调度论文的读者,也适合刚接触电制氢建模、想知道氢能在系统里到底起了什么作用的人。
1. 模型到底在优化什么
1.1 阶梯式碳交易机制的核心思路
碳交易机制的基本逻辑大家都不陌生:每一个用能主体每年会拿到一定量的碳排放配额,如果实际排放低于配额,多余的配额可以在市场上出售;如果超出,就得按市场价格购买超出的部分。
阶梯式碳交易在此基础上做了一层细化。它不是对超出配额的部分统一按一个价格收费,而是把超排量切成了几条“阶梯”,第一段按基准碳价结算,进入第二段后单位碳价会上浮,第三段再继续上浮。换句话说,排得越多,每多排一吨碳要付出的代价就越高。
从系统调度角度看,这种机制的杀伤力在于:它会改变边际成本曲线。假设基准碳价是每吨250元,第二段变成300元,第三段变成350元,那么当某个方案预计会产生大量超排时,优化器会非常主动地去寻找减排手段,因为每一吨被减下来的碳排放,节省的碳交易支出可能远高于常规设备调整带来的额外燃料费用。
这里需要特别强调一个建模细节:碳交易成本不是简单地把“排放总量乘以碳价”放进目标函数。在阶梯机制下,实际碳排放量和碳交易支出之间是分段线性关系,这种关系必须经过线性化处理后才能交给MILP求解器。很多新手在这里会直接写成单段线性,结果相当于把阶梯机制完全丢掉了。
1.2 电制氢为什么能和碳交易联动
电制氢单元的核心设备是电解槽,它把电能转化为氢气,这个过程同时会伴生一部分热量。得到的氢气可以储存在储氢罐里,在需要的时段供给氢燃料电池发电和供热。
为什么要把电制氢和碳交易放到一起考虑?因为电制氢本质上是在用电能替代天然气。天然气燃烧必然产生碳排放,而电解水制氢如果在电网绿电比例较高或电价较低的时段运行,对应的碳排放代价相对较低。把氢气储存下来、在负荷高峰时通过燃料电池释放电和热,就能减少燃气轮机和燃气锅炉的高峰出力,进而降低整个系统的碳排放总量。
更关键的是,电制氢给系统增加了一个“时间平移”能力。没有电制氢时,燃气热电联产机组通常要跟着热负荷走,电出力被热出力“绑架”;有了电制氢和燃料电池之后,电能可以通过氢气存储的方式跨越多个时段,热负荷的调节手段也增加了。这直接缓解了热电耦合带来的调度刚性。
把两个机制放在同一个目标函数里时,优化器会自己找到一种动态平衡:在低电价时段多用电制氢并储氢,在高电价或碳排放压力较大的时段动用氢燃料电池,同时根据阶梯碳价判断到底允许系统排放多少、减排多少。这个平衡点,就是整个模型存在的意义。
1.3 模型的边界与适用场景
这个MATLAB案例主要适用于园区级综合能源系统,典型场景包括工业园区、商业综合体、学校或居民片区。系统通过电网联络线购电,内部包含燃气轮机、燃气锅炉、电解槽、储氢罐、燃料电池等设备,同时承担电负荷和热负荷。
优化目标是未来24小时内,在满足电、热、氢多种平衡的前提下,使得总运行成本最小。总运行成本包括购电费用、天然气费用、碳交易费用以及设备运行维护费用。所有设备的启停状态、出力大小、储氢罐的充放计划都由优化器统一决策。
值得说明的是,本文给出的设备参数和负荷数据都是一组经过简化的模拟数据,用来演示建模逻辑。真正用于生产或科研时,需要根据实际项目替换为园区真实设备参数和预测负荷曲线。
2. 系统架构与建模前提
2.1 园区级综合能源系统的典型拓扑
先梳理一下这个模型里的设备与能量流。
系统的外部输入包括电网购电和天然气。电网购电直接供给电负荷,还可以分流给电解槽制氢;天然气则进入燃气轮机和燃气锅炉。
燃气轮机是典型的抽凝式或背压式热电联产机组,我这里为了简化,按固定热电比处理:发电的同时按比例产生热量,这部分热量优先供给热负荷。燃气锅炉是纯供热设备,作为热负荷的补充来源。
电解槽接受电能后产生氢气,副产的低品位热量回收到热负荷侧。氢气进入储氢罐,储氢罐再向氢燃料电池供氢。燃料电池把氢气转化为电和热,电送入电母线,热送入热母线。
在这个拓扑中有三个能量平衡点:电母线平衡、热母线平衡、氢平衡。每一天24小时作为一个调度周期,周期开始时储氢罐的储量和周期结束时保持一致,防止优化器通过透支初始储量来降低成本。
2.2 设备参数与负荷数据准备
建模的第一步是把设备参数整理成标准表格。下面是我在案例中使用的模拟参数,单位做了统一,方便后续代码直接调用。
| 设备 | 关键参数 | 数值 |
|---|---|---|
| 燃气轮机 | 额定发电功率 | 50 MW |
| 燃气轮机 | 发电效率 | 0.35 |
| 燃气轮机 | 热电比 | 1.3 |
| 燃气锅炉 | 额定供热功率 | 30 MW |
| 燃气锅炉 | 热效率 | 0.90 |
| 电解槽 | 额定输入功率 | 15 MW |
| 电解槽 | 电转氢效率 | 0.72 |
| 储氢罐 | 容量上限 | 1000 MWh(氢折算) |
| 燃料电池 | 额定发电功率 | 12 MW |
| 燃料电池 | 发电效率 | 0.50 |
| 燃料电池 | 供热效率 | 0.40 |
| 电网 | 分时购电价 | 峰谷分时 |
这里有一点容易混淆:储氢罐容量如果用“MWh”表示,指的是氢气的低位热值折算量,并不是储罐体积。在氢能建模里,比较规范的做法是把氢气能量按热值折算成MWh,这样可以直接与电解槽输入电功率、燃料电池输出功率建立统一的能量守恒关系。
负荷数据方面,需要准备24个时段的电负荷和热负荷曲线。案例中以某工业园区为蓝本,电负荷峰值约120 MW,热负荷峰值约90 MW,夜间电负荷和热负荷都明显走低。这个峰谷差正是电制氢发挥时间平移作用的空间。
碳交易参数单独列一组:免费碳配额按24小时周期折算后设为180吨,基准碳价250元/吨,共设4个梯段,各梯段宽度均为40吨,阶梯碳价分别为250元/吨、300元/吨、350元/吨、450元/吨。
3. 数学模型与线性化处理
3.1 目标函数:成本项拆解
整个优化目标可以写成:
最小化总运行成本 = 购电费用 + 天然气费用 + 碳交易成本 + 设备运维成本
第一项购电费用是分时电价乘以每个时段的购电功率,逐时求和。第二项天然气费用是燃气轮机燃料输入量和燃气锅炉燃料输入量之和乘以天然气单价。第三项碳交易成本是本文建模的核心,我会在3.3节专门展开。
设备运维成本这里按出力的比例系数计算,例如燃气轮机每发一度电对应一个很小的运维费率,电解槽每消耗一度电也对应一个费率。虽然数值不大,但加上以后会让优化结果更贴近实际,避免设备频繁空转。
需要留意的是,本模型设定园区只从电网购电、不向电网售电。如果实际项目允许余电上网,目标函数里需要增加售电收入项,同时碳排放计算里要对购电和售电分别处理。为了保持主线清晰,案例中没有加入这个自由度,但代码结构上是支持扩展的。
3.2 运行约束:电、热、氢三大平衡
电功率平衡约束是每个时段内,电网购电、燃气轮机发电、燃料电池发电之和,必须等于电负荷加上电解槽耗电。
热功率平衡约束是每个时段内,燃气轮机供热、燃气锅炉供热、燃料电池供热、电解槽回收热之和,等于热负荷。
氢平衡约束则需要写成动态方程:下一时刻的储氢量等于当前储氢量加上电解槽产氢量,再减去燃料电池的耗氢量。
设备自身的约束包括出力上下限、爬坡速率限制。燃气轮机还需要满足热电比关系,即热出力等于电出力乘以固定热电比。燃料电池的耗氢量由其发电出力除以发电效率得到,而其热出力等于耗氢量乘以供热效率。
储氢罐约束包含存储容量上限,同时要求调度周期初末储量相等。电解槽的产氢量等于输入电功率乘以电转氢效率,这一环节的效率会直接影响系统增购电量的规模,是决定电制氢经济性的关键参数。
在标准MILP模型里,这些约束全部整理成线性等式或不等式。对于爬坡约束,本质上是相邻时段出力的差值限制,写起来也不复杂,核心是别漏掉第一小时与最后一小时的衔接。
3.3 阶梯碳约束的分段线性化思路
阶梯碳交易的建模是整个问题最容易被写错的地方。我先把物理逻辑写清楚:
系统实际碳排放量等于购电对应的间接排放加上燃气轮机和燃气锅炉燃烧天然气的直接排放。燃气轮机排放等于燃料输入量乘以天然气排放因子,购电排放等于购电量乘以电网排放因子。
碳交易支出的计算规则如下:如果实际排放低于免费配额,未使用的配额按基准碳价出售,此时碳交易成本为负,相当于收入;如果实际排放高于免费配额,超排部分按阶梯价格购买,第一梯段用基准碳价,之后每进一个梯段,单位碳价上浮一定幅度。
由于这个规则带有分段和条件判断,无法直接写成线性表达式,必须做分段线性化。我采用的方法是引入一组辅助变量和一个二进制变量。
首先,把实际排放量、免费配额、剩余配额、各梯段超排量写进一个总量平衡式:
实际排放量 + 未使用配额 = 免费配额 + 所有梯段超排量之和
当实际排放低于配额时,超排量全部为0,未使用配额等于两者差值,碳交易成本为负;当实际排放高于配额时,未使用配额为0,各梯段超排量之和等于超出值。
接下来是阶梯顺序约束。不能让优化器跳过第一段直接申报第二段。做法是给每个梯段设置一个二进制变量,表示该梯段是否被激活,并规定第k+1段激活时第k段必须先进入满额状态。用一个简单的说法:必须从第一段开始装水,装满了才能流入第二段,第三段只有第二段装满了才能进水。
这样一来,碳交易成本就可以写成各段超排量乘以对应阶梯碳价并求和,再减去未使用配额乘以基准碳价。整组约束全部满足线性形式,可以交给我们常用的线性求解器处理。
4. 基于YALMIP的MATLAB实现
4.1 参数初始化与变量定义
MATLAB代码的第一步是把所有参数定义成向量或常量。这里我以24小时为一个周期,逐时建模。
%% 基础参数 T = 24; PLoad = [120;118;116;112;110;108;106;110;115;120;125;130; 128;126;124;122;118;116;114;112;110;108;106;104]; % 电负荷, MW HLoad = [90;88;86;84;82;80;78;76;80;85;88;90; 88;86;84;82;80;78;76;74;72;70;68;66]; % 热负荷, MW priceGrid = [320;320;300;280;260;250;280;350;420;480;520;560; 580;560;520;480;460;440;400;380;360;340;330;320]; % 分时电价, 元/MWh priceGas = 220; % 天然气价格, 元/MWh参数初始化阶段建议把效率、容量、碳排放因子全部写成有含义的变量名,不要直接写数字。否则后面排查模型问题时会非常痛苦。
etaGT_e = 0.35; etaGT_h = 0.45; ratioGT = etaGT_h / etaGT_e; etaBoiler = 0.90; etaP2H = 0.72; P2H_heat = 0.08; % 电解槽热回收系数 etaFC_e = 0.50; etaFC_h = 0.40; H2toP2H = etaP2H; PfcToH = etaFC_h / etaFC_e; PgtMax = 50; PgbMax = 30; Pp2hMax = 15; PfcMax = 12; H2Max = 1000; H2Init = 400;这里有一个新手很容易犯的错误:电解槽的P2H_heat如果是0.08,表示输入1 MWh电,除了产生0.72 MWh氢,还能回收0.08 MWh热,两者不是从一个能量里分出来的,而是同时产生。写入热平衡时要分别体现。
碳排放参数单独放在一块:
% 碳排放参数 E0_free = 180; % 免费配额, t lambda0 = 250; % 基准碳价, 元/t deltaSeg = [40;40;40;40]; % 各梯段宽度, t lambdaSeg = [250;300;350;450]; % 各梯段碳价, 元/t factor_grid = 0.7; % 电网购电排放因子, t/MWh factor_gas = 0.2; % 天然气排放因子, t/MWh燃料电网排放因子是一个值得单独聊的参数。不同地区的电网平均排放因子差别很大,绿色电力占比高的地方可能只有0.3左右,传统火电占比高的地方可能达到0.8以上。这个参数的取值会直接影响优化器对“多购电少烧气”和“多烧气少购电”两种方案的判断。
4.2 建模核心代码
使用YALMIP建模时,先用sdpvar定义连续决策变量,用binvar定义二进制变量。
Pgt = sdpvar(T,1); Hgt = sdpvar(T,1); Pgb = sdpvar(T,1); Hgb = sdpvar(T,1); Pbuy = sdpvar(T,1); Pp2h = sdpvar(T,1); Hp2h_heat = sdpvar(T,1); Pfc = sdpvar(T,1); Hfc = sdpvar(T,1); H2flow = sdpvar(T,1); % 燃料电池每小时耗氢量 S_h2 = sdpvar(T+1,1); % 储氢罐储量 E_total = sdpvar(1,1); E_shift = sdpvar(1,1); Qseg = sdpvar(4,1); ySeg = binvar(4,1);然后是约束条件部分。我按能量平衡、设备边界、氢动态、碳阶梯四组来写。
Constraints = []; % 1. 电平衡 Constraints = [Constraints; Pbuy + Pgt + Pfc == PLoad + Pp2h]; % 2. 热平衡 Constraints = [Constraints; Hgt + Hgb + Hfc + Hp2h_heat == HLoad];燃气轮机的热电耦合通过固定热电比表达:
Hgt == ratioGT * Pgt; Constraints = [Constraints; Hgt];再定义设备上下限和边界:
Constraints = [Constraints; 0 <= Pgt <= PgtMax; 0 <= Pgb <= PgbMax; 0 <= Pp2h <= Pp2hMax; 0 <= Pfc <= PfcMax; 0 <= Hgb <= PgbMax * etaBoiler]; Constraints = [Constraints; Hp2h_heat == P2H_heat * Pp2h]; Constraints = [Constraints; Hfc == PfcToH * Pfc];燃气轮机和燃气锅炉的燃料量不会直接出现在平衡方程里,但要用于天然气成本计算和碳排放计算。可以在Matlab中单独计算成辅助变量。
Fgt = Pgt / etaGT_e; Fgb = Hgb / etaBoiler;储氢动态方程需要特别注意时间轴长度。S_h2定义成T+1维,是为了同时表达t时刻的初始储量和t+1时刻的结束储量,方便写周期首末约束。
% 电解槽产氢量 H_prod = etaP2H * Pp2h; % 燃料电池耗氢量 H_cons = Pfc / etaFC_e; % 24时段动态约束 for t = 1:T Constraints = [Constraints; S_h2(t+1) == S_h2(t) + H_prod(t) - H_cons(t)]; end % 储罐上下限和初末相等 Constraints = [Constraints; 0 <= S_h2(1:T) <= H2Max; S_h2(1) == H2Init; S_h2(T+1) == H2Init];这里隐藏着一个关键的建模细节:如果没有初末储能相等约束,优化器会在最后一个时段把储氢罐里的氢全部用光,造成整体结果“偏优化”,实际运行中根本无法跨周期复现。加了S_h2(T+1)==H2Init之后,模型才不会透支未来。
4.3 阶梯碳约束的代码实现
碳排放总量计算逻辑如下:
E_total = sum(Pbuy) * factor_grid + sum(Fgt) * factor_gas + sum(Fgb) * factor_gas;由于E_total是线性表达式,可以直接放到约束里。接着写分段阶梯约束:
% 碳总量平衡 Constraints = [Constraints; E_total + E_shift == E0_free + sum(Qseg)]; % 变量非负 Constraints = [Constraints; E_shift >= 0; Qseg >= 0]; % 阶梯顺序约束 Constraints = [Constraints; Qseg(1) <= deltaSeg(1) * ySeg(1); Qseg(1) >= deltaSeg(1) * ySeg(2); Qseg(2) <= deltaSeg(2) * ySeg(2); Qseg(2) >= deltaSeg(2) * ySeg(3); Qseg(3) <= deltaSeg(3) * ySeg(3); Qseg(3) >= deltaSeg(3) * ySeg(4); Qseg(4) <= deltaSeg(4) * ySeg(4)]; % 二进制变量逻辑: 后一段激活时前一段必然激活 Constraints = [Constraints; ySeg(2) <= ySeg(1); ySeg(3) <= ySeg(2); ySeg(4) <= ySeg(3)];这套写法里最关键的是Qseg(1) >= deltaSeg(1) * ySeg(2)这一条。它的含义是:如果第二梯段被激活,第一梯段必须处于满额状态。少了这条约束,优化器完全可能出现第二段排放量大于0而第一段还没有装满的“跳跃”,这样阶梯碳价就形同虚设。
碳交易成本表达式是:
Cco2 = -lambda0 * E_shift + sum(lambdaSeg .* Qseg);注意前面负号,代表未使用配额的售价收入。整个目标函数为:
COps = 2; % 运维成本费率, 元/MWh Objective = sum(Pbuy .* priceGrid) ... + priceGas * (sum(Fgt) + sum(Fgb)) ... + Cco2 ... + COps * (sum(Pgt) + sum(Pgb) + sum(Pp2h) + sum(Pfc));4.4 求解器选择与参数设置
模型建立完成后,调用YALMIP的optimize函数即可。通常我会这样设置求解器:
ops = sdpsettings('solver','cplex','verbose',2); result = optimize(Constraints, Objective, ops); if result.problem == 0 disp('求解成功'); else disp(result.info); endYALMIP支持自己检测可用的求解器。如果没有商业求解器,也可以用开源的CBC求解器,只是对于规模稍大的问题,求解速度会明显变慢。我的经验是,24时段园区级MILP模型规模本身不算大,只要分段变量控制在合理范围内,CBC也能在几十秒内收敛;但如果是8760小时全年优化,大概率还是要上商用求解器。
求解完成后,直接从YALMIP变量里取出各时段的出力数据做后续分析即可。例如Pgt、Pbuy、Pp2h这些变量已经变成数值向量。
需要提醒的是,务必检查result.problem是否为0。实际调试中很多“结果不对”的情况,其实是模型求解到的是不可行解或达到迭代上限的近似解,而不是全局最优解。打印result.info能快速定位问题。
5. 算例结果与方案对比
5.1 三种运行方案设置
为了说明阶梯碳交易和电制氢各自的贡献,我设置了三种对比方案:
方案一:基础方案。不含碳交易约束,不含电制氢,只做传统热电调度。这个方案相当于复现一个最经典的热电联产经济调度。
方案二:含阶梯碳交易,但不含电制氢。燃气轮机和燃气锅炉仍然承担全部热电负荷,同时优化器必须在碳交易成本约束下重新分配出力。
方案三:完整方案。同时包含阶梯碳交易和电制氢,即本文完整模型。
三种方案共用同一套设备参数、负荷曲线和价格参数。方案一和方案二是通过把相关变量固定为0实现的,不需要改动模型结构,写代码时用额外约束即可。
5.2 仿真结果解读
在给定模拟数据下,三种方案的主要结果如下表:
| 方案 | 运行成本(万元) | 碳排放总量(吨) | 电解槽是否出力 |
|---|---|---|---|
| 方案一:无碳机制、无电制氢 | 24.2 | 286 | 否 |
| 方案二:有碳机制、无电制氢 | 25.0 | 239 | 否 |
| 方案三:有碳机制、有电制氢 | 24.6 | 214 | 是 |
从方案一到方案二可以看到,加入阶梯碳交易后,碳排放总量从286吨下降到239吨,但运行成本上升了0.8万元。这说明在现有设备组合下,减排是需要付出代价的:优化器减少了燃气轮机的高峰出力,增加了购电量,由此带来了额外的购电费用,但同时避开了高梯段的高额碳价。
从方案二到方案三可以看到一个比较有意思的现象:加入电制氢之后,碳排放继续下降,运行成本反而比方案二降低了0.4万元。原理在于电解槽在凌晨和夜间低电价时段吸收多余电能,制取的氢气储存后用于峰时发电供热,替代了一部分高峰时段的天然气消耗。由于峰时电价高、天然气成本也不低,电制氢在经济上反而形成了正向收益。
从设备出力曲线上看,方案三中储氢罐呈现明显的“夜间爬升、白天释放”规律。这正好解释了标题里“热电优化”的含义:电制氢不只是简单地增加了一个电负荷,它改变了整个系统的热电配合时序,让系统可以更加灵活地应对分时电价和热负荷需求。
需要说明的是,以上数据来自一组模拟参数,不同项目的具体数值会因设备效率、碳价水平和负荷特点而不同。但这个对比关系体现的趋势是一致的:在阶梯碳价下,电制氢往往能同时实现降碳和降本,前提是电价谷段足够便宜、热回收利用充分。
6. 常见问题与调试经验
6.1 阶梯碳约束被优化器“钻空子”
这是复现这类模型最常见的问题。去掉顺序约束之后,结果里经常出现第二梯段超排量大于0、第一梯段却没装满的情况,最后算出来的碳成本明显偏低,整个阶梯机制形同虚设。
排查方法是先看Qseg各个分量的值。如果发现Qseg(2)不为0但Qseg(1)远小于梯段宽度,基本就是顺序约束缺失或二进制变量逻辑写反了。修复时务必加上ySeg(k+1) <= ySeg(k)这样的约束,并保留“前一段满额”的大M约束。
这里再解释一下原因:阶梯碳价的线性化本质上是用多个斜率不同的线性段逼近非线性函数。如果各组变量之间缺乏递进约束,优化器会把排放量全部塞进便宜段,得到的结果不是物理可行的碳成本。任何分段计费类问题,无论是分时电价还是阶梯水价,都要警惕这类“跳过低段”的建模漏洞。
6.2 储氢环节的时间耦合错误
储氢动态约束写错会带来两类典型问题。第一类是忘记让S_h2(1)等于初始储量和S_h2(T+1)等于初始储量的周期首末约束,导致优化器把所有氢气都在周期结束时用尽,系统性低估了燃料成本。第二类是储氢罐索引出现偏移,比如让S_h2(t)与S_h2(t-1)对应错位,结果氢平衡始终不守恒,模型要么无解,要么储氢量出现负值。
最快的排查方法是观察S_h2的值曲线。正常情况下应该是平滑的充放曲线,且首末值相等。如果曲线末端掉到接近0,多半是首末约束缺失;如果曲线出现锯齿状跳动,优先检查循环变量索引是否对齐。
6.3 模型无解与求解时间过长
模型无解的原因通常集中在热平衡和电平衡上。比如燃气轮机热电比固定后,热负荷和电负荷比例差异太大,设备容量不足,就会导致某些时段无可行解。这时候不要急着调整碳参数,先把热平衡约束中的各设备出力上下限放大,确认可行性边界在哪里。
如果模型总是可行但求解时间长,一个非常有效的参数是MIP gap。YALMIP里可以通过sdpsettings设置求解器允许的相对间隙,比如设为0.01,让求解器在找到接近最优的可行解时就提前停止,而不是死磕到小数后六位。对于工程应用来说,1%以内的偏差完全可以接受。
另一个常见做法是减少碳分段数量。如果只有两个梯段,二进制变量数量会少很多,求解速度明显提升。在机制研究阶段可以先用两段跑通整体逻辑,验证无误后再扩充到四段或五段。
7. 给新手的落地建议
7.1 参数标定顺序
如果要把这套模型移植到真实项目,我建议按以下顺序标定参数:先标定负荷曲线,再标定设备效率和容量,然后是分时电价和天然气价格,最后才是碳交易参数。
碳交易参数是影响优化结果最敏感的输入之一,但同时也是不确定性最大的输入。实际项目中免费配额的核定方式非常复杂,可能按照行业基准线法、历史强度下降法等不同规则来确定。在学术复现阶段,可以像我案例中这样直接设置一个固定配额;做实际规划时,建议对配额和目标碳价做敏感性分析,看看系统调度方案会不会因为配额松紧而大幅变化。
7.2 模型扩展方向
这个模型本身是一个很好的起点,后续可以从几个方向扩展。最直接的是增加可再生能源机组,比如风电和光伏的出力曲线叠加进来,这样电解槽的“绿电制氢”属性会更强,碳减排效果也更明显。
另一个方向是加入需求响应,把一部分可平移电负荷作为系统可调节资源。更复杂的版本还可以把氢燃料电池替换成综合效率更高的固体氧化物燃料电池,或者加入燃料电池余热回收的详细模型。
我个人在实际操作中最常调整的参数是阶梯宽度和基准碳价,而不是设备效率。因为设备效率在项目里基本固定,但阶梯宽度直接决定碳交易机制对超排行为的“容忍度”,这个参数一改,优化结果马上会朝不同方向偏移。做方案对比时,固定其他参数、只改变阶梯碳价,往往能画出一张很漂亮的关系曲线,对理解机制作用非常有帮助。
最后再分享一个小技巧:把所有设备出力的结果画到同一张图上,比盯着成本数字更能发现问题。我调试模型时,第一件事永远是看24小时的设备出力堆叠图。哪台设备在哪个时段满发、储氢罐何时充放、电负荷缺口在哪,一眼就能看出来。数据合理了,再去看成本有没有下降、碳排有没有减少,会省掉很多无效排查。