ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

火电机组储热改造的低碳经济调度Matlab实现与案例分析

火电机组储热改造的低碳经济调度Matlab实现与案例分析 这两年做电力系统调度优化尤其在北方地区的新能源场站和火电企业里“新能源消纳压力大但火电调峰能力不足”几乎是每个调度方案都绕不开的第一道坎。我最近在跑一个项目——考虑火电机组储热改造的电力系统低碳经济调度核心是用Matlab把储热改造后的火电机组建模到经济调度框架里在碳排放约束和新能源消纳目标下求解最优出力组合。这个模型跑通后最直观的收益是冬季供热期弃风率降下来了系统总成本反而比原来更低。这篇文章就围绕这个项目的背景、数学模型、Matlab实现和踩坑过程展开适合电力系统方向的研究生、做火电灵活性改造评估的工程师以及所有想用代码落地“双碳”调度策略的朋友参考。火电灵活性改造听着复杂但落到调度模型里其实就一件事给“以热定电”的那部分热电机组加一个缓冲池让电出力和热出力不再是死死的绑定关系。加了储热罐之后机组在风电大发、负荷低谷时段可以把多余的热量先存起来电出力降下去风电多上网等需要供热时再放热补足。这个思路既能保供热又能给新能源腾空间还顺手降低了单位电量的碳排放强度属于典型的“结构性收益”。下面我从项目动机、模型搭建、代码实现、结果分析和问题排查五个部分完整复盘一遍这个项目的推进过程。1. 项目动机火电机组的灵活性困境与储热改造的价值1.1 新能源并网给火电机组带来的真实压力风电和光伏的装机容量这些年涨得非常快但电网能消纳多少新能源不取决于新能源自己而取决于系统里其他电源的调节能力。火电机组是目前调节能力最主要的提供者问题恰恰出在这里普通凝汽式机组的最小技术出力一般能做到额定出力的30%到50%调峰深度还有限而北方大量存在的热电联产机组冬季要保供热电出力下限被“热负荷”死死拽住很多机组在最冷的时候电出力根本压不到50%以下。新能源出力是波动的风电后半夜往往大发但这时候负荷恰恰处在低谷热电联产机组又因为供热需求不能深度压低出力电网只能让风电弃掉。我在实际算例里见过非常典型的场景某地区冬季夜间风电预测出力超过总负荷的40%但因为热电机组压不下去最终弃风率接近20%。弃风不仅浪费清洁电量还会推高系统整体的碳排放强度——同样一度电风电不上网就得让煤电多发碳排放自然降不下来。这就是储热改造要解决的核心痛点在保证供热安全的前提下把热电机组的电出力下限往下挪给新能源留出消纳空间。1.2 储热改造如何打破“以热定电”的硬约束抽汽式热电联产机组的运行特性可以用“电出力-热出力可行域”来描述。简单说机组的电出力下限不是一个固定值而是随供热抽汽量变化的函数供热量越大最小电出力越高。常规调度里这个约束必须严格满足——供热季的热负荷曲线定下来了机组能压到多低的电出力基本也就定下来了。加入储热罐之后情况就变了。储热装置本质上相当于一个热量的“蓄水池”负荷低谷、风电大发时机组维持相对较低的电出力同时把供热抽汽的一部分导向储热罐暂存热负荷需求由储热罐放热来补足等到负荷高峰、机组提高电出力时再从储热罐取热或者让机组多抽汽补上供热缺口。这个操作的专业说法叫“热电解耦”——电出力和热出力不再是同一个瞬时的硬绑定中间多了一个缓冲环节。调度模型里这个改造体现在约束上就是热电联产机组的可行域发生了变化。改造前机组出力下限是当前热负荷的直接函数改造后热负荷可以由“机组实时抽汽储热罐充放热”共同承担机组电出力下限的约束就被松开了。这个松开的幅度有多大取决于储热罐的容量和最大充放热功率。所以理论上储热罐越大电出力下限能压得越低风电消纳空间也越大。1.3 为什么储能方案偏偏选了储热我在做方案对比的时候也考虑过其他储能形式比如电化学储能、电锅炉、固体蓄热等。最后项目里选了储热罐主要是从三个维度权衡。第一是成本。电化学储能的度电成本目前依然偏高而且容量做大以后投资巨大储热罐本质就是一个大热水罐加上换热设备单位蓄热容量的造价要低一个数量级回收期也在可接受范围内。第二是耦合度。储热系统和热电机组的热力循环天然匹配它消纳的不是“额外的电”而是机组本身已经产生的蒸汽热量能量品位匹配转换损失小。电锅炉则是把电再转成热相当于用高品位能量去制造低品位热量系统整体效率反而下降。第三是技术成熟度。储热罐技术在供热工程领域已经很成熟运行控制不复杂运维门槛低。对火电厂来说改造风险小更容易落地。当然储热也不是万能的它只能解决“热-电耦合”造成的调峰受限问题如果系统短板是电功率调节能力本身那还是要配合其他手段。2. 低碳经济调度的数学模型搭建2.1 目标函数碳排放成本与运行成本的权衡低碳经济调度和传统经济调度的最大区别就是目标函数里多了碳排放这一项。我的模型采用最小化系统总成本的单目标形式总成本包括四部分火电机组煤耗成本、机组启停成本、碳排放成本、弃风弃光惩罚成本。煤耗成本是常规的二次函数形式每一台火电机组都有各自的煤耗系数出力不同、煤耗不同。碳排放成本则采用“配额阶梯碳价”的机制——每台机组根据额定容量和运行状态获得一个初始免费碳排放配额实际排放量如果低于配额富余部分按碳价出售获得收益如果超出配额超出部分按阶梯价格购买。阶梯碳价的意思是超出量越大单位碳价越高这样做的好处是能更真实地模拟碳市场的惩罚力度也避免模型为了省钱而过度超排。弃风弃光惩罚成本写作惩罚系数乘以弃电量这个系数要设得足够高比如比火电边际成本高一倍以上否则模型会发现弃风比调火电便宜宁可弃风也不压火电出力那就失去低碳调度的意义了。目标函数说白了就是让决策变量找到一个组合既满足系统所有运行约束又能让煤耗、启停、碳排、弃风四项总成本最小。这个模型本质是一个混合整数线性规划问题因为机组启停和储热充放状态需要用到0-1整数变量。2.2 约束条件设备特性与系统运行规则的数字化表达约束是调度模型里最需要细心的地方我按物理过程拆成五组来说。第一组是电力平衡约束。任意时段所有机组出力、风电出力、光伏出力之和等于系统负荷。这个约束是刚性的功率不平衡系统就无法运行。第二组是火电机组自身约束。包括出力上下限约束——机组运行时出力在最小技术出力和额定容量之间停机时出力为0爬坡约束——相邻时段出力变化不能超过机组的爬坡速率最小启停时间约束——机组不能频繁启停这个约束在工程上很重要但在很多简化模型里会被省略我建议第一次跑通模型时不加后面再补。第三组是热电联产机组的特有约束。改造后热负荷平衡关系变为机组实时供热量加上储热罐放热量等于热负荷加上储热罐充热量。这个等式非常容易写反方向我一开始就吃过这个亏后面专门在调试部分讲。第四组是储热罐约束。包括储热容量上下限、最大充放热功率、储热罐热损失以及最重要的状态更新方程下一时段的热储量等于当前热储量乘以热保持系数加上充热功率乘以充热效率再减去放热功率除以放热效率。如果不加特别的物理约束模型可能让储热罐同时充热和放热这在物理上虽然不一定禁止但会造成不必要的热损失我采用的办法是加一个充放热状态互斥约束同一时段充热功率和放热功率要么一个为0要么至少被压到很小的值。第五组是周期衔接约束。储热罐初始热储量要给定调度周期末尾的热储量一般要求回到初始值或者不低于某个安全值否则模型会把储热罐里的热量在一天结束时全部放光下一周期的调度就失真了。2.3 关键参数的设计思路与计算过程调度的调度周期取24小时时间步长取1小时这个尺度对日前的机组组合和经济调度来说是主流选择——既能看到日内负荷和新能源的波动过程又不至于因为步长太细导致计算量爆炸。算例里我设置了4台火电机组其中2台为热电联产机组且配有储热罐另外2台为纯凝式机组新能源部分包含1个风电场和1个光伏电站。热负荷曲线按冬季典型日设置峰谷差约40%电负荷曲线则参考某地区实际负荷形状。储热罐的基准容量设为300 MWh最大充放热功率50 MW充热效率95%放热效率95%热损失率每小时0.5%。初始热储量设为容量的50%周期末要求回到初始值的90%以上。碳排放配额按机组额定容量乘以单位配额系数计算阶梯碳价设置了三档超排量在0-50吨以内按80元/吨50-100吨按120元/吨超过100吨按180元/吨。这些参数不是随便拍的我在调试时做过敏感性测试后面第4部分会展示容量变化对结果的影响。3. Matlab实现从搭建模型到求解出结果3.1 代码架构与数据准备这类调度项目用Matlab实现我建议按“数据-模型-求解-后处理”四层来组织文件而不是把所有代码塞在一个脚本里。我实际用的是这样一套目录结构data_units.m定义火电机组参数、储热罐参数、新能源预测出力、负荷曲线build_model.m基于Yalmip构建决策变量、目标函数和约束solve_model.m调用求解器求解提取结果plot_results.m绘制出力时序图、SOC曲线、成本对比图数据初始化是整个项目的地基千万别小看这一步。我习惯把所有参数集中写在结构体里比如unit{i}.Pmax、unit{i}.Pmin、unit{i}.a表示煤耗二次项系数这样后面写约束时引用起来清晰很多。风电场预测出力我用的是一条约0.4幅度的夜间高、白天低的典型曲线再叠加小幅随机扰动光伏出力则按午间峰值、早晚为零的经典形状生成。在这个算例里风电场额定容量300 MW光伏电站额定容量100 MW系统最大电负荷约900 MW。冬季夜间风电大发时预测出力能达到250 MW左右而热负荷也处在最高区间如果不做储热改造热电机组电出力下不去风电必然大量弃掉——这组数据的设计就是故意让“弃风困境”在基准场景里清晰暴露出来。3.2 Yalmip建模与求解器配置约束建模我用的是Yalmip工具箱。Yalmip最大的好处是把数学表达式写得很贴近原生的数学语言不用手写系数矩阵。决策变量的定义方式如下P sdpvar(nUnit, T); % 各机组电出力nUnit行T列 U binvar(nUnit, T); % 机组启停状态0-1变量 H_ch sdpvar(T, 1); % 储热罐充热功率 H_dis sdpvar(T, 1); % 储热罐放热功率 SOC sdpvar(T, 1); % 储热罐热储量 B_ch binvar(T, 1); % 充热状态1表示允许充热 B_dis binvar(T, 1); % 放热状态1表示允许放热目标函数用sdpvar表达式直接累加约束用[]拼接后传给optimize。Yalmip的语法对初学者比较友好尤其适合做快速原型验证。求解器我优先用Gurobi其次是CPLEX实在没有商业求解器的环境里可以退回MATLAB自带的intlinprog。求解器设置里最关键的参数是MIPGap也就是混合整数规划的最优性间隙。调度模型是24时段、多机组加储热状态的MILP问题Gurobi默认的1e-4精度要跑很久我实际调到0.01就能在可接受时间内得到工程上足够好的解。调用方式是这样ops sdpsettings(solver, gurobi, verbose, 2); ops.gurobi.MIPGap 0.01; optimize(Constraints, Objective, ops);这里的底层逻辑是“用可接受的精度损失换取求解速度”。MIPGap设置成0.01意味着找到的解距离最优解不超过1%对于日前的调度方案来说这个误差基本不影响决策结论但求解时间可能从半小时缩到两三分钟。我在项目里反复调整过这个参数后面专门有一节讲怎么平衡精度和速度。3.3 对结果做后处理与可视化求解完成后value(P)可以取出各机组各时段的出力数值value(SOC)取出储热罐热储量曲线value(H_ch)和value(H_dis)分别取出充放热功率。我一般先汇总四个关键指标系统总成本、总碳排放量、弃风率、储热罐利用率做成一个结构体输出方便不同场景间做横向对比。画图部分我做得比较细。机组出力时序图画成堆叠面积图可以直观看到每台机组在不同时段的承担比例储热罐SOC画成阶梯曲线和电负荷曲线放在同一个时间轴上看相位关系弃风量单独画柱状图用于表达“改造前弃风明显、改造后几乎没有弃风”的视觉效果。图表是给论文或者项目汇报用的所以坐标轴标注、图例、字体大小这些细节我都会统一设置看起来专业很多。4. 仿真场景设计与结果分析4.1 场景对比基准调度 vs 储热改造调度为了衡量储热改造的价值我设计了两个完全同条件的场景。基准场景里热电联产机组不带储热罐电出力下限直接由热负荷曲线决定改造场景里加入300 MWh储热罐热负荷可以由抽汽和储热罐共同满足。其他条件——系统负荷、新能源预测出力、机组参数、碳价机制——全部保持一致。两个场景跑完之后差异非常明显。基准场景里夜间风电大发时段有两台热电机组因为供热约束压不到低出力弃风率接近15%改造场景里储热罐在夜间吸收多余热量热电机组电出力顺利压到更低水平风电几乎全额消纳弃风率只有1.8%。这个对比直接回答了项目立项时最想验证的问题储热改造到底能不能有效提升新能源消纳空间。答案是肯定的而且效果远超我最初的预期。4.2 关键指标解读成本、碳排放、弃风率我用一张表把两个场景的核心指标列出来这样项目汇报时信息传递效率最高指标基准场景储热改造场景变化系统总成本万元142.6136.8-4.1%总碳排放量吨21802015-7.6%弃风率%15.21.8-13.4%火电煤耗总量吨标煤845782-7.5%总成本下降的主要原因是风电免费且零碳多消纳的风电替代了一部分高价煤电碳排放下降则来自两个渠道——风电替代煤电的直接减排以及热电机组更灵活的出力方式带来的煤耗改善。这里有一点值得注意储热罐本身有热损失从能量效率角度看储热路径其实比直供热路径损失更大但因为它换来了新能源的大幅消纳系统整体收益仍然是正的。这是一笔“小损失换大收益”的账做工程经济分析时不能只看单点效率要站在系统层面看综合效果。4.3 储热容量与调度结果的敏感性分析项目里另外做了一组储热容量敏感性测试容量从0到500 MWh、以50 MWh为步长循环求解观察总成本和弃风率的变化轨迹。结果呈现出一个非常典型的“边际收益递减”规律容量从0增加到150 MWh时弃风率快速下降总成本降幅明显容量增加到300 MWh以后收益曲线明显变平再扩大容量对结果的改善就非常有限了。这个转折点背后有清晰的物理原因储热罐需要覆盖的核心是“夜间风电大发时段的热负荷缺口”这个时段的累计热量需求大约对应容量100到200 MWh就能覆盖大半继续加大容量只是在覆盖更边缘的时段收益自然递减。这就给出了投资决策上一个很实用的结论储热罐容量不是越大越好而是存在一个经济最优区间在项目前期策划时应该通过类似的敏感性分析来确定合理的容量范围而不是凭经验拍脑袋。我还对充放热功率做过一次测试结论是功率上限从30 MW提升到80 MW时调度结果改善幅度有限因为制约系统灵活性释放的主要瓶颈在容量侧而非功率侧。这类敏感性分析做进项目里能帮助决策者把有限的改造资金花在刀刃上。5. 实操中的常见问题与排查实录5.1 模型无解的排查思路这是我在这类项目里遇到最多的问题没有之一。模型无解时Yalmip会返回“Infeasible problem”但不会告诉你哪条约束出了问题。我的排查顺序是三层递进。先把所有二进制变量固定成一组可行的初值比如机组全部开机、储热罐不充不放看连续变量部分是否有解。如果这一步就无解说明问题出在基础约束上优先检查功率平衡和机组出力上下限。然后再放开储热罐充放约束看看是不是SOC更新公式和容量约束冲突最后再放开整数变量如果此时无解问题基本出在启停状态或者充放热互斥约束上了。我用这个思路定位过一次很隐蔽的问题储热罐初始SOC给了150 MWh但同一时段最大放热功率只有50 MW而热负荷高达80 MW储热罐加上机组最大抽汽也满足不了热负荷平衡——热平衡约束从第一个时段就挂了。这种问题如果不按层级排查只盯着Yalmip报错信息看很容易浪费时间。5.2 求解时间过长与MIPGap调整24时段的小规模MILP按理说不难解但当我把最小启停时间约束也加进去之后求解时间一下子从几分钟涨到半个多小时因为二进制变量之间多了时序耦合关系分支定界的搜索空间急剧膨胀。这个问题在工程上很常见我的处理方式是分两步。第一步把MIPGap从默认的1e-4放松到0.01求解时间通常能缩短一个数量级以上而结果差距通常在0.5%以内。第二步检查约束是否存在冗余比如机组启停约束里如果某台机组额定容量很小、启动成本很低它对整体优化结果影响有限可以先固定它的运行状态把计算资源留给主要矛盾。实际项目里我一般把MIPGap放松放在优先位置绝大多数情况下就够了。5.3 建模阶段的典型细节坑第一是量纲问题。功率单位是MW能量单位是MWh储热罐SOC更新公式里SOC的变化量等于充放热功率乘以时间步长。时间步长是1小时数值上恰好等于1但我见过不止一次因为默认“功率乘以1”就不用写乘结果在步长改成半小时或者两小时的项目里整个SOC曲线错乱。我的习惯是即便乘1也显式写出来确保公式可移植。第二是热平衡方向。正确的写法是“机组供热量 储热罐放热量 热负荷 储热罐充热量”这个加号减号的位置我在项目初期就写反过一次症状是储热罐在夜间疯狂充热、白天疯狂放热结果和预期完全相反。排查时只要把SOC曲线和热负荷曲线画在同一张图上对比相位立刻就能发现问题。第三是初始SOC与末尾SOC约束。如果不设置周期末SOC下限模型会倾向于在最后一个时段把储热罐热量全部放完因为这样能多满足一些热负荷、减少机组出力表面看成本降了但实际运行中下一个调度周期根本无法衔接。所以末尾SOC约束不是可选项是必须加的。第四是矩阵维度不匹配。Yalmip对矩阵维度校验很严格报错信息又比较晦涩。我在用binvar定义充放热互斥状态时经常遇到矩阵是T×1但约束里不小心写成了1×T导致整个约束维度错位。解决方案很朴素每次定义变量后先用size()打印维度确认无误再往下写。第五是弃风惩罚系数设得不够高。前面提过如果惩罚系数低于火电边际成本模型会“理性”地选择弃风最终的调度方案在经济上最优但完全违背低碳初衷。我的经验是惩罚系数至少取火电平均边际成本的一倍以上再配合碳排放成本才能让“优先消纳新能源”这个目标真正落到结果上。6. 个人体会与扩展建议项目做到最后我自己最大的体会是储热改造不是“加了罐子就完事”它的价值必须放在整个系统的调度框架里才能完全释放。模型跑通只是第一步真正有价值的是用敏感性分析找到储热容量的合理区间以及对不同政策场景做对比测算——比如碳价从80元/吨变成200元/吨时储热改造的经济性会发生多大变化。这类分析拿出去和电厂或者电网的人讨论比单纯丢给他们一组曲线有说服力得多。如果你是自己复现这个项目我的建议是从一个小算例入手先跑通不带储热罐的基准经济调度确认所有约束和结果都合理再加一个固定容量的储热罐观察SOC曲线是否符合物理直觉最后再做容量敏感性分析。每一步都验证清楚再往下走排查问题会轻松很多。Matlab加Yalmip的组合在快速建模和结果可视化方面确实比 Python 生态顺手不少但如果你后面要做更大规模、更强随机性的场景也可以考虑把模型迁移到 Python 的 Pyomo 或者 Julia 的 JuMP底层求解器完全可以复用。调度优化这条路模型框架是相通的换工具只是换一层皮。
返回列表