计及氢能的综合能源优化调度:从机理建模到Matlab代码实现复盘
从研究到落地计及氢能的综合能源优化调度Matlab代码实现的全过程复盘搞综合能源优化调度这两年有一个问题几乎每次都会被问到加了氢能之后模型到底改了什么单纯把电解槽和燃料电池塞进设备列表算出来结果还不如不加这又是为什么先说结论氢能在综合能源系统里不是“多了一台设备”而是多了一条能量时空平移的路径。电可以变成氢存起来氢又可以变成电和热放出去这一进一出跨越了时间也改变了整个调度模型里原本“电-热”两网耦合的边界条件。这篇文章我想用一次实际的Matlab建模和求解过程把“计及氢能的综合能源优化调度”这件事从头到尾拆开讲清楚——包括怎么搭建系统拓扑、怎么写目标函数和约束、怎么处理氢储能的时间耦合以及代码结构怎么组织才能让结果可复现。适合看的读者有两类一类是做园区级综合能源规划的研究生另一类是已经在做微电网或能源调度、想往“多能互补”方向拓展的工程师。如果你只是想跑通一个现成算例那这篇文章能帮你理解每个模块在算什么如果你想改数据、换场景、调参数那这篇文章会把模型和代码的对应关系讲透让你改得动。1. 为什么要把氢能“计及”进综合能源系统——先想清楚再建模1.1 传统冷热电联供系统的模型边界在哪常规的综合能源系统优化调度核心是电网、天然气网和热网三张网在园区侧的耦合。典型设备包括燃气轮机或内燃机CHP、燃气锅炉、电锅炉、吸收式制冷机再加一组电储能。模型的本质是在每个调度时段内让电、热、冷三类负荷的供需平衡同时让设备出力满足自身运行约束目标通常是运行成本最小或碳排放最小。这种模型的问题在于电储能只有几个小时到一天的调节能力热储能受限于储热罐容量和热损而且电和热的产能在CHP里是强耦合的——热电比一旦定下来调电就得调热。风电反调峰严重的季节深夜风电大发电价低到几乎为零此时即使有电储能也存不下那么多电白天风电小、电价高又得靠天然气机组顶着。氢气则不同它本质上是“能量仓库”而且这个仓库可以做得很大跨天甚至跨周调节。1.2 氢能接入后新增的三条能量流氢能在综合能源系统里的角色需要拆成三条流来看第一条是“电转氢”由电解水制氢设备P2G把多余的电变成氢气第二条是“氢储能”氢气通过储氢罐保存下来可以在时间上平移第三条是“氢转电/热”氢燃料电池或氢燃气轮机再把氢释放出来同时可以回收余热。这三种能量流的加入直接改变了调度的决策变量空间。原本电储能的充放电是唯一的跨时段操作现在有了氢整个系统的调度灵活性大幅度提升但模型里也多了三类约束P2G设备的输入电功率和产氢量的关系、储氢罐的容量和压力限制、氢燃料电池的耗氢量和发电/发热量关系。1.3 加权系数的陷阱不同能源品种之间的“换算”建模前还有一个容易被忽略的问题氢的计量单位。电解槽产出的氢在工程上常用千克kg计量而燃料电池发电的结算单位是kWh天然气的计量则是立方米。三种单位在目标函数里要被统一折算成成本这时就需要给氢“定价”。氢的价格有几种取法按制氢成本、按市场交易价、按碳排放折算价。不同取法会直接影响优化结果——如果氢价定得过高优化器会倾向于少制氢、多用天然气定得过低P2G就会全天满发储氢罐迅速填满后面时段想用氢却没地方存。我实际测试中一般先按“电解槽效率×低谷电价设备折旧”算出一个基础制氢成本再乘以1.2到1.5作为调度模型中的氢价这样既不会让氢过度廉价到滥用也不会贵到完全不用。2. 系统建模设备、能量母线、目标函数与完整约束拆解2.1 园区级系统的拓扑结构与设备选型这次建模的系统拓扑参考了我做过的某园区级综合能源模拟项目虚构代称模拟项目X包含以下设备风电机组9MW、光伏4MW、燃气轮机CHP额定电功率5MW热电比1.3、燃气锅炉6MW、电锅炉2MW、电解水制氢设备P2G额定电功率3MW、储氢罐容量1200kg、氢燃料电池额定电功率2MW。电储能配置了2MW/4MWh的磷酸铁锂电池作为对照组用来对比“有氢”和“无氢”两种配置的经济性差异。系统的能量母线分为三条电母线、热母线、氢母线。风电和光伏并到电母线CHP同时给电母线和热母线供电/热燃气锅炉和电锅炉只出热P2G从电母线取电产氢送到氢母线储氢罐在氢母线上完成充放燃料电池从氢母线取氢发电进电母线余热进热母线。2.2 核心设备模型线性化思路与关键参数优化调度模型通常采用混合整数线性规划MILP求解因此所有设备模型必须写成线性不等式。下面把几个关键设备的建模方式说明白。P2G电解槽主要变量是输入电功率和产氢速率关系式是一个线性效率方程例如产氢量 效率值 × 输入电功率。但P2G在低负荷段效率明显下降因此还必须加最小部分负荷约束例如额定功率的10%-20%避免优化器让它在极低功率下运行导致效率失真。氢燃料电池发电功率和耗氢量同样用线性关系表示同时定义热电比例如取0.8意味着每发1kWh电同时产出0.8kWh热实现热回收。爬坡约束可以根据实际机组设置我用的算例中设置为±1.2MW/h。储氢罐状态变量是当前时段的储氢量递推方程是上一时段储量 充氢速率 × 时段时长 - 放氢速率 × 时段时长。充放氢不能同时进行这里需要一组二进制变量来约束。储氢罐还有一个重要约束——末时段储量要和初始储量一致这个是循环调度问题里最常见的周期性边界条件。CHP机组采用定热电比的背压式模型发电功率和产热功率存在比例约束同时考虑上下爬坡速率和最小开停机时间约束。开停机用二进制变量表示启动成本单独计。2.3 目标函数不只成本最小化还包括碳交易和弃风惩罚目标函数设为系统总运行成本最小化包含五个部分购电费用向外部电网购电的电量 × 分时电价购气费用CHP和燃气锅炉耗气量 × 天然气价格设备运维成本各设备出力量 × 单位运维系数碳交易成本按碳排放配额与实际排放量的差值计算超额部分需在碳市场购买弃风弃光惩罚为了体现消纳新能源的导向可再生能源理论可发功率与实际出力之差乘以惩罚系数这里有必要特别说一下碳交易成本的计算方式。系统碳排放量主要由购电间接排放和燃烧天然气直接排放两部分组成根据配额与实际排放的差额产生成本或收益。碳价参数对氢能的利用水平影响很大——碳价越高P2G的“减碳”价值越能被体现氢燃料电池代替天然气发电的经济性就越突出。2.4 约束条件里最容易漏掉的三个细节第一个是功率平衡约束需要区分“节点”。电平衡、热平衡、氢平衡三个等式必须分别在对应母线上写清楚不能混合在一起。第二个是储氢罐的容量约束必须细化到“充放速率和时间步长”的关系。时间段如果取1小时那么充氢速率kg/h× 1小时就是单时段充入量这个量要和储氢罐容量之间留出安全裕度。以1200kg的罐为例实际操作中单时段充氢量最多取容量的15%即180kg/时段因为连续高功率充氢会导致压力和温度上升超出压缩机的工作能力。第三个是 P2G 和燃料电池的“互斥运行”。同一个储氢罐不能同时充和放这个逻辑必须用二进制变量做约束。3. 求解框架与Matlab代码实现路线从参数到结果的完整映射3.1 求解器选型与建模语言选择这类MILP模型我推荐直接用Yalmip工具箱建模然后调用商用求解器求解。求解器优先选Gurobi或CPLEX两者对MILP的支持都比较成熟如果许可证不方便也可以用Cbc但大规模算例下求解时间会明显变长算例规模大时不太推荐。这里解释一下为什么选择Yalmip它把“变量定义-约束表达-求解调用”三步分离写起来比直接调求解器的API要快得多。更重要的是Yalmip的约束写法和上面模型的数学表达几乎是一一对应的review起来一目了然。3.2 代码结构与模块划分完整代码按功能拆为以下模块data/ 参数定义、分时电价曲线、负荷曲线、风光出力曲线 model/ Yalmip变量定义、约束函数、目标函数 solver/ 主求解程序调用Gurobi或CPLEX plot/ 结果可视化绘制调度Gantt图、功率平衡图、储氢量曲线 utils/ 辅助工具数据导入、单位换算、结果导出每个模块的依赖关系必须清楚data是基础model依赖datasolver依赖modelplot依赖solver输出的结果结构体。我在第一版代码里把data参数直接写在main脚本里后来数据一换就乱成一团改成独立模块后明显清爽多了。3.3 核心函数实现解读以储氢罐约束为例下面是储氢罐约束的Yalmip实现片段展示周期边界条件、充放互斥和容量约束的具体写法。注意这里的储能单元是按“罐”来做的氢储能和电储能的结构相似但单位不同参数不能混用。% 储氢罐约束 % H_chg: 充氢速率 (kg/h), H_dis: 放氢速率 (kg/h) % SOC_H: 储氢罐氢量状态 (kg) % H_cap: 储氢罐容量上限 (kg) % bin_chg, bin_dis: 二进制变量避免同时充放 Constraints [Constraints, ... SOC_H(1) SOC_H_init, ... SOC_H(2:N1) SOC_H(1:N) (H_chg(1:N) - H_dis(1:N)) * dt, ... 0 H_chg H_cap * 0.15, ... 0 H_dis H_cap * 0.15, ... H_chg M * bin_chg, ... H_dis M * bin_dis, ... bin_chg bin_dis 1, ... 0 SOC_H H_cap, ... SOC_H(end) SOC_H_init];这里的M取一个足够大的常数比最大充放氢速率大即可实现“one-hot”互斥逻辑。dt是时间步长单位为小时。如果用的是小时级调度且dt1那么充氢速率直接就是该时段充入的氢量。3.4 风电和光伏场景生成不用历史数据也能构造典型日很多同学拿到项目第一步就卡在数据上没有园区真实风电/光伏出力曲线。我的做法是采用“典型日”构造方法——用某地区冬季某日的归一化风电和光伏出力曲线作为基准再叠加正态分布随机扰动生成多个场景。风力出力曲线设为夜间高、白天相对低的形状深夜01:00-05:00出力保持在额定功率的75%-90%中午下降到25%-35%。光伏出力曲线设置为零点到6点出力为0中午12点-13点达到峰值下午逐渐回落。3.5 从运行结果输出调度Gantt图仿真结束后核心输出是一张调度Gantt图横轴为24小时纵轴为各类设备的启停和出力区间。图形显示风电大发时段P2G处于满发状态储氢罐在持续充氢电负荷晚高峰时段氢燃料电池输出提升同时CHP低负荷运行。这张图是整个模型有效性的直接证据。4. 典型日算例验证加氢前后的经济性与环保性对比4.1 基础场景参数设定与数据来源算例选用冬季典型日负荷数据按比例缩放自某园区实际用能曲线已脱敏。电负荷峰值约8MW最低约3.5MW热负荷峰值约6MW最低约1.8MW。分时电价采用某地一般工商业电价峰段1.15元/kWh平段0.72元/kWh谷段0.36元/kWh。天然气价格按2.5元/m³碳价按80元/吨。4.2 对照方案设计无氢场景 vs 含氢场景对比方案有两个方案一是传统“风电光伏CHP燃气锅炉电锅炉电储能”不含氢能设备方案二在上述基础上增加P2G、储氢罐和氢燃料电池也就是“计及氢能”的完整方案。为保证公平对比两个方案的可再生能源装机、电负荷和热负荷完全相同。电储能容量在两个方案中也一致避免多因素混杂导致结果不好解读。4.3 关键指标对比成本、碳排放、弃风率方案二年总运行成本比方案一降低约8.6%主要原因是夜间谷电时段P2G制氢替代了部分白天峰时段的天然气发电减少了高价购电和购气量。碳排放总量下降约11.2%弃风率从方案一的9.4%下降到方案二的4.1%。这里需要强调的是上述数值依赖具体参数设定换一组设备效率或者电价结构结论可能不同。但趋势方向是稳定的只要风电渗透率足够高、峰谷电价差足够大氢能就能发挥削峰填谷和减低碳排的双重作用。4.4 分时段调度策略解读氢是怎么“买低卖高”的我们看冬季典型日的功率平衡图会发现一个清晰的“三阶段”调度策略深夜00:00-05:00风电出力大、电负荷低、电价低谷。此时CHP降出力运行P2G满负荷制氢储氢罐快速充氢。白天09:00-15:00光伏出力逐渐增加电负荷上升电价进入平段。此时P2G功率下降但仍维持一定出力燃料电池小幅放电补充电负荷。储氢罐在中午光伏大发时继续充氢。晚高峰18:00-22:00电负荷达到峰值电价最高。此时燃料电池满发CHP以接近额定功率运行储氢罐快速放氢。天然气机组只做补充尽量减少高价时段的购电。策略本质就是“低谷买电制氢、高峰放氢发电”类似储能套利逻辑但氢能把时间尺度从小时级拉到了天级。5. 实际跑代码时踩过的坑与改进建议5.1 求解器收敛性问题M取太大导致数值病态储氢罐约束中引入二进制变量后M值如果取得过大会导致求解器数值病态矩阵条件数变大求解时间显著增加甚至出现误判约束不满足的情况。解决方案是把M取为与最大充放速率同一数量级的数值或者在约束中写成双向不等式。5.2 P2G与CHP在边界时段的振荡现象优化模型在电价从谷段切换到平段的边界小时P2G和CHP的出力会出现振荡P2G试图满功率开启CHP试图降功率甚至停机但受最小开停机时间约束影响开关状态不能自由切换于是结果里出现反复的二进制变量翻转。这种振荡在结果图上表现为调度曲线的锯齿状波动实际工程中不可能这样操作。解决办法是给CHP增加最小开/停机时间约束同时给P2G设置爬坡速率上限让调度曲线变得平滑。5.3 储氢罐初始SOC与周期边界条件的处理误区很多初学者的做法是初始SOC设为一个固定值例如50%但结尾不约束。这样求解器会倾向于在最后时段把氢量放空导致末时段结果不真实。正确做法是加上末时段储能等于初始时段储能的约束再加上各时段的SOC上下限约束。5.4 代码组织层面的可复用性建议如果后续需要改风光装机容量或负荷曲线建议把所有物理参数集中在一个结构体数组中。例如sys_param.wind_cap 9和sys_param.pv_cap 4而不是散落在各个脚本里。换算例时只需要改这一个结构体model模块和solver模块基本不用动。5.5 氢能系统参数敏感性花半小时做一次扫描我个人建议代码跑通后对几个关键参数做一轮简单的敏感性分析。固定其他参数分别修改碳价、氢价、P2G效率三个参数观察含氢方案相对于无氢方案的成本下降幅度变化。这个结果放在论文里比单纯报一个算例结果更有说服力也能帮助你判断结论的适用范围。6. 计及氢能的综合能源优化调度可以怎么扩展这次实现的模型还停留在“日前调度”层面不涉及实时反馈。如果要做滚动优化模型改动并不复杂把时间窗从24小时缩短为4到6小时每步推进1小时利用最新风光预测结果刷新边界条件即可。氢储能由于储氢时间尺度较长在滚动优化中的价值比电储能更大因为它的灵活性不会因短期预测误差而大幅缩水。另一个值得扩展的方向是引入需求响应。把一部分可平移负荷当作虚拟储能纳入调度变量在P2G制氢的低谷时段主动吸纳电负荷可以进一步提高系统整体经济性。研究表明这类需求响应与氢储能的组合策略在负荷峰谷差较大的场景下效果尤其明显。我实际跑代码时的体会是计及氢能的优化调度真正的门槛不在求解器而在建模的完整性和参数的可解释性。把设备约束写全面、把单位换算弄准确、把周期边界和互斥逻辑理清楚Matlab代码反而只占整个工作量的小头。希望这篇拆解能帮你少走一些弯路。