尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

考虑阶梯碳交易与氢能耦合的综合能源系统优化调度建模

考虑阶梯碳交易与氢能耦合的综合能源系统优化调度建模 做综合能源系统优化调度的人应该都有一个感受模型在论文里写得挺完美落到MATLAB里一跑问题全藏在那些“机制细节”里。这次分享的程序核心就两件事一是在碳交易成本里引入了阶梯型碳交易机制而不是常规做法里一条直线式的固定碳价二是把氢能子系统作为电、热、气耦合的中间载体写进优化模型。对于做电力系统优化、园区级综合能源规划、毕业设计或者论文复现的朋友来说这套程序提供了一个可以照着改的骨架——先学主线建模思路再往里面填自己的设备参数和负荷曲线。1. 为什么说“阶梯碳价氢能”是优化调度里的两个硬骨头1.1 碳交易成本绝对不是一条直线很多常见的IES调度模型里碳成本被处理成“碳排放量乘以单位碳价”一条直线求解方便。但实际碳市场规则不是这样的。企业一开始会拿到一个免费碳排放配额如果实际排放低于配额富余配额可以在市场上出售变成收益如果超了超额部分得去市场购买。更关键的是相当多的机制采用阶梯式定价超配额越多单位碳价越贵。这个“价格随超排量递增”的结构和居民阶梯电价是一个逻辑用得越多边际成本越高逼迫你在系统层面提前做减排。如果把它简单化成固定碳价那个优化解在真实机制下往往不成立——可能在固定碳价下觉得排放点没问题结果放到阶梯碳价下边际成本暴涨整个调度结果的经济性就差了很多。1.2 氢能不是“加一个设备”那么简单再说氢能。传统IES里电、热、气是相对独立的网络电锅炉和燃气锅炉虽然能耦合但耦合方式比较生硬。氢能不一样电解槽可以把低谷时段多余的风电、光伏变成氢气存起来储氢罐相当于一个跨时段储能氢燃料电池再把氢气变回电能而且发电的同时排出大量余热余热可以直接进热网。一套下来氢能同时覆盖了“电能消纳—化学储能—热电联供”三个环节。把氢能写进IES最大的难点是设备种类多、变量维度高、约束关系复杂。电解槽的功率区间、储氢罐的SOC递推、燃料电池的电热联产比例、氢负荷的供需平衡每一条都会影响整个优化结果。这也是我觉得有必要专门写一篇文章说清楚的原因。2. 系统拓扑与设备建模母线结构、目标函数和约束骨架2.1 母线结构和设备清单程序里我按能量流动方向划分成四条母线电母线、热母线、气母线天然气、氢母线。电母线光伏、风电、热电联产机组CHP、燃气轮机、蓄电池、氢燃料电池、电解槽都在这一侧。热母线CHP余热、燃气锅炉、电锅炉、氢燃料电池余热回收、储热罐。气母线外购天然气供应燃气锅炉和CHP。氢母线电解槽产氢、储氢罐、燃料电池耗氢也可以外接固定氢负荷。我的习惯是建模第一步一定先把这张母线拓扑画出来不然后面写平衡方程的时候很容易漏掉某一类设备。你可以用Excel表先把设备清单列出来每台设备标注“连接哪条母线”“输入端口是什么”“输出端口是什么”这对后面写代码帮助非常大。2.2 目标函数钱从哪些地方流出去目标函数取系统总运行成本最小化我拆成了五块外购电力成本从上级电网买电的费用分时电价条件下随时间变化。外购天然气成本按气价乘购气量计算。设备运行维护成本各设备的单位出力的维护费用之和。碳交易成本这是重点不是简单的固定碳价乘积而是阶梯碳价的分段函数下一章单独讲。弃风弃光惩罚为了促进新能源消纳给弃风和弃光加一个惩罚项系数通常要大于上网电价否则求解器会选择“弃掉更省钱”。一个典型的目标函数长这样用能量单位统一为MWh碳为吨[\min ; C_{total} C_{grid}^{buy} C_{gas}^{buy} C_{om} C_{carbon} C_{curtail}]C_{om} 是各设备的维护成本累加C_{carbon} 是阶梯碳交易成本C_{curtail} 是弃风弃光惩罚。每一项单位必须统一不然目标函数里差三个数量级会让求解器数值很难看。2.3 约束骨架约束分四大类每一条都对应物理规律电功率平衡发电侧光伏风电CHP燃料电池蓄电池放电等于用电侧负荷电解槽电锅炉蓄电池充电。热功率平衡热源侧CHP余热燃气锅炉电锅炉燃料电池余热储热罐放热等于热负荷。氢量平衡电解槽产氢储氢罐放氢 燃料电池耗氢氢负荷储氢罐充氢。设备自身约束各设备出力上下限、爬坡约束、储能SOC的时序递推、初始和末端储能容量约束。特别提醒IES的碳排放来源一般是外购电力的间接排放和天然气燃烧的直接排放以及CHP机组的排放。这个计算口径要在一开始就统一好否则后面算碳交易成本时很容易把来源算漏或者算重。3. 阶梯碳交易机制怎么塞进优化模型分段线性化的落地写法3.1 阶梯碳价的结构定义先定义系统总碳排放量为 (E_{total})单位为吨CO2。系统获得免费配额 (E_{quota})。如果 (E_{total} \le E_{quota})富余配额可以卖出碳交易成本为负值等于“卖配额”的收益。如果 (E_{total} E_{quota})超排量部分按下述阶梯分段计价。第一段超排量在 ([0, E_{seg1}])碳价为 (\lambda_1)第二段超排量在 ((E_{seg1}, E_{seg1}E_{seg2}])碳价为 (\lambda_2)第三段以上区间碳价为 (\lambda_3)且 (\lambda_1 \lambda_2 \lambda_3)。举个例子假如配额100吨系统排了150吨超排50吨。第一档0~20吨按50元/吨第二档20~50吨按70元/吨那碳成本就是 (20\times5030\times70)。这就不是一条直线了目标函数里天然带了一个分段线性结构。3.2 用0-1变量和Big-M线性化直接把min/max函数写进目标函数求解器会报警。标准做法是引入一组0-1变量把分段线性函数做线性化。YALMIP里的实现方式我习惯这样写lambda [50, 70, 90]; % 各档碳价元/吨 E_seg_len [20, 30, Inf]; % 各档区间长度最后一档设为Inf但实际会加一个大M上限 E_excess sdpvar(1,1); % 总超排量 e_part sdpvar(3,1); % 落在各档区间内的超排量 on_part binvar(3,1); % 是否启用了第k档 Constraints []; % 1. 各档排放量只能在其区间内且由开关变量控制 for k 1:3 Constraints [Constraints, 0 e_part(k) E_seg_len(k) * on_part(k)]; end % 2. 顺序约束没装满第一档第二档不允许启用 Constraints [Constraints, on_part(2) on_part(1)]; Constraints [Constraints, on_part(3) on_part(2)]; % 3. 所有档位累加等于总超排量 Constraints [Constraints, E_excess sum(e_part)]; % 4. 碳成本 各档实际排放量 x 对应碳价 的累加 C_carbon lambda * e_part;这个“顺序开关”的处理方式比普通的Big-M更干净。核心逻辑是只有第1档满载了第2档才有机会启用只有第2档满载了第3档才有机会启用。只要设置了这条链式约束求解器就会自动把低档填满再进高档。注意最后一档如果设为Inf实际需要给它一个大数上限比如50000吨否则Big-M常数太大数值上面容易出问题。大部分园区级算例里超排量到不了这个量级取一个“物理上不可能突破”的上界就够了。3.3 为什么这里不直接改用二次函数也有人图省事用 (\lambda \times E^2) 当惩罚项模拟“排得越多罚得越重”。但这样一来问题会变成MIQP混合整数二次规划求解时间显著增加。阶梯碳价作为分段线性函数等价于用一组线性约束逼近递增的边际成本模型结构保持在MILP混合整数线性规划范围内无论是Gurobi还是Cplex处理起来都很快。这也是这个建模思路在工程上站得住脚的原因既贴近机制又不牺牲可求解性。4. 氢能子系统的建模细节电解槽、储氢罐、燃料电池4.1 电解槽电能转氢气的换算关系电解槽输入电功率 (P_{el})输出氢气流量。工程上常用这个公式[H_{prod} \frac{P_{el} \cdot \eta_{el}}{LHV_{H2}} \times 1000]其中 (LHV_{H2}) 是氢气的低位热值约为33.3 kWh/kg。(\eta_{el}) 是电解槽效率常规取0.6~0.75之间。我程序里用了0.65这个值属于比较保守的中性设定。电解槽还要考虑最小出力限制。很多电解槽不能无限向下调有一个最小运行功率比如额定功率的20%。这个约束会对调度产生明显影响如果夜间风光大发时想制氢不能只投一丁点电功率要么达到最小功率要么停机。这个约束写漏了解出来的调度指令在工程上根本执行不了。4.2 储氢罐气态存储的时序递推储氢罐的模型和蓄电池非常像只是能量形式的区别[SOC_{H2}(t1) SOC_{H2}(t) H_{in}(t) - H_{out}(t) - H_{loss}(t)][SOC_{H2}^{min} \le SOC_{H2}(t) \le SOC_{H2}^{max}]这里单位最关键。程序里我统一把所有氢气量换算成MWh也就是氢气热值乘以质量这样可以在同一个目标函数里和电力、热量的量级对齐。很多人写着写着发现单位对不上就是因为一会儿用kg/h一会儿用MWh两个量纲在约束里混着算。建议开局就定好功率统一MW能量统一MWh氢统一按热值折算成能量单位。还要注意储氢罐的SOC初值和终值约束。通常为了调度结果有周期可重复性要求一天的起始储氢量和终止储氢量相等或者给一个可接受的偏差范围不然求解器会把第一天初始存储“白嫖”掉。4.3 氢燃料电池又发电又发热的耦合点燃料电池是氢能系统里最有价值的设备因为它同时跨了电、热、氢三条母线。典型参数是[P_{fc}^{el} H_{fc} \cdot \eta_{fc}^{el}][Q_{fc}^{heat} H_{fc} \cdot \eta_{fc}^{heat}]电效率取0.45热回收效率取0.40。也就是说1 MWh氢气输入大约0.45 MWh变为电0.40 MWh变成可利用热能综合效率到了0.85。这个余热回收能力很多人容易漏但恰恰是燃料电池相比纯电化学储能的优势——它输出的是“电热”的联合产品。在约束里燃料电池同时把电功率和热功率挂到对应母线上。这样就形成了一个“氢→电热”的强耦合关系调度模型会自发决定在热负荷高的时候多让燃料电池发电余热刚好补充热网在纯电负荷高峰时燃料电池的余热可能过剩模型就要权衡是否需要储热罐配合。4.4 氢负荷最好预留一个出口程序里我加了一个固定氢负荷曲线用来模拟给加氢站或者工业用户供氢的场景。试过之后发现这个氢负荷非常关键。如果没有氢负荷氢能系统完全“自产自消”——电解槽产氢只能给燃料电池或储氢罐系统的调节空间会被压得很窄。而加了氢负荷之后制氢侧多了一个独立需求弃风制氢的路径就更容易被激活算例结果也更有层次感。5. YALMIP建模与求解器配置那些说明书里不会写的坑5.1 环境准备MATLAB只是第一步这个程序不是装了MATLAB就能跑的。还需要YALMIP工具箱以及至少一个MILP求解器比如Gurobi、Cplex或者直接用MATLAB自带的intlinprog。我的配置习惯% 添加YALMIP与求解器路径 addpath(genpath(C:\yalmip)); addpath(genpath(C:\gurobi\win64)); % 初始化 yalmip(clear); % 定义变量 P_chp sdpvar(24,1); % CHP电出力 Q_chp sdpvar(24,1); % CHP热出力 P_pv sdpvar(24,1); % 光伏出力优化给定量或变量取决于是否考虑弃光 P_wt sdpvar(24,1); % 风电出力 ...看热词搜索里不少人在找MATLAB安装问题和工具箱下载问题我多说一句YALMIP是开源工具箱网上找官方源下载即可求解器方面如果只是做课设intlinprog完全够用Gurobi更适合数据规模大、需要反复调参的情况。5.2 求解器设置不要直接跑默认参数如果调用Gurobi建议设置这几个参数ops sdpsettings(solver,gurobi,verbose,0, ... gurobi.MIPGap,0.001, ... gurobi.TimeLimit,300); sol optimize(Constraints, Objective, ops);verbose,0关掉刷屏不然几百行求解日志看得眼晕。MIPGap,0.0011e-3这个精度对大多数经济调度问题足够没必要追求0间隙差那0.01%的成本在实际工程里毫无意义。TimeLimit,300设置5分钟上限防止复杂算例卡死。5.3 数值量纲最容易把求解器弄崩的问题这是我自己踩过最深的坑。功率用kW能量用kWh碳排用t碳价用元/t结果目标函数里有的项是几千有的项是几百万差距超过三个数量级求解器数值优化过程会出现非常奇怪的结果——明明直觉上应该选低成本方案解的却是乱七八糟的出力。我的统一习惯是功率MW能量MWh碳排量tCO2碳价元/tCO2天然气MWh按热值折算这么一统一目标函数各项基本都在几百到几千的量级Gurobi跑起来稳定得多。5.4 调试“不可行解”的通用套路刚把模型写完时非常容易遇到“infeasible problem”。不要慌按下面顺序排查先看YALMIP返回的diagnosticssol.info它不会告诉你哪个约束错但会确认问题确实不可行。逐个母线检查平衡约束把平衡约束右端加一个小的松弛变量目标函数里给这个松弛变量一个很大的惩罚系数。重新求解后看松弛量出现在哪条母线的哪个时刻那个时刻大概率就是问题所在——通常是负荷曲线缺了一段或者某设备出力上下限设置得不合理。检查初始和末端储能约束——很多不可行问题都来自这里比如要求一天结束时储氢罐SOC回到初始值但负荷和新能源出力组合根本不可能做到。6. 算例对照怎么设计三组实验把创新点验证出来6.1 对照组设置别把新机制和新技术全搅在一起验证“创新点”最忌讳把所有东西全堆在一个场景里跑最后不知道是哪个机制起的作用。我建议分成三组对照场景A不含碳交易不含氢能系统。这是基准场景代表传统IES调度。场景B固定碳价 不含氢能系统。用于对比“线性碳价”和“阶梯碳价”的差异。场景C阶梯碳价 不含氢能系统。和场景B对比能单独看出阶梯机制的影响。场景D阶梯碳价 含氢能系统。最终完整方案和场景C对比能单独看出氢能的影响。用24小时典型日数据风电/光伏预测曲线设为已知电/热/氢负荷曲线自己编或者按公开数据集调一版。6.2 从机理上预期会看到什么结果基于模型结构不用跑也能预判出几个“符合物理直觉”的现象线性碳价下系统只要把碳排放压到某个边际平衡点就够了阶梯碳价下一旦超排量越过档位阈值边际碳价会跃升调度模型会提前调整CHP出力增加电锅炉和燃料电池的使用风电消纳率会上升弃风率下降。氢能系统的价值主要体现在“时间转移”夜间风电大发、电价低时电解槽制氢把电能转化为化学能白天电负荷和热负荷高峰时燃料电池放电压低购电成本余热进热网降低锅炉出力。算例中典型日的总运行成本大概率会下降具体下降幅度要看弃风量和氢能设备容量配比。储氢罐SOC曲线应该呈现“白天降、夜间升”的周期性波动这说明氢能系统承担了跨时段调峰的角色。6.3 结果可视化这四张图一定要出用MATLAB画图时我建议至少出四张系统电功率平衡堆叠图stacked area能直观看出各设备的出力分担。储氢罐SOC曲线验证氢能的存储与放能行为。碳排放量与碳交易成本的时段曲线重点展示阶梯碳价作用区间。场景A/B/C/D的总成本和碳排对比柱状图这是论文里最常引用的结果。绘图时注意坐标轴单位标注清楚别光给数字不给单位很多评审和导师第一眼就看这个。7. 程序模块划分与后续扩展让它不只是“一个脚本”7.1 模块怎么拆我现在写这类程序基本是固定拆法每个文件只干一件事文件作用main.m主程序设置基础参数调用建模函数求解输出结果load_data.m读取负荷曲线、新能源预测出力、设备参数、碳交易参数build_constraints.m构建所有约束条件按母线分类组织set_objective.m构建目标函数统一量纲solve_optimization.m配置求解器求解检查结果状态plot_results.m绘制所有图表这样做有一个直接好处换一套设备参数只需要改load_data.m里的数据表换一个系统拓扑只需要在build_constraints.m里增加或删除设备约束。改起来风险小也不会把整个脚本改崩。7.2 创新点要往哪里写标题里说“具有一定的创新”这种说法在论文里不太合适。严格来说这个工作的创新属于“模型建立的创新”不是求解算法层面的创新在计及碳交易的IES调度文献中很多用固定碳价或线性碳税这里改用阶梯碳交易机制贴合碳市场的分段定价逻辑。在含氢能的IES研究中很多只把氢当储能或者只当燃料这里把电解槽、储氢罐、燃料电池、氢负荷整体纳入多能互补框架。写成论文摘要时比较稳的表述是“提出了考虑阶梯型碳交易机制的含氢能综合能源系统协同调度策略构建了混合整数线性规划模型并验证其经济性与低碳性。”这样既不过度夸大又能把差异化说清楚。7.3 后续能扩展的方向这套程序骨架的扩展空间很大考虑需求响应把电、热负荷改成弹性负荷和阶梯碳价形成协同。加入碳捕集设备让火电/CHP的碳排放成为可调节变量比单纯“少排”更灵活。加入季节性储氢把跨日储能扩展成跨周甚至跨月算例会更复杂但更有研究价值。电解槽加余热回收目前很多模型忽略了电解槽本身也发热这部分热量回收后综合能效还能再上一个台阶。每加一个扩展模型变量数会增加不少但骨架本身不用大改这就是把模块拆清楚的价值。最后说一点我个人的体会。这套程序真正花时间的不是代码本身而是把“阶梯碳价”和“氢能”这两个机制用线性约束讲清楚。我见过不少程序把储能、碳交易、氢能、需求响应全堆在一个模型里最后解出来一团乱麻根本说不清是哪个机制在起作用。做系统优化不是做得越复杂越好而是每一步都要问自己这个设备、这个约束、这个参数到底让系统获得了什么调节能力把这个想明白了模型自然就立得住。
返回列表