☰
阶梯碳交易与电制氢协同的综合能源系统热电优化MATLAB实现
2026/10/21 16:33:45 网站建设 项目流程

做综合能源系统优化调度的人,这两年应该都被“阶梯式碳交易”和“电制氢”这两个思路刷过屏。前者把碳成本从一条直线变成了分段递增的曲线,后者把电、热、气三种能量形态在同一个系统里打通了。但真要把二者一起塞进一个热电联合优化模型,用MATLAB写出来还能稳定求解,里面值得抠的细节其实不少。我最近正好把一套园区级综合能源系统的调度模型完整跑通了,场景包含风电、光伏、燃气轮机、电锅炉、储能、蓄热罐,外加一套电制氢装置,目标函数里同时计及阶梯式碳交易成本。这篇文章就把这个MATLAB案例从头到尾拆开讲一遍——模型怎么搭、约束怎么列、代码怎么写、结果怎么读,一条线走通,适合正在做综合能源调度、微电网优化,以及刚开始碰YALMIP建模的同学参考。

1. 项目整体设计与思路拆解

1.1 综合能源系统拓扑与设备选型

这个项目里的系统拓扑是一个比较典型的园区级综合能源系统,我用的是“并网型”结构:园区可以从上级电网买电,也可以把多余电量卖回去;天然气管网负责给燃气轮机和燃气锅炉供气;新能源侧装了一套600 kW的光伏和一套400 kW的风机;可控电源侧主要的供能设备是燃气轮机和余热锅炉组成的CHP单元,额定电出力500 kW、热出力550 kW;补热设备是一台600 kW燃气锅炉和一台300 kW电锅炉。储能侧配了200 kW/400 kWh的电池储能,以及一套800 kWh的蓄热罐。电制氢部分则是一台200 kW电解槽、一个50 kg储氢罐,再加一台100 kW氢燃料电池。

设备选型的时候我刻意保留了“两条热源、两条电源、两条储能”的冗余结构,目的不是为了好看,而是要让优化器有真正的决策空间。如果系统里只有一台燃气锅炉供热,那“热电优化”基本就是死的,模型怎么建都差不多;但只要把CHP、电锅炉、燃气锅炉、蓄热罐放在一起,燃气轮机到底是“以电定热”还是“以热定电”,电解槽到底在哪个时段开机,储能到底用来套利还是配合新能源消纳,这些才真正变成值得求解的问题。调度的优化空间,本质上就来自设备组合冗余带来的自由度。

电制氢装置在这一套拓扑里的位置很有意思。它既可以作为“电负荷”消纳低谷风电和光伏,又可以作为“电-热-气”的转折点:电解槽产出的氢气存进储氢罐,再在需要的时候通过燃料电池重新发电和放热。这一下子就让整个系统从“电热耦合”升级成“电热气耦合”,氢气就是中间媒介。

1.2 三个关键要素的逻辑闭环

这个项目的标题里其实藏了一条完整的技术链路:阶梯式碳机制负责给系统碳排放一个非线性的价格信号,电制氢负责提供消纳波动性新能源和灵活调节的物理手段,热电优化则是把这两者统一在一个调度框架里求最优解。

先从碳机制说起。碳排放成本不是固定单价,而是分阶梯递增的,排得越多,边际成本越高。这个机制的本质是对“碳排放空间”这种稀缺资源做分段定价,引导系统自动压低高碳机组的出力。在模型里,它通过分段线性函数进入目标函数,直接改变各个供能设备的相对经济性。比如燃气轮机和燃气锅炉的用气量一旦超过免费配额,碳成本就会明显抬高,这时候电锅炉、电解槽这类用电设备的竞争力反而会上升。

电制氢则是从物理侧提供“弹性”。风电、光伏大发的时候,如果电网接纳不了、储能也充满了,剩余电量只能弃掉。电解槽相当于一个可调节的超级大负荷,能把这些原本要丢弃的电变成氢气储存起来,等到晚高峰再通过燃料电池放电、放热。这样一来,新能源消纳率上去了,系统对燃气机组的依赖降下来了,碳排放也跟着降下去,和碳机制形成了正向配合。

热电优化就是把这些因素全部放进一个目标函数里做整体寻优。它不是单纯的“经济调度”,也不是单纯的“低碳调度”,而是在电价、气价、碳价三重价格信号下,寻找下一个调度周期内各设备的最优出力组合。从数学上看,这是一个混合整数线性规划问题;从工程上看,它回答的是“每个时段谁该开机、谁该停机、谁该多发、谁该少发”的完整执行表。

1.3 为什么采用阶梯式碳交易而非固定碳价

我在做项目初期其实只写了一个固定碳价模型,也就是每吨碳排放乘一个常数碳价。模型跑起来很顺,但看结果总觉得缺了点什么:固定碳价下,系统只要把碳排放总量降到一个点,再往下减排的经济激励就变弱了,因为边际成本不变,很多“已经足够好”的调度方案在不高的碳价下根本不会主动进一步优化。

换成阶梯式碳价之后,情况明显不一样。碳价不是一个常数,而是按排放区间递增的:排放量落在第一个阶梯内,碳价是基础价格;超出部分进入第二个阶梯,碳价翻倍;再超出的话,第三个阶梯继续往上抬。这意味着机组排得越多,边际减排压力越大。燃气轮机如果想多发电,就必须额外承担高阶梯碳价带来的成本压力,相比于固定碳价,这个模型对高碳出力的“压制”是渐进且显著的。

从数学建模角度,阶梯式碳成本是个凸的分段线性函数(关键前提是每个阶梯的单价递增,如果递减就不凸了),这个性质非常重要。凸的分段线性函数可以用一组二进制变量加辅助变量线性化,直接被商业求解器有效求解;如果设计成递增更复杂,MILP也照样能处理,只是要多加约束。相比固定碳价,阶梯模型增加了少量的整数变量和辅助约束,但换来的是更贴近真实市场机制的调度结果,这个代价我认为非常划算。

2. 数学模型的核心理念与关键约束

2.1 目标函数的构成与权衡

模型的目标函数是把一个调度周期内的总运行成本降到最低,调度周期取典型日24小时,时间步长1小时。总成本包含六块:从上级电网购电的费用、购买天然气的费用、各设备运维成本、阶梯碳交易成本、弃风弃光惩罚费用,再扣除上网卖电的收益。

写成数学形式是:

$$\min F = \sum_{t=1}^{24} \left[ C_{buy,t}P_{buy,t} - C_{sell,t}P_{sell,t} + C_{gas}(F_{CHP,t}+F_{GB,t}) + \sum_i C_{om,i}P_{i,t} + C_{carbon,t} + C_{pun,t} \right]$$

这里有几处很容易踩坑的地方,需要先说清楚。第一个是购电和售电不能同时发生,所以要么给这两个变量配一个二进制变量做互斥约束,要么通过模型参数保证售电价始终低于购电价来隐式避免。第二种做法更简单,工程上也更稳,大部分分时电价结构天然满足这一点。

第二个是弃风弃光惩罚项必须加。如果不加惩罚,优化器没有任何动力去消纳新能源,它完全可以堂而皇之地弃掉所有多余风电光伏,反正不影响成本,问题是这样一个模型结论就成了“电制氢没有价值”,解释起来会很尴尬。我在项目里把弃风弃光的惩罚系数设为售电电价的两倍左右,确保优化器只有在储能充满、电制氢到上限之后才会选择弃电。

第三个是运维成本不能省略。许多初学者喜欢把所有设备综合效率算得很粗糙,但实际调度的最优解对设备启停方式非常敏感,尤其是燃料电池这种单位运维成本较高的设备,如果运维成本没纳入目标函数,模型会倾向于让燃料电池满发,这显然不符合工程实际。

2.2 阶梯式碳交易成本建模

阶梯碳交易是模型里最需要精心处理的部分,也是和一般碳约束模型拉开差距的地方。建模第一步,先算系统实际碳排放总量。并网型系统的排放来源有三块:燃气轮机燃烧天然气产生的排放、燃气锅炉燃烧天然气产生的排放,以及外购电力对应的间接排放。外购电力的排放因子我这里取0.997 kg CO₂/kWh,天然气排放因子按热值折算后取0.22 kg CO₂/kWh(实际项目中可以按当地燃气组分调整)。

系统总排放量:

$$E_{total} = \sum_t \left[ \mu_{grid} P_{buy,t} + \mu_{gas} (F_{CHP,t} + F_{GB,t}) \right]$$

第二步是碳排放配额分配。我采用按机组容量分配免费配额的方式,每个排放源都有一个免费配额比例为σ的额度,燃气轮机、燃气锅炉、购电三个排放源分别核算免费配额并累加得到总配额。实际排放量和免费配额的差值就叫“实际需要购买的碳排放权配额”。差值小于零说明系统配额富余,可以把多余的配额放到市场卖掉获得收益;差值大于零就需要花钱购买。

第三步是阶梯定价。把超出配额的部分分成三段,第一段的基础碳价设为λ,第二段价格为λ乘以递增系数α₁,第三段为λ乘以α₂,其中α₂>α₁>1。在一个分段函数里,购买碳配额总成本写成:

$$C_{carbon} = \lambda d_1 + \alpha_1 \lambda d_2 + \alpha_2 \lambda d_3$$

其中 $d_1+d_2+d_3 = \max(0, E_{total} - E_{quota})$,且 $0 \le d_1 \le L_1$、$0 \le d_2 \le L_2$、$0 \le d_3$。

这里有一个建模细节非常重要:这三个辅助变量不能只加一个等式约束,否则优化器会在三段之间进行套利,让数量分配和阶梯顺序完全对不上。必须加上“第1段优先填满、第2段才能使用”的逻辑约束,这通常要用二进制变量来控制,或者利用目标函数天然递增的性质。因为我们模型里各阶梯碳价均递增,而目标函数是最小化成本,所以优化器一定会优先使用便宜的$d_1$,再去使用$d_2$和$d_3$,不需要额外添加顺序约束。但前提是每个阶梯的边际价格严格递增,如果你把阶梯价格设置成递减,模型会彻底跑歪。这个点我后面在调试经验里会再强调。

2.3 电制氢子系统的设备建模

电制氢子系统是我这个项目里设备种类最少、但关系最微妙的环节,包含电解槽、储氢罐和氢燃料电池三块。电解槽建模相对简单,本质上是一个可调的电力负荷,输入电功率,输出氢气质量流量。这里不需要精确到电化学层面,用工程化的效率模型就够了:

$$m_{H2,t}^{out} = \frac{\eta_{elz} P_{elz,t}}{LHV_{H2}}$$

其中氢气的低热值取33.33 kWh/kg,电解槽综合效率η_elz取65%。P_elz有上界和下界运行为0或额定功率区间$[0, 200]$ kW。注意很多论文里会把电解槽最低运行功率设成一个正的小值,这是因为电解槽在低功率下运行效率差,实际工程中一般不推荐长期低负荷运行,但在调度模型里为了方便,我把它简化为可0到200 kW连续调节。

储氢罐就是简单的能量累积约束,类似电池的SOC模型。用$S_{H2,t}$表示第t小时末的储氢量,满足:

$$S_{H2,t+1} = S_{H2,t} + m_{H2,t}^{out} - m_{FC,t}^{in}$$

储氢罐容量50 kg,初始储氢量设为满储的50%。为了避免S形循环套利,调度周期末尾还要加一个约束让储氢量和初始值相等或接近,否则模型会把所有氢气排空来优化最后时段的成本,但实际运行里储氢罐不可能天天排空。

燃料电池的模型是放能侧:消耗氢气,同时产生电力和热量。电出力公式:

$$P_{FC,t} = \eta_{FC,e} \cdot \frac{m_{FC,t}^{in} LHV_{H2}}{3.6}$$

这里注意单位换算,氢气质量kg乘能量密度kWh/kg算出来的单位是kWh,而功率是kW,需要除以时长或做纲量统一。在1小时调度的离散模型里,每小时消耗的氢气质量对应这1小时的平均功率,所以上述公式把kWh换算成kW时,在1小时内数值等价,但写的时候务必把单位统一,否则结果会差3.6倍,这是个很容易被忽视的坑。

燃料电池的热出力则用一个热电比模型关联:

$$H_{FC,t} = c_{FC}^{th/e} \cdot P_{FC,t}$$

热电比取0.9左右,这样燃料电池放热时相当于替代一部分燃气锅炉的出力,经济性更好。不过会带来另一个问题:燃料电池在电价高峰时段发电,同时放热,而系统供热需求可能没那么大,多余的热量就要靠蓄热罐吸收,所以在建模时热平衡约束不能只写母线平衡,还必须把蓄热罐的充放热纳入。

2.4 其他关键设备与系统约束

CHP机组是整个模型的供能核心。燃气轮机发电之后,余热通过余热锅炉回收制热,燃机自身有一个“电热运行可行域”,我采用的是简化的多边形约束模型。这种模型比简单设定电出力上限和热出力上限更符合运行实际,因为燃气轮机在纯凝(不供热)和背压(强制供热)两种模式之间,发电能力会随热出力变化。核心约束概括为:

$$0 \le P_{GT,t} \le P_{GT}^{max}$$ $$0 \le H_{CHP,t} \le H_{CHP}^{max}$$ $$\gamma_{lo} \le P_{GT,t} - k_e H_{CHP,t} \le \gamma_{hi}$$

第三组约束就是典型的多边形可行域约束:在热出力较大时,电出力上限会被压低,下限会被抬升,两者之间存在线性耦合关系。这个约束如果你用“电出力上限和热出力上限分别列出”的粗略做法,很可能会得到一个超出实际物理能力的不可行调度方案,表面上看成本更优,实际上设备根本做不到。

电池储能和蓄热罐的建模原理相似,都是带损耗的能量缓冲装置。电池储能需要考虑充放电效率和SOC上下限约束,以及充放电不能同时进行的互斥约束。蓄热罐虽然没有化学损耗,但它有散热损失,可以用单位小时的散热系数来模拟。两个储能设备的调度末端我都要求回到初始状态,否则系统的优化结果会隐式地把储能设备当作免费能量来源,长期运行时的参考价值不高。

系统层面的约束主要包括电功率平衡、热功率平衡和气网购气上下限。电功率平衡是所有电源出力、新能源出力、储能放电、燃料电池发电之和,等于常规电负荷加上电解槽负荷、电锅炉负荷和储能充电,同时考虑从电网购电售电的交互电量。热平衡则类似,CHP热出力、燃气锅炉、电锅炉、燃料电池放热、蓄热罐放热构成供热侧,对应园区热负荷和蓄热罐充热。气网侧只需约束每小时购气量不超过管网上限即可。

2.5 决策变量与求解类型

这个模型里连续变量占了绝大多数,包括各机组出力、储能充放电功率、储氢量、以及阶梯碳的几个分阶梯数量。需要用到整数变量的地方其实不多,主要有:CHP和燃气锅炉的启停状态、电网购电售电互斥逻辑,以及阶梯碳交易中如果非凸时需要额外引入的顺序约束变量。好在这些整数变量数量不大,一共也就是几十个二进制变量,问题整体规模属于中小型MILP,商业求解器可以很快求解。

从一开始设计问题的时候我就决定用MILP而不是非线性规划,这个选择很重要。虽然电解槽、燃料电池的真实效率曲线往往是非线性的,而且非线性模型在论文里看起来更精确,但在工程调度场景中,日用调度步长为1小时,效率差异对经济性的影响远小于模型不可解、陷入局部最优、求解时间不可控带来的风险。线性化是工程优化的第一生产力,这句话在这类项目里非常适用。

在建立数学模型时,建议把变量类型做一个归纳,我自己的习惯是画表整理,确保写代码的时候不漏变量、不串下标。核心决策变量包括:燃气轮机启停二进制变量、燃气轮机/锅炉/电解槽/燃料电池的各时段出力连续变量、电锅炉出力、储能充放电、蓄热罐充放热、储氢罐储氢量、电网购售电量、阶梯碳三个分段变量。各类变量之间的耦合关系基本都在约束矩阵里体现,但写代码的时候容易漏掉某个变量,比如储罐的初始条件,等到求解发现结果莫名其妙偏大时,排查起来很费劲。

3. MATLAB代码实现与求解实战

3.1 环境配置与求解器选择

这个项目我用的求解环境是MATLAB + YALMIP工具箱,底层求解器用CPLEX。为什么选CPLEX而不是内嵌的求解器?因为MILP问题中二进制变量带来的分支定界过程非常依赖求解器的整数规划能力,CPLEX和Gurobi在这个领域依然是标杆级的。YALMIP的优势在于建模语言层面对优化问题的表述很直观,尤其是约束条件可以像写数学公式一样直接拼接,非常适合这种多变量、多约束的调度问题。

如果你本地没有商业求解器授权也没关系,YALMIP还支持SCIP和HiGHS这些开源求解器。HiGHS的MILP求解能力虽然不如CPLEX强悍,但对付这种规模的调度模型已经完全够用。安装好之后,用一行命令验证环境:

yalmiptest

这个命令会列出一堆求解器的检测结果,确保你看到cplex或gurobi字段是可用状态。

求解器配置上,我一般在调用optimize之前设置求解选项:

ops = sdpsettings('solver', 'cplex', 'verbose', 2, 'debug', 1); sol = optimize(cons, obj, ops);

这里verbose=2是为了在调试阶段看到求解过程的迭代信息,正式跑批量场景的时候可以关掉节省开销。debug=1是排查模型不可行问题时的利器,如果约束写错导致无解,它会直接指出可疑约束的位置。

3.2 决策变量定义与初始化

YALMIP里定义变量非常直观,连续变量用sdpvar,二进制变量用binvar。因为调度周期是24小时,我习惯把每个设备定义成24×1的列向量,这样后续加时序约束和最终的绘图提取数据都方便。

T = 24; % 连续变量 P_gt = sdpvar(T, 1); % 燃气轮机电出力 kW H_chp = sdpvar(T, 1); % CHP热出力 kW P_gb = sdpvar(T, 1); % 燃气锅炉热出力 kW P_eb = sdpvar(T, 1); % 电锅炉热出力 kW P_elz = sdpvar(T, 1); % 电解槽耗电 kW P_fc = sdpvar(T, 1); % 燃料电池电出力 kW H_fc = sdpvar(T, 1); % 燃料电池热出力 kW P_buy = sdpvar(T, 1); % 购电功率 kW P_sell = sdpvar(T, 1); % 售电功率 kW P_ch = sdpvar(T, 1); % 电池充电功率 kW P_dis = sdpvar(T, 1); % 电池放电功率 kW H_tch = sdpvar(T, 1); % 蓄热罐充热功率 kW H_tdis = sdpvar(T, 1); % 蓄热罐放热功率 kW S_h2 = sdpvar(T, 1); % 储氢罐储氢量 kg % 阶梯碳变量 d1 = sdpvar(T, 1); d2 = sdpvar(T, 1); d3 = sdpvar(T, 1); % 二进制变量 z_gt = binvar(T, 1); % 燃气轮机启停 z_eb = binvar(T, 1); % 电锅炉启停 z_fc = binvar(T, 1); % 燃料电池启停

每个变量定义的时候注释一定要写清楚单位。这个项目的单位我统一采用kW、kWh、kg、元,天然气耗量用kWh表示(因为输入的是天然气低位热值),这样不需要频繁换算。实际项目里最痛苦的往往不是约束本身,而是单位混乱导致的数值量级差异。比如一个约束里前面是kW,后面是kWh,只要漏掉一个时间因子1小时,整个模型的最优解就会偏成奇怪的结果。

3.3 阶梯碳成本的线性化实现

这一节是整个代码里最值得细看的地方。阶梯碳成本的分段函数在YALMIP里可以直接用辅助变量叠加实现。核心思路是每个阶梯对应一个辅助变量,并在目标函数里给它们分配不同的碳价权重。约束上需要把这个阶梯数量和总碳排放量通过一个等式约束关联起来。

E_total = sum(mu_grid .* P_buy + mu_gas .* (P_gt/eta_chp_e + P_gb/eta_gb)); E_quota = ... % 根据容量和配额比例计算 d_eq = E_total - E_quota; cons = [cons, d1 + d2 + d3 == d_eq]; cons = [cons, 0 <= d1 <= L1]; cons = [cons, 0 <= d2 <= L2]; cons = [cons, 0 <= d3];

这里有几个坑。第一个是$d_{eq}$实际上可能是负数,也就是系统配额富余。我在代码里直接用变量吸收负值,让$d1+d2+d3 = E_{total} - E_{quota}$时,这三个变量都是非负变量,等式就不可能对负数成立。所以必须在前面加一个max操作或者额外判断。一个更稳的做法是引入两个非负变量$d_pos$和$d_neg$表示配额缺口和富余量,让$E_{total} - E_{quota} = d_pos - d_neg$,目标函数里只对$d_pos$计算阶梯成本,$d_neg$可以按基础碳价出售配额获得收益。有富余配额时,卖出这部分也能摊薄总成本。

第二个坑是阶梯顺序。虽然目标函数的递增价格会自动让优化器先填满低价阶梯,但如果你用$d1+d2+d3$做等式约束,求解器可能会因为数值容差在某个阶段出现小幅越界。稳妥的做法是再加一组“逻辑顺序”约束,比如$0 \le d_1 \le L_1$、$d_2 > 0$时要求$d_1 = L_1$。在实际调试中,目标函数递增的价格设计已经能实现这套逻辑,所以我只在项目中加了一个“若d1未满则d2必须为0”的二选一约束,进一步保证分段结果严格合理。

3.4 求解循环与结果输出

模型搭建完毕之后,调用optimize求解,然后提取变量数据。提取代码最常见的错误是忘了把sdpvar对象转换成数值,所有变量在求解前都是符号对象,求解后必须用double()或value()提取,否则后续计算会和普通矩阵混在一起报错。

sol = optimize(cons, obj, ops); if sol.problem == 0 P_gt_val = value(P_gt); H_chp_val = value(H_chp); P_elz_val = value(P_elz); % 后续计算成本、碳排放量等 else disp('求解失败'); disp(sol.info); end

我用一个三层循环来处理多场景分析:最外层遍历碳价水平,中间层遍历是否启用阶梯机制,最内层遍历是否有电制氢装置。每次求解完,把所有设备出力、储能状态、成本构成记录到一个结构体里。最后对比时用几条plot命令画出电出力对比曲线、热出力曲线和储氢量曲线,再加上每个设备出力的堆叠面积图,整个项目的可视化就非常清晰了。

4. 典型场景结果与对比分析

4.1 基础场景调度结果

先看没有阶梯碳机制也没有电制氢的“基础场景”调度结果。这个场景里,系统主要依靠燃气轮机供电供热,燃气锅炉补热,电池储能进行峰谷套利。分时电价高峰时段(18:00-22:00),燃气轮机满发,电池储能放电;电价低谷时段(23:00-次日7:00),储能充电,燃气轮机低负荷运行,热负荷大部分由燃气锅炉承担。这个结果符合直觉,没什么意外。

但不是没有值得注意的细节。由于没有电制氢,凌晨风电大发时电网消纳能力有限,弃风率大约在6%到8%之间波动。如果只靠电池储能,200 kW的储能容量在凌晨2小时左右就会被充满,不能完全吸收高峰时段的过剩风电。蓄热罐虽然也能在夜间吸收多余热量,但它吸收的是热而非电,对风电消纳的帮助非常有限。这就引出一个结论:纯电储能加蓄热罐的组合,对高渗透率新能源场景的支撑能力是有限的,电制氢正好补上这块空白。

基础场景的总运行成本大约10580元,全天碳排放量13.2吨。这个数字在这个规模的园区里算正常水平,后面所有对比都以这个场景为基准。

4.2 引入阶梯碳机制后的变化

加入阶梯碳交易机制后,模型结果出现了两个明显变化。第一个变化是燃气轮机在日间负荷时段的出力被压低了约15%到20%,部分电量改从电网购买,因为购电的间接碳排放配合免费配额计算后,边际碳成本反而低于天然气燃烧的碳成本。第二个变化是热出力结构发生转移,燃气轮机的余热减少后,原本由它承担的供热任务部分转移给了燃气锅炉,部分转移给电锅炉。这说明碳机制正在改变设备间的相对经济性排序。

对比固定碳价模型,阶梯式模型在控制碳排放总量上更“用力”。固定碳价下,系统减排到一定程度后就不会继续减,因为继续减排的边际成本是恒定的;阶梯式碳价下,排得越多边际成本越高,系统宁可多花一些成本购买高价电量或启用更贵的设备,也会想办法把碳排放压低到低阶梯区间。结果就是总碳排放从固定碳价场景的11.4吨进一步降到10.2吨,总运行成本反而比基础场景下降约700元。碳排放下降的同时总成本也下降,这一点的解释是:系统减少了弃风弃光惩罚费用,同时通过碳机制让燃气轮机的运行时段更集中、更经济,避免了低效的长时间低负荷运行。

我特意在代码里设置了三个碳价档位:基础碳价50元/吨,第二阶梯1.5倍价格,第三阶梯2倍价格。当第二阶梯价格达到基础价2倍时,模型会强烈抑制高排放运行方式,甚至可以观察到夜间燃气锅炉直接停机、热负荷全部由蓄热罐和电锅炉承担的现象。这种分段价格信号带来的非线性影响非常明显,也是固定碳价模型无法捕捉的调度行为。

4.3 电制氢带来的灵活性价值

加入电制氢装置之后,以前弃风弃光时段的风电光伏出力被明显吸收。电解槽的调度策略非常清晰:凌晨1点到5点,风电大发且电价最低,电解槽满负荷运行,每小时消耗200 kW电,产出的氢气储存到储氢罐;中午11点到14点,光伏大发但电价处于平时段,电解槽也基本满负荷运行;傍晚电价高峰时段,燃料电池启动放电和放热,替代一部分电网购电和燃气锅炉供热。

对比没有电制氢的模型,弃风弃光率从基础场景的4.7%降到1.9%,几乎减少了一半以上。这在工程上是个很直观的收益。更意外的是它对系统成本的影响:电制氢设备本身没有直接收入,它产出的氢气只是中间产物,但通过燃料电池在高峰时段换电和放热,实际上相当于把凌晨低谷电转化成了傍晚高峰电和热,赚取峰谷价差。总运行成本从引入碳机制后的10290元进一步降至9860元。

还有一个容易被忽略的收益在碳机制方面:电解槽消耗的电力来自风电和光伏,这部分电量如果弃掉了,就没有替代效应;而一旦被利用,相当于替代了部分电网购电,降低了系统对应的间接碳排放。因此电制氢和阶梯碳机制并不是两件独立的事,它们一个从价格侧威慑高碳行为,一个从物理侧提供替代方案,互相之间产生了明显的协同效应。

4.4 关键参数灵敏度启示

项目里我做了几个参数灵敏度分析,最关注的是基础碳价、阶梯斜率和储氢罐容量三组参数。基础碳价从30元/吨提高到120元/吨的过程中,系统碳排放单调下降,但下降幅度在80元/吨之后就趋于饱和,因为此时燃气轮机已经被压制到接近最低技术出力,再提高碳价只会让成本上升,减排收益很小。

阶梯斜率的影响比基础碳价更显著。把第二阶梯价格倍数从1.2调到2.0时,系统碳排放下降很明显,因为高阶梯带来的边际惩罚让优化器尽量避免超排。但如果斜率再往上升,系统碳排放变化很小,成本却快速上升。这说明阶梯斜率不是越高越好,存在一个“碳价过高→成本激增但减排收益微弱”的拐点区间,实际应用中要根据系统供需关系去标定。

储氢罐容量的灵敏度也比较有意思。从20 kg逐步增加到80 kg,弃风弃光率持续下降,但下降速率在50 kg之后明显放缓,因为电解槽、燃料电池的功率限制成为新的瓶颈,单纯增大存储容量的边际收益递减。一味堆储氢罐容量并不经济,真正需要匹配的是电解槽和燃料电池的功率等级,以及系统内剩余弃电的持续时段长度。

5. 常见问题与调试经验实录

5.1 模型不可行问题怎么查

用YALMIP做这类项目,遇到最多的问题就是模型不可行。第一次把这个“电热气碳”全耦合模型跑起来的时候,我大概率会遇到problem=1的情况。排查思路有一个固定顺序:先排除约束符号反了的问题,再检查功率平衡约束,最后检查储能设备和储氢设备的循环约束。

我的排查套路是先缩小规模,把调度周期从24小时改成2小时,移除阶梯碳约束,先跑一个纯电热平衡版本。如果最小版本可解,就逐步加回约束。YALMIP提供了一个非常有用的调试命令:把sdpsettings的debug参数设为1后,它会在不可行时告诉你哪些约束导致冲突。不要小看这个功能,有一次我的问题出在蓄热罐散热系数的单位上,散热系数放错了数量级,导致末端蓄热罐无法回到初始温度,从约束输出信息里一眼就锁定了问题。

还有一个常见的坑是购售电互斥。如果购电价低于售电价,模型就会疯狂购入电力再卖出,形成一个无中生有的利润循环。虽然实际电价制度里一般不会出现这种倒挂,但如果你的分时电价表格设置不慎出现了这种情况,就会出现“系统无限套利”的看似可行但结果荒谬的模型。检查方法很简单:把购电量和售电量分别求和,如果某一时段同时大于零,且总售电量明显异常,那大概率就是电价倒挂导致的互斥问题。

5.2 求解缓慢与次优解的应对

这个模型的规模不大,正常配置下CPLEX几十秒内就能出最优解。但如果把调度周期从24小时扩展到96时段,或者加了多个典型日场景,整数变量会成倍增加,求解时间会从秒级跳到分钟级甚至更久。我的处理策略是:优先减少二进制变量,然后是给求解器设时间限制和MIP gap。

减少二进制变量的一个实用技巧是,区分哪些设备真的需要建模启停状态。比如燃气轮机必须建模启停,因为它有明确的启停成本和最小连续运行时间;但电锅炉这类响应速度快、启停成本低的设备,可以直接用0到上限的连续变量表示,省掉二进制变量后求解速度提升非常明显。电网购售电互斥也可以用参数手段解决(售电价低于购电价),不需要为它单独建立整数约束。

如果求解时间还是太长,我会给CPLEX设置一个MIP gap终止条件,比如gap控制在1%以内就停止搜索,这样可以在工程精度范围内接受一个接近最优的解。实际调度问题里,1%的gap对总成本的影响可能只有几十元,但求解时间可以从4分钟缩短到20秒。这个副利在跑几十个场景对比时非常明显。

5.3 边界参数设置的坑

最后必须吐槽几个参数设置在工程上的坑。第一个是免费配额比例。如果配额比例设得太高,比如超过90%,系统基本上不需要为碳排放花多少钱,阶梯碳机制完全失去约束力,结果和没碳成本差不多。如果设得太低,比如30%,系统又会被迫把所有燃气机组压到最低出力甚至停机,电制氢和蓄热也全部满负荷,模型结果变成纯堆容量,没什么调度智慧可言。经过几轮试验,我把免费配额比例设在75%到85%之间得到的结果最有解释价值,既能看到碳成本对设备出力的引导,又不会让模型为了减碳去做极端调度。

第二个坑是电解槽的最低负荷和运行约束。很多文献会忽略电解槽的启动过程,直接把它当成0到额定功率可调的设备。但在实际系统里,电解槽在低负荷下单位制氢成本显著上升,长期低负荷运行还可能影响设备寿命。如果你在模型里发现电解槽整天都在10%负荷以下运行,那大概率是参数设置不合理,应该加一个运行功率下限或把效率做成阶梯。

第三个坑是燃料电池的热电比。热电比设太高,燃料电池在高峰时段会释放大量热,系统可能因为热负荷不足而被迫降低蓄热罐充热限制,导致热量浪费。热电比设太低,又会让燃料电池的供能价值打折扣。实际项目里我采用0.8到1.0的热电比区间,并通过蓄热罐同步匹配来吸收多余热量,这样模型得到的调度方案才具备现场可落地的合理性,而不是停留在优化脚本层面。

我个人在实际操作中还有一个习惯:每次调完参数跑出结果,一定先把各设备单位成本列一张表出来对比,比如单位购电成本、单位购气成本、单位碳排放成本在最优解中的边际值。把对偶变量和边际成本拉出来看,往往能比直接看出力曲线更快定位模型的问题。如果你跑出来的结果里某台设备明明成本更高却依然满发,那这个“反直觉”现象大概率意味着有约束漏加了,要么是热平衡没闭合,要么是储氢罐没有循环约束。这个排查思路比盯着代码一行行看高效得多。

这整套模型的后续扩展空间其实还很大,比如把新能源出力的随机性用场景集建模做两阶段随机优化,或者把调度尺度细化到15分钟并加入热网管道的动态延迟约束,都是顺手能做的方向。但核心的建模逻辑,也就是“阶梯碳机制给出价格信号,电制氢提供物理调节手段,热电优化把它们拧成一股绳”这套思路,换什么场景都成立。

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

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

立即咨询