ARTICLE DETAIL

资讯详情

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

火电机组储热改造与低碳经济调度Matlab建模实战

火电机组储热改造与低碳经济调度Matlab建模实战 前阵子有个做调度方向的朋友找我聊说他们在做一个“火电机组储热改造电力系统低碳经济调度”的课题Matlab代码折腾了很久总是出不来想要的效果。这类题目在新能源渗透率不断提高、火电从主力电源转向调节性电源的大背景下确实很有现实意义。我把自己做这类项目的完整思路、模型构建、代码落地和踩坑经验整理了一下写出来给正在做相关方向的同行和同学参考。先说清楚这项目到底是干什么的火电机组储热改造本质上是给热电联产机组加装一套储热装置热水罐、固体储热、熔盐储热等让机组的电出力不再被热负荷完全“绑架”低碳经济调度则是在满足系统电热负荷平衡的前提下综合考虑燃煤成本、碳排放成本、弃风惩罚等通过优化算法求出未来一天或更长时段各机组的最优出力计划。整个项目用Matlab做建模和求解核心是把一个含0-1整数变量、时段耦合约束的优化问题转换成可求解的MILP混合整数线性规划模型。这个方向非常适合三类人看一是电力系统专业的研究生和工程师想搞懂热电联产灵活性改造怎么建模二是做优化调度的同学想学YALMIPCplex/Gurobi落地一个完整案例三是纯粹想理解“储能/储热到底怎么在电网里发挥价值”的读者。下面从头到尾过一遍。1. 为什么做储热改造热电联产机组的“以热定电”困境1.1 一个调度员的真实痛点供暖季夜间最怕什么我国北方很多地区冬季供暖主要靠热电联产机组这类机组有个核心特点只要在供热发电出力就跟着热负荷走。抽凝式机组好一些可以在一定范围内调节但最小电出力仍然会被热负荷抬得很高背压式机组更彻底电出力差不多等于热负荷乘一个固定电热比完全没有独立调节空间。这就带来一个特别现实的调度问题供暖季夜间往往是风电出力高峰风电大发时系统需要火电深度调峰让路。可热电联产机组为了保供热电出力根本压不下去。结果就是电网只能把风电场拉闸限电白花花的清洁能源被弃掉。很多北方省份冬季弃风率居高不下根源就在这里。我做算例的时候深有体会不加储热时夜间3点到6点的低谷时段一台300MW抽凝机组的电出力下限被顶到接近满发的70%到80%风电只能被压掉系统总煤耗也压不下来。调度员不是不想调是物理约束锁死了。1.2 储热改造的本质给热负荷装一个“缓冲池”储热改造的思路其实特别朴素——给热力系统加一个“缓冲池”。白天或者热负荷低、电负荷高的时候机组多发电多出来的蒸汽热能通过换热器存进储热装置夜间热负荷高、电负荷低的时候机组少发电但热负荷改由储热装置放热来满足一部分机组就能在保住供热的条件下把电出力降下来。这个改造的价值要从三个层面看。第一个层面是时间维度上的“热电解耦”。不改造时某一时刻的电出力必须配合该时刻的热负荷改造后储热装置可以昨天存热今天用白天存热晚上用热能和电能之间出现了一个时间错位窗口。第二个层面是系统调峰能力的提升。有了储热配合热电联产机组的等效最小电出力可以显著下降系统能腾出空间消纳更多风电弃风率下降煤耗也会跟着下降。第三个层面是运行灵活性的增加。抽凝机组本身有电热运行可行域储热相当于把这个可行域在时间轴上“延展”了调度决策者有了更多组合选择。我在项目里用的模型是热水罐储热储热罐的荷电状态SOC按0到1标幺化充放热功率有上限同一时段不能同时充和放。这些都是后面建模要落地的核心要素。1.3 低碳经济调度到底在优化什么说完储热改造再来说低碳经济调度。很多人一看“低碳”就以为是单纯把碳排放量最小化其实不是。实际做调度时目标函数要把经济性和低碳性放在同一个框架里权衡。典型的做法有两种一种是在约束里加一个碳排放总量上限配额给了多少就排多少多出来就违规另一种更常用——给碳排放定一个碳价把碳排放量乘上碳价后作为成本项放进目标函数。第二种做法更平滑能反映“碳价越高调度越倾向于让高排放机组少发电”的规律也方便做敏感性分析。我把目标函数设计成四块成本之和燃煤机组的煤耗成本包括纯凝机组和热电联产机组碳排放成本排放量乘以碳价弃风惩罚成本风电预测出力与实际消纳出力之差乘以惩罚系数机组启停成本和储热运维成本如果场景周期较短、机组不涉及启停这部分可以简化或去掉优化目标就是在满足电负荷、热负荷和各种物理约束的前提下让总成本最小。这个“最小”不是单纯少烧煤也不是单纯少排碳而是在碳价的引导下系统自动找到一个平衡点。碳价很低时系统优先保证经济性煤照烧碳价足够高时系统宁可多花点钱让风电多发、让高排放机组少出力。2. 数学模型目标函数与约束怎么写才能“算得动”2.1 目标函数成本项逐个拆先看煤耗成本。火电机组的煤耗量是出力的一次、二次函数典型表达式是 F(P) a·P² b·P c。二次函数不好直接进线性规划有两种处理方式一是在工作点附近做线性化近似成 F(P) ≈ λ·P c二是分段线性化把出力区间切成几段每一段用一条直线近似段数越多精度越高。实际我建议用分段线性化因为调度问题的出力范围很大单点线性化误差太大分段线性化之后精度足够而且YALMIP里可以直接用pwf函数或者手动引入自变量和0-1变量实现。热电联产机组的煤耗更复杂一点它的煤耗同时取决于电出力和热出力我简化处理为电出力段的煤耗加上供热煤耗修正项。这样既保证了模型可解又不失工程合理性。碳排放量计算相对直接排放量E 排放因子 × 煤耗量。不同机组排放因子不同一般燃煤机组在0.8到1.1 kg CO₂/kWh之间浮动折算后乘碳价就是碳排放成本。这个项是线性的加进目标函数就行。弃风惩罚成本主要起“引导”作用。风电的边际成本几乎为零按理说调度应该优先消纳风电可现实中因为调峰能力不足、网络约束等原因会有弃风。我在目标函数里给弃风一个惩罚系数相当于给“少用风电”定价系数设置要高于燃煤边际成本否则优化器宁可弃风也不会多花成本去调储热。2.2 储热装置约束SOC、充放热与互斥逻辑储热装置的模型核心是SOC状态转移方程我常用的写法是SOC(t1) SOC(t) [η_ch·H_ch(t) − H_dis(t)/η_dis] · Δt / C_st其中H_ch是充热功率H_dis是放热功率η_ch和η_dis分别是充放热效率热水罐一般取0.95到0.98固体储热低一些C_st是储热容量Δt是调度时间粒度通常1小时。这里有几个关键约束SOC边界SOC_min ≤ SOC(t) ≤ SOC_max一般设0.1到0.9避免完全放空或完全充满充放热速率上限0 ≤ H_ch(t) ≤ H_ch_max0 ≤ H_dis(t) ≤ H_dis_max充放互斥同一时段不能同时充热和放热这个逻辑需要引入0-1变量实际运行时如果不用0-1变量会出现“又充又放”这种无意义的能量浪费解还需要注意初末SOC耦合。如果调度周期是24小时一般要指定SOC(1)等于一个初值同时SOC(25)要么等于初值要么大于等于某个值。不加这个约束储热装置会在最后几个时段把热量全部放光结果虽然“好看”但实际运行不可行。这种边界约束藏在细节里非常容易忽略。2.3 机组运行约束出力区间与爬坡机组约束是所有调度模型的基础。对纯凝机组出力上下限就一个范围P_min ≤ P(t) ≤ P_max。对热电联产机组电出力和热出力不是相互独立的它们在一个二维可行域内。抽凝机组的典型可行域是一个凸多边形顶点由最大进汽量、最小凝汽量、最大抽汽量等工作特性决定。我在Matlab里用顶点凸组合的方式来描述这个可行域先手工列出多边形顶点坐标(He,i, Pe,i)然后引入权重变量α_i约束H Σα_i·He,iP Σα_i·Pe,iΣα_i 1α_i ≥ 0。这个办法的好处是通用性强换一台机组只需要改顶点坐标代码不用大动。爬坡约束要区分不同机组火电机组爬坡率一般在1%到3%额定功率每分钟储热装置充放热切换虽然也有速率限制但通常不是瓶颈。爬坡约束写成-P_ramp_down ≤ P(t) − P(t−1) ≤ P_ramp_up如果时间尺度是1小时爬坡量要乘60换算成每小时能力。电功率平衡约束是所有时段都成立的等式约束所有机组电出力之和加上风电消纳量等于系统电负荷。热功率平衡同理机组供热量加上储热放热量减充热量等于系统热负荷。注意风电消纳量是个决策变量不是直接等于预测值消纳不完的部分就是弃风量。2.4 碳排放约束的两种建模方式碳排放约束在模型里有两种主流做法我分别说下适用场景。第一种是硬约束法。模型里加一条ΣE(t) ≤ E_quota这个配额可以是碳交易市场分配到的排放权也可以是人为设定的减排目标。好处是模型简单、结果直观缺点是约束太硬容易导致无可行解尤其当配额设置很紧而系统灵活性不足时调度员会发现无论怎么调都超配额需要配合机组改造或者购买排放权。第二种是碳价法。前面说过把碳排放量乘以碳价加入目标函数。这种方法下没有硬性配额约束碳价成为引导变量。碳价越高低碳机组出力占比越高系统总排放越低。这个方法做敏感性分析特别好用可以画一条“碳价-排放量”关系曲线出来能看出系统减排潜力的边际递减特性。我对两种方法都做了实现。硬约束适合做“给定配额下最优出清”的对比场景碳价法适合做机制设计研究。实际交报告或发论文两种都用互相验证更稳妥。3. Matlab建模与求解从数学公式到可运行代码3.1 工具选型YALMIPCplex还是intlinprogMatlab里做优化调度求解的主流方案有三条路我按推荐程度排个序。第一推荐是YALMIPGurobi/Cplex。YALMIP是Matlab下的建模语言工具箱写约束和目标函数非常直观自动帮你把问题转化成求解器能吃的标准形式。Gurobi和Cplex是商业级MILP求解器速度极快几百上千个变量加几百个约束的这种调度问题轻松秒解。学校一般都有学术授权值得装。第二是直接用Matlab自带的linprog和intlinprog。不依赖外部工具箱适合规模小、约束不太多的场景。缺点是要自己把约束整理成矩阵形式写起来痛苦而且intlinprog对大模型的求解速度明显慢于商业求解器。第三是用Matlab Optimization Toolbox的fmincon这类非线性求解器。如果模型里保留了二次项或非线性约束可以用它但调度问题是分段线性化后的混合整数问题用非线性求解器既慢又不稳我一般不推荐。3.2 变量定义与约束构建的核心代码逻辑用YALMIP的话整个建模过程可以分成三步定义决策变量、写目标函数、写约束。我给一段核心逻辑示意不是完整可直接运行的代码但思路完全一致%% 定义决策变量 % 机组电出力nGen行、T列 P sdpvar(nGen, T); % 机组热出力热电联产机组 H sdpvar(nCHP, T); % 风电消纳功率 PW sdpvar(nWind, T); % 弃风功率非负 PWspill sdpvar(nWind, T); % 储热装置SOC SOC sdpvar(nSt, T1); % 储热充/放热功率 Hch sdpvar(nSt, T); Hdis sdpvar(nSt, T); % 充放互斥0-1变量1表示放热 z binvar(nSt, T);写约束的逻辑我总结成一个“先搭骨架再填肉”的习惯先写电平衡、热平衡这两个全局等式约束再写每台机组的出力边界然后写储热装置的SOC转移方程和充放互斥约束最后写时间耦合的爬坡约束。有一点要特别提醒YALMIP里binvar定义的变量会主动把问题标记成MILP如果你不小心用了sdpvar去乘0-1变量模型可能变成非凸的MINLP求解器直接罢工。3.3 线性化处理煤耗曲线和min/max怎么处理煤耗曲线分段线性化我习惯手写顶点法而不是用YALMIP的pwf函数因为手写逻辑更透明、调试更方便。做法是把二次曲线在出力区间上均匀切成K段记录每一段的斜率和截距然后引入K个连续变量λ_k和隐含的凸组合关系。SOC取最小/最大值的约束不需要特殊处理直接写成线性不等式就行。真正需要小心的是目标函数里出现min(P_wind_forecast, P_wind)这类表达式时不能直接写min会把模型变成非光滑优化问题。正确做法是把弃风功率定义成非负变量再写约束PW(t) PWspill(t) PW_forecast(t)这样弃风量就是一个线性表达式不需要任何min操作。还有一个常见的坑是充放互斥约束里大M的取值。我见过有人随手取M1e6结果求解数值出问题莫名其妙出现SOC轻微越界。M的取值应该比“该设备单时段最大充放热量”略大就行比如储热罐最大充热功率20MW、时间粒度1小时M取40就足够不要给太大。3.4 求解参数设置与结果提取求解器调用很直接Gurobi或Cplex求解MILP时我会设置几个关键参数时间上限、MIP gap容差、线程数。调度模型一般比较小通常不需要纠结性能但如果扩展到多场景或者更长调度周期MIPGap设置成0.01%默认0.01%如果做学术可以设更严会显著影响求解时长。求解完成后结果提取也容易出错。YALMIP里用value(P)取变量值但要注意求解器返回的状态。我先用optimize(constraints, objective, sdpsettings)再判断problem标志是否为0非0就说明有问题这时候盲目拿结果分析是致命的。结果整理阶段我会做三件事一是把SOC曲线、机组出力曲线、风电消纳曲线画出来看趋势是否正确二是做功率平衡校验把各时刻“机组出力风电消纳−电负荷”的残差打出来正常应在1e-6量级三是统计弃风率、碳排放总量、总煤耗作为对比分析的指标。4. 算例验证加装储热后系统到底省了多少4.1 一个能说明问题的迷你测试系统理论再扎实没有算例支撑说服力都有限。我在项目里搭了一个迷你测试系统麻雀虽小但五脏俱全两台300MW纯凝火电机组、一台350MW抽凝热电联产机组、一个200MW风电场、一套储热容量300MWh的热水罐最大充放热功率50MW电负荷和热负荷曲线用某北方城市冬季典型日的数据。系统总电负荷峰值约850MW热负荷峰值约300MWth调度周期24小时、时间粒度1小时。碳价基准设为50元/吨弃风惩罚系数设为300元/MWh这样设定是为了保证弃风成本远高于正常燃煤发电的边际成本避免系统“故意”弃风。这个系统规模不大但足够说明储热改造的作用也对初学者友好。你完全可以在自己的项目里用类似结构扩展比如加上多个风电场、储能电池、需求响应等模型骨架不用推倒重来。4.2 三组关键对比结果我做了三组核心对比无储热改造、有储热改造但碳价为0、有储热改造且碳价50元/吨。结果非常有代表性。无储热改造时供暖季夜间热负荷高热电联产机组电出力被顶住风电消纳率只有82%弃风集中在凌晨2点到6点。系统总煤耗成本约78.6万元碳排放总量约5860吨。加储热但碳价为零时风电消纳率提升到93.7%夜间热电联产机组电出力平均下降了约60MW总煤耗成本降到74.2万元。碳排放因为总发电量基本不变变化不大约5810吨。这说明储热改造本身就能通过改善调峰带来直接的煤耗节约。加上碳价之后系统的碳排放总量进一步下降到5420吨但煤耗成本略有上升多出来的是更高成本机组/更贵的运行方式替代高排放机组的代价。三组对比展示了一个重要规律储热改造解决的是“能不能调”的问题碳价解决的是“往哪调”的问题两者叠加效果最好。4.3 储热容量和碳价的敏感性分析我还做了两条敏感性曲线每一条都有明确的工程启示。第一条是储热容量从50MWh逐步增加到600MWh的曲线。风电消纳率在前半段上升很快到300MWh以后增速明显放缓开始饱和。这说明储热容量不是越大越好超过某个阈值后边际收益迅速衰减新增投资回本周期拉长工程上需要结合容量成本做投资决策。第二条是碳价从0到200元/吨的曲线。系统碳排放总量在碳价0到100元/吨区间下降速度最快超过150元/吨后基本走平这说明系统自身的灵活性已经用尽再提高碳价只会增加系统运行成本不会带来明显的减排收益。这个拐点对碳市场定价很有参考意义。这些结果用Matlab画出来直接就是论文里最有说服力的那种图。我个人经验是做这类项目敏感性分析一定要做它是审稿人和评审老师最关注的内容。5. 实操排坑求解失败、结果异常怎么查5.1 “无可行解”先查这四处这个项目我做了很多遍最常见的错误就是模型报错“Infeasible problem”。排查思路我总结成固定套路按顺序检查。第一查功率平衡和热平衡等式是否写错方向。别笑这是最高频错误。我试过把储热放热写进等式左边却忘了在SOC转移方程里减掉结果系统能量凭空多出一块直接无解。一个检查技巧是先把储热出力全部置零再跑一遍如果此时有可行解问题基本锁定在储热相关约束。第二查SOC初末值约束。有些同学设了SOC(1)0.5、SOC(25)0.8可是系统热负荷和储热能力根本不允许满足这个终值也会无解。处理办法是先跑一个“终值自由”的版本看最优解里的SOC(25)自然落在什么范围再以此为依据设置终值约束。第三查充放互斥的大M取值M取太小会把可行域错误地砍掉。比如最大充热功率50MWM却取30那约束Hch ≤ (1−z)·M在z1时就限制了充热功率不能超过30MW冲突就来了。第四查爬坡约束与出力上下限是否矛盾。爬坡约束本质上也是上下限的一种如果P_min和P_max的差值小于单时段最大爬坡量那两者同时存在没问题但如果爬坡量设置不合理会出现两小时之间怎么都跳不过去的死区同样产生不可行解。5.2 SOC跳变和被零除数值问题的常见来源求解完成后画SOC曲线发现阶跃式跳变或毛刺大概率不是求解器出错而是模型数值条件不好。我遇到过三种情况一是SOC转移方程里充放热功率和时间粒度的单位不统一。热功率是MW时间用小时容量单位是MWh看起来都对但充放热功率和效率相乘后没有正确换算成MWh导致SOC在前后两个时段差了几十倍。检查方法很简单把一个时段单独拿出来手算一遍能量变化。二是充放热效率和容量标幺化处理混乱。SOC归一化成0到1后转移方程里必须除以C_st但充放热功率还是以MW为单位两边量纲不一致结果就是SOC像抽风一样乱跳。三是0-1变量和连续变量乘法引入的数值病态。虽然binvar乘sdpvarYALMIP能处理但大M过大会放大数值误差。我一般会把所有大M相关的约束手工展开成两个不等式不要直接写“变量 ≤ 大M×二进制变量”而是尽量通过变量自身上下限来收紧。5.3 储热一直不被利用目标函数和约束的隐性门槛还有一个特别隐蔽的问题模型运行正常、结果也符合所有约束但画出来发现储热装置全程SOC纹丝不动根本没用上。出现这种“僵尸储热”的原因有两类。第一类是收益激励不足。储热的价值是通过减少弃风、替换高峰机组出力而间接体现的如果弃风惩罚系数设置过低系统宁可弃风也不愿意为了多消纳风电而付出储热的充放热效率损失充放两次大概损失5%到10%的能量结果储热就被架空了。我遇到这种情况会先把弃风惩罚系数提高到煤耗边际成本的2倍以上再观察。第二类是热负荷曲线太“平坦”。如果全天热负荷变化不大储热能转移的时段很有限它的价值就发挥不出来。处理办法是换一个热负荷峰谷差更大的典型日或者把储热改造的价值放到“大范围深度调峰”场景里去验证。5.4 结果合理性检查清单最后我建议养成一个习惯不管结果看着多漂亮求解完都做一遍合理性检查。我给自己列了一个“五查清单”查功率平衡残差是否在1e-6量级查SOC是否严格落在上下界内可以看最小值和最大值查充放热是否真的互斥统计每个时段Hch和Hdis同时大于零的数量查爬坡约束是否被违反用相邻时段出力差做校验查碳排放量和煤耗的对应关系是否大致合理高煤耗必然伴随高排放如果出现低煤耗高排放那排放因子可能写反了。这五条检查都通过了模型的可靠性基本就有把握了。如果哪一条不过宁可多花时间排查也不要拿着错误结果往下做分析。数据错了后面所有结论都是空中楼阁。6. 实操心得与扩展方向这个项目做下来我的体会是模型本身不复杂难点全在细节。比如SOC初末耦合、充放互斥的大M取值、热电联产机组二维可行域的顶点表达任何一个地方考虑不周求解结果都会变形。我建议新上手的朋友先把我前面那套迷你系统跑通再逐步往里面加东西。扩展方向上我觉得有三个方向特别值得做一是把单一调度周期扩展到多日耦合考虑储热装置跨日调度和机组启停的联合优化模型规模上去了但更贴近实际生产二是加入多风电场出力场景的随机优化或鲁棒优化YALMIP里可以配合场景生成处理三是把电储能和热储能放在同一个框架里做联合优化两类储能特性差异很大联合运行的效果往往优于单独使用。最后分享一个小技巧做完算例对比之后把储热容量、碳价、弃风惩罚系数几个关键参数做成“可交互调节”形式的脚本跑一次就能输出全部图表。这样后续改数据、换场景、应付答辩或者项目汇报效率会高很多。我这个项目的参数敏感性分析图就是靠这个脚本几十秒钟批量生成的省了大量重复调参的时间。
返回列表