资讯动态

计及氢能的综合能源优化调度Matlab实现解析

发布时间:2026/10/24 2:48:03 来源:尧图企业网站定制
1. 项目概述为什么要做计及氢能的综合能源优化调度做综合能源系统优化调度这几年我见过不少刚入门的同学把目光盯在电、热、冷三种常规能源的耦合上模型跑通了就以为万事大吉。但说实话如今做园区级或区域级的综合能源系统如果不把氢能这条链路纳入优化范畴整个方案在“双碳”目标下的解释力会大打折扣。原因很直接电储能解决的是小时级甚至分钟级的能量平移而氢能凭借电解制氢、储氢、燃料电池发电这一完整链条天然适合做跨天、跨周的长时间尺度能量调节。这个项目标题“计及氢能的综合能源优化调度研究Matlab代码实现”说白了就是要在传统冷热电联供系统的基础上把电解槽、储氢罐、燃料电池这三件套加进去然后通过Matlab建立混合整数线性规划或非线性规划模型求解一个满足冷、热、电负荷需求的最优调度方案。调度目标可以是最小化运行成本也可以是兼顾碳排放的经济性最优甚至可以加入可再生能源消纳率等指标。这个项目适合谁来参考我总结下来主要有三类人一是做综合能源系统方向的研究生需要快速跑通一个包含氢能链路的算例作为对比方案二是做园区能源规划和微电网设计的工程师需要评估氢能设备介入后系统的运行经济性三是对MatlabYalmip建模求解感兴趣的开发者想看看设备建模、约束线性化、求解器配置这一整套东西长什么样。我自己实际动手做过类似项目最大的感受是氢能这条链路不像电储能那样“充放分明”它的能量转化路径长、涉及多种能量形式、设备耦合关系复杂建模时稍不注意就会导致约束冲突或者求解时间爆炸。这篇文章就把我在代码实现过程中积累的思路、踩过的坑、以及可以直接参考的方案一并梳理出来。2. 综合能源系统架构与氢能耦合机制拆解2.1 系统整体结构三个层级一条氢链先看一个典型的含氢综合能源系统长什么样。系统通常由三级构成源侧光伏、风电等可再生能源加上外部电网购电和天然气进气。转换侧燃气轮机或燃气锅炉电热联产、电制冷机、吸收式制冷机以及氢能环节的电解槽、燃料电池。负荷侧电负荷、热负荷、冷负荷以及氢负荷如果有加氢站需求。传统综合能源系统在源、网、荷之间只有电和热两种能量流加入氢能后系统中多了一条完整的“电→氢→电/热”的能量转化路径。电解槽在电价低谷或可再生富余时段启动把多余电能转化为氢气存入储氢罐燃料电池在电价高峰或电力短缺时段发电同时余热可以回收供热。这个结构的价值在于电能不再是“即发即用”的刚性资源而是可以经由氢能实现大容量、长时间尺度的存储和跨时段调配。比如某个连续阴雨天光伏出力连续三天偏低电储能可能第一天就放空了但储氢罐里的氢可以支撑燃料电池在多个负荷高峰时段持续出力。2.2 氢能设备模型电解槽、储氢罐、燃料电池建模之前必须把三个核心设备的数学模型确定下来这是整个优化的地基。电解槽模型。目前工程上常用碱性电解槽或PEM电解槽输入是电功率输出是氢气流速。简化建模时通常用效率模型近似P_H2_in(t) η_el × P_el(t)这里P_el(t)是电解槽在第t时段的输入电功率η_el是电转氢的综合效率P_H2_in(t)是产生的氢气功率。注意电解槽启动时有最小运行功率限制并且爬坡速率不能太快这两个约束在调度模型中必须体现否则求解结果在工程上不具备可执行性。储氢罐模型。储氢罐的状态用氢气存储量SOC_h2(t)表示满足SOC_h2(t) SOC_h2(t-1) P_H2_in(t)×Δt - P_H2_out(t)×Δt其中P_H2_out(t)是从储氢罐输出到燃料电池的氢气功率。储氢罐有容量上限和下限约束通常不建议放到完全空罐状态因为燃料电池需要一定的入口压力。这个蓄能状态变量会让模型变成一个多时段耦合的动态优化问题这也是它和简单单时段经济调度的本质区别。燃料电池模型。燃料电池把氢气和氧气通过电化学反应转化为电能和热能模型上可以表示为P_fc_e(t) η_fc_e × P_H2_out(t) P_fc_h(t) η_fc_h × P_H2_out(t)P_fc_e(t)是发电功率P_fc_h(t)是回收的热功率η_fc_e和η_fc_h分别是发电效率和余热回收效率。燃料电池的响应速度快但单位发电成本受制于制氢成本和储氢效率所以优化器会自动决定它在什么时候开机、发多少电。2.3 能量耦合关系电、氢、热之间的复杂交换加入氢能后系统内能量流的耦合关系明显比“燃气轮机电制冷吸收式制冷”的传统三联供复杂得多。我梳理了几条核心链路电解槽把电能转为氢能这是“电→氢”的降级使用只有在电价低或者可再生富余时才划算。储氢罐进行时段间的氢量转移本质和电储能类似但容量规模大得多。燃料电池把氢能转回电能和热能在电价高峰时段通过“氢→电”套利。燃料电池的余热进入热母线与燃气锅炉、热泵共同满足热负荷存在多能互补的可能。这种耦合结构意味着优化模型既要求解各时段的设备出力分配又要决定储氢罐何时充电、何时放电、充多少本质上是一个跨时段决策问题。如果系统含光伏、风电等可再生出力不确定性还需进一步考虑随机优化或鲁棒优化但作为基础版本先用确定性模型把机理跑通是稳妥的第一步。3. 优化调度模型构建目标函数与约束体系3.1 目标函数经济性优先还是低碳优先计及氢能的综合能源优化调度目标函数的选取直接决定调度结果的方向。目前工程和学术上最常见的选择有两种。第一种是纯经济性目标最小化系统总运行成本min Σ [ C_grid(t) C_gas(t) C_om(t) ]其中C_grid(t)是向电网购电费用售电收益为负C_gas(t)是天然气购气费用C_om(t)是所有设备的运行维护费用。这个目标最直白也最容易出对比结果有氢能和无氢能两种方案跑一遍成本差额就是这个系统上氢能的边际价值。第二种是碳经济双目标在运行成本之外加入碳排放惩罚min Σ [ C_grid(t) C_gas(t) C_om(t) λ_c × E_CO2(t) ]E_CO2(t)是电网购电对应的间接碳排放和燃气设备直接碳排放之和λ_c是碳价。从仿真效果看碳价从低到高扫描一遍能够清晰看到氢能设备利用率如何随碳价上升而提升这是撰写论文或项目报告时非常有说服力的敏感性分析。我个人建议基础版本先用经济性单目标跑通整个流程进阶版本再加上碳惩罚项做多情景对比。3.2 约束体系功率平衡与设备出力上限约束条件是优化模型的核心骨架缺一条模型就可能产生工程上完全不可行的“纸上结果”。下面这几类约束我逐个说明。电功率平衡约束。每个时段系统电功率进出必须相等P_grid(t) P_pv(t) P_wt(t) P_fc_e(t) P_el(t) P_ec(t) P_load(t) P_ev(t)左侧是电源侧包括电网购电、光伏、风电、燃料电池发电右侧是用电侧包括电解槽用电、电制冷机用电、常规电负荷以及可能存在的电动汽车充电负荷。注意燃气轮机本身也发电但我这里简化处理把燃气轮机和余热锅炉作为热电联产块单独建模。热功率平衡约束P_gb_h(t) P_fc_h(t) P_hr_h(t) P_th_load(t) P_ac_load(t)P_gb_h是燃气锅炉产热P_fc_h是燃料电池余热P_hr_h是燃气轮机余热回收右侧是热负荷和吸收式制冷机的驱动热功率。实际项目中热负荷曲线往往比电负荷更难获取没有实测数据时可以用典型日负荷归一化曲线近似。设备出力上下限约束。每台设备都有出力区间比如燃气轮机P_gt_min ≤ P_gt(t) ≤ P_gt_max电解槽u_el(t)×P_el_min ≤ P_el(t) ≤ u_el(t)×P_el_max这里的u_el(t)是0-1状态变量表示设备启停。引入二进制变量的目的就是为了表达“停机时出力为0启动后运行在最小技术出力以上”这个实际物理特性。储氢罐容量约束SOC_h2_min ≤ SOC_h2(t) ≤ SOC_h2_max以及储氢罐始末状态约束即调度周期结束时储氢量应恢复到初始水平SOC_h2(T) SOC_h2(0)最后这个约束非常重要它保证调度方案是“可持续循环”的不是把整个周期内初始储氢全部耗尽的一次性方案。做优化调度的人都知道没有这个约束模型大概率会在周期末把储氢罐清空来省钱结果没有任何实际意义。3.3 可再生出力的典型日处理方式光伏和风电的出力曲线是调度模型的输入数据。实操中我通常采用两种方式处理采用典型日实测数据从项目所在地的气象数据或已有运行数据中提取按季节或月份选取代表日。采用合成数据叠加不确定性以理论辐照度和风速曲线为基础乘以一个随机扰动系数进行Monte Carlo测试。对确定性模型来说前者就够了。后面的不确定性建模属于另一个层面的研究内容。使用实测数据时有个小建议把数据归一化后再乘上装机容量这样可以方便地做不同装机规模下的对比实验而不用每组参数都重新整理数据。4. Matlab代码实现从建模到求解的完整方案4.1 建模工具选择Yalmip还是纯Matlab线性规划工具箱Matlab里做优化建模主流方案就两个纯脚本调用linprog/intlinprog以及使用Yalmip工具箱。我强烈推荐后者。Yalmip的最大优势在于它允许用接近数学公式的方式直接书写约束和目标函数底层自动完成模型转换和求解器对接。比如一个约束写出来后不用手动展开为标准型矩阵大大减少了排错难度。对综合能源优化这种约束动辄几十上百条的模型来说Yalmip几乎是唯一现实的选择。4.2 求解器配置Cplex还是GurobiYalmip本身不是求解器它只负责建模实际求解放给外部求解器完成。综合能源优化调度问题因为有设备启停变量0-1整数变量和储氢连续性变量是一个混合整数线性规划MILP问题需要商用求解器来处理。这里有个很现实的建议有学术许可的首选Gurobi或Cplex性能强大规模问题也能扛得住。没有商用求解器授权的可以用Yalmip自带调用GLPK或者Matlab的intlinprog小规模算例比如24时段、十几台设备跑起来也没问题。我自己常用的配置是Yalmip Gurobi调度周期用24时段小时级求解时间通常在几秒到几十秒之间完全够用。如果你用的Matlab版本比较新注意Yalmip的安装路径要添加到MATLAB路径中并且求解器要能被Yalmip识别到。4.3 核心代码结构与关键片段解析下面给出一个简化但完整的代码骨架覆盖了从参数定义到结果输出的全过程。%% Step 1: 数据定义 T 24; % 调度时段数 dt 1; % 小时 % 负荷曲线示例数据实际使用时替换为项目数据 P_load [120, 115, ... ]; % 电负荷, kW H_load [80, 75, ... ]; % 热负荷, kW % 可再生能源出力 P_pv [0, 0, 0, 0, ... ]; % 光伏出力, kW P_wt [30, 28, 25, ... ]; % 风电出力, kW % 分时电价 price_grid [0.42,0.42,0.42,...]; % 元/kWh %% Step 2: 定义变量 % 连续变量 P_gt sdpvar(1, T); % 燃气轮机发电功率 P_gb sdpvar(1, T); % 燃气锅炉产热功率 P_el sdpvar(1, T); % 电解槽输入电功率 P_fc sdpvar(1, T); % 燃料电池发电功率电输出 SOC_h2 sdpvar(1, T1); % 储氢罐储氢量含初始状态 % 二进制变量 u_gt binvar(1, T); % 燃气轮机启停 u_el binvar(1, T); % 电解槽启停 %% Step 3: 目标函数 objective 0; for t 1:T objective objective price_grid(t) * P_grid(t); % 购电成本 objective objective price_gas * (P_gt(t)/eta_gt ...); % 购气成本 objective objective c_om_el * P_el(t) c_om_fc * P_fc(t); % 运维成本 end %% Step 4: 约束条件 constraints []; % 电平衡 constraints [constraints, P_grid P_pv P_wt P_fc P_load P_el P_ec]; % 热平衡 constraints [constraints, P_gb eta_fc_h*P_h2_fc H_load H_ac]; % 储氢罐动态 constraints [constraints, SOC_h2(2:T1) SOC_h2(1:T) eta_el*P_el - P_h2_fc]; % 储氢容量上下限 constraints [constraints, SOC_h2_min SOC_h2 SOC_h2_max]; % 始末状态一致 constraints [constraints, SOC_h2(T1) SOC_h2(1)]; % 设备出力上下限 constraints [constraints, u_gt*P_gt_min P_gt u_gt*P_gt_max]; % ... 类似方式添加其他约束 %% Step 5: 求解 ops sdpsettings(solver, gurobi, verbose, 0); optimize(constraints, objective, ops); %% Step 6: 结果提取与画图 P_gt_opt value(P_gt); SOC_h2_opt value(SOC_h2); % 绘图部分略这段代码的意图是展示建模脉络实际运行需要把矩阵维度和各类效率参数补齐。值得提醒的是sdpvar(1, T1)定义储氢量变量时多定义了一个时刻目的是让初始状态和终止状态约束更容易表达不至于出现下标越界。4.4 非线性环节的线性化处理有些环节的建模涉及非线性关系比如燃料电池发电效率随负荷率变化或燃气轮机的热耗量函数是二次曲线。如果把这些非线性直接写进模型问题就从MILP变成了MINLP混合整数非线性规划求解难度和计算时间都会明显上升。工程上最常用的是分段线性化方法。以燃气轮机的热耗量为例把负荷率区间分成35段每一段用一个线性表达式逼近热耗曲线。具体做法是引入分段插值变量Yalmip可以使用implies加辅助二进制变量实现也可以用boundsinterp1提前生成分段系数表格。我在实际项目中验证过用5段线性化去逼近非线性热耗曲线误差通常能控制在3%以内求解时间却比MINLP模型减少一个数量级。对运行调度研究来说投入产出比非常划算。如果某个非线性关系实在无法线性化再考虑用fmincon处理小规模问题。5. 实操过程中遇到的典型问题排查5.1 最常见的模型不可行问题我刚开始跑这类模型时遇到最多的错误是Infeasible problem。求解器直接告诉你模型无解但不会告诉你为什么无解。排查思路我按顺序整理如下检查功率平衡约束是否漏项。电平衡左侧和右侧的潮流项必须完全列全特别是储能设备、电解槽这类“既是负荷又是电源”的设备容易在复制代码时漏掉正负号。检查储氢罐始末约束是否与初始SOC冲突。如果初始SOC设置过低而终止状态又要求恢复到初始值系统可能没有足够的制氢能力在最后几个时段完成补充。检查设备启停约束与出力上下限是否自相矛盾。比如燃气轮机的最小出力设为30kW但某个时段系统最大负荷只有20kW此时若燃气轮机必须开机模型就会不可行。检查可再生出力是否超过负荷上限导致弃光弃风约束不失败。如果光伏出力在全周期都大于电负荷电解槽消纳能力且不允许弃光模型同样无解。排查小技巧把约束数组逐个注释掉跑一次模型确定是哪一类约束导致的不可行。Yalmip也提供了diagnize命令可以查询疑似冲突的约束但这个功能输出信息有限逐条排查往往更高效。5.2 求解结果出现振荡或跳变怎么办求解成功但结果不合理的常见表现是设备出力曲线高频振荡比如燃气轮机在相邻时段从满出力突然降到最小出力或者电解槽开机、停机频繁切换。这背后通常是两个原因。一是没有设置爬坡约束。实际设备没法在小时内从50kW跳到200kW模型却可以于是优化器为了追求全局最优而利用了这种不切实际的灵活性。解决方式是在约束中加上-ramp_gt_max P_gt(t1) - P_gt(t) ramp_gt_max二是目标函数对设备启停没有惩罚。设备开关机存在额外的寿命损耗和能耗代价但目标函数里没有体现模型自然会让设备频繁启停来“省”那几块钱运行费。解决办法是在目标函数中加入启停成本项objective objective startup_cost * (u_gt(t) - u_gt(t-1));注意这个表达式只对u_gt(t)1 u_gt(t-1)0的情况生效需要结合二进制变量确保逻辑正确。5.3 求解时间过长的调优手段MILP问题规模一大求解时间会呈指数级增长。我遇到过一个8台设备、96时段的模型Gurobi跑了二十多分钟还没出最优解。后来做了三个调整直接把时间压到一分钟内简化时间尺度。把96时段合并为24时段用加权平均负荷替代精细化数据。如果研究目标是日调度层面24小时精度通常足够。设置合适的求解精度。给Gurobi设置MIPGap为0.01或0.02即允许1%~2%的最优性偏差求解速度可以提升一个数量级。怎么设置ops sdpsettings(solver, gurobi, gurobi.MIPGap, 0.01);减少二进制变量数量。设备启停变量是二进制变量的主要来源。如果同类型的设备比如两台一样的燃气锅炉可以合并为一台聚合模型变量数量直接减半。这三招组合使用效果明显。实际跑优化调度不必追求严格的全局最优解工程上能接受“近似最优”的情况太多了。6. 从代码到论文/报告结果分析的三个实用视角代码跑通并不是终点把结果“讲出故事”才是项目价值放大的关键。基于我写论文和做项目汇报的经验下面这三个分析视角是评审和甲方最关心的。第一个视角是设备出力时序分析。画一张24小时堆叠图展示燃气轮机、电解槽、燃料电池、电网购电分别承担了多少负荷重点标出氢能设备在哪些时段启动、何时放电。这张图能直观回答“氢能到底在里面干了什么”的问题。第二个视角是经济性对比表。设计三种方案做对比方案A纯购电燃气锅炉无联供、无氢能方案B燃气轮机联供系统无氢能方案C含电解槽储氢燃料电池的完整系统统计三者的总运行成本、购电费用、购气费用、碳排放量做出对比表格。方案B对方案A的成本降低比例、方案C对方案B的边际改善就是整个项目最核心的结论数据。第三个视角是敏感性分析。以碳价或电价为横轴以系统总成本和氢能设备利用率为纵轴做一组曲线。从图上可以清楚地看到当碳价超过某个阈值时氢能设备的年利用小时数显著上升当电价峰谷差缩小时电解槽制氢的套利空间被压缩。这类分析是整个研究报告中最有深度的部分直接支撑结论的普适性。我个人经验敏感性分析里电价峰谷差和碳价这两个参数最值得做。原因很简单——氢能链路的收益来源就是“低买高卖”低谷电制氢高峰发电电价决定了套利空间碳价决定了氢能替代天然气的环保收益值多少钱。两个参数扫描完整个模型的行为特征就非常清楚了。7. 氢能综合能源调度后续扩展方向基础模型跑通以后如果你的项目需要继续深入我建议往下面几个方向扩展。加入需求响应机制。把一部分柔性负荷如温控负荷、电动汽车充电桩纳入优化变量让负荷侧也能参与调节。氢能需求响应的组合系统灵活性会进一步提升。考虑多场景随机优化。光伏和风电出力引入场景生成用场景削减技术提取典型场景集将确定性优化转化为两阶段随机优化模型。这个方向文章容易出成果因为可以对比确定性模型的脆弱性。加入碳交易机制建模。把碳配额、碳交易价格作为外生变量系统可以在碳市场上买卖配额。这比固定碳价惩罚更贴近实际政策环境适合做政策敏感性研究。考虑设备退化建模。电解槽和燃料电池在频繁启停工况下存在效率衰减如果研究周期是全年8760小时可以考虑把设备退化系数纳入模型让调度策略对设备更友好。扩展方向的选取取决于你的项目时间线和目标。如果是学位论文我个人会把重心放在多场景随机优化上这既是学术热点又能在现有确定性模型基础上平滑过渡。最后再分享一个我在实际运行中的体会代码不追求一步到位先把一个最简单的确定性MILP模型跑通、画图、解读结果再逐步加入氢能耦合、碳惩罚、不确定性和其他约束每加一个模块就重新分析一次结果变化。这个迭代开发的方式看起来慢实际上出错最少、成就感也最持续远比一口气写出几百行大模型的成就感来得实际。整个项目跑完最大的收获不是模型多完整、目标函数多复杂而是真正理解了氢能在综合能源系统中的定位它不是替代电储能而是和电储能形成互补一个管短周期、一个管长周期两者配合才能让系统在全时间尺度上都有调节能力。想把这个逻辑说清楚实实在在跑一遍含氢能的优化调度比看十篇综述都管用。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑