ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

Matlab下热电联产机组联合优化:风电最大化消纳与弃风最小化

Matlab下热电联产机组联合优化:风电最大化消纳与弃风最小化 先把这个课题的来龙去脉说清楚。风电最大化消纳的热电联产机组联合优化控制本质上是解决供暖期“风越大、越要停机”这种倒挂现象。北方供暖季电网调峰困难热电联产机组为了完成供热指标被迫高频出力风电只能在剩下的一点空间里上网挤不进去就成了弃风。做这个方向的人一般都在研究怎么用Matlab把多台机组、热储能、电锅炉这些东西放进同一个优化框架里算出每一小时的机组出力和储放热计划在满足热负荷的前提下把风电尽量全额发出去。这个课题在电力系统优化调度里属于偏工程、偏应用的细分方向。适合正在做综合能源系统毕业设计的研究生、做新能源消纳的工程师、以及所有想复现“弃风最小化”算例的初学者。我先把模型怎么建、代码怎么写、算例怎么设计、坑怎么避开都拆开讲一遍你照着走基本能跑出自己的结果。1. 供暖季弃风的核心矛盾热电联产机组的“以热定电”1.1 风电反调峰特性怎么压缩消纳空间风电的“反调峰”特性是个绕不开的基础问题。常规火电是“需要多少发多少”风电是“来多少风就发多少电”而且时间上常常和负荷曲线对着干。白天负荷高但风速一般偏小晚上负荷往下掉风速反而上来了。尤其冬季寒潮大风过程凌晨四五点往往是风电大发时段恰好也是全网负荷最低谷。凌晨的时候电负荷低风电预测出力高系统里能调节的机组却不多。这就像一条河道上游来水猛增下游河道却因为各种原因收窄了水只能漫出来。对电网来说“漫出来”的部分就是弃风。我一直觉得做风电消纳研究的人应该先把这条时间错配曲线牢记在心负荷低谷、风电高峰、供热高峰三个现象叠加在清晨这就是弃风最容易出现的时间窗口。后面建模型、做算例要重点盯这个窗口的调度结果。1.2 “以热定电”的真正含义热电联产机组分好几种背压式机组的电出力完全跟着热负荷走热发多少电就发多少几乎没有任何调节能力。工程上更常见的是抽汽式机组虽然有一点调节余地但也有明显的下限约束。抽汽式CHP机组的电出力下限不是一个固定值而是随供热抽汽量升高而抬升。这个现象可以用一个简化公式表达P_CHP_min(t) P_cond_min c_v × H_CHP(t)其中P_cond_min 是汽轮机在纯凝工况下的最小发电功率H_CHP(t) 是机组在 t 时段的供热功率c_v 是抽汽对电出力的折算系数工程上大概在 0.1~0.3 之间。举个直观的例子。一台抽汽式机组纯凝最小电出力是80MW折算系数取0.15。凌晨热负荷有100MWth需要它扛那么这台机组的最小电出力就变成 80 0.15×100 95MW。这15MW的抬升就是“热负荷吃掉电力调节空间”的具体表现。电力调度员想让这台机组降到80MW来给风电让路它做不到因为低到80MW它就供不了100MWth的热水了。热是硬约束电出力不是自由的这就是“以热定电”四个字的真正含义。1.3 联合优化控制的基本策略既然单台CHP机组被热负荷绑住了手脚思路就变成不要把热负荷全部压给CHP让别的环节帮它分担。常见的解耦手段有热储能罐和电锅炉。热储能罐可以在白天热负荷低、风电出力小的时候把CHP多产的热存起来到凌晨热负荷高、风电大发的时候放出来分担CHP的供热压力电锅炉更直接在弃风时段把风电转成热既消纳了风电又减少了CHP的供热负担一举两得。所以这里说的“联合优化控制”至少包含三层联合多机组联合CHP、纯凝火电、风电场一起满足电负荷多环节联合热负荷由CHP、电锅炉、热储能共同承担时间联合把不同时段的能量转移能力储热纳入全局决策。最终优化出来的结果不是某台机组自己怎么调而是整个电-热系统在所有时段上的协同计划。这也是为什么要用优化模型而不是靠人工经验去调度——时段多、变量多、约束互相牵扯人工根本调不出全局最优。2. 优化模型怎么建目标函数与约束全拆解2.1 目标函数直接弃风最小还是经济最优建模第一步是确定目标函数。做风电消纳研究最直接的目标是弃风电量最小min ∑ Curt(t)其中 Curt(t) 是 t 时段的风电削减量MW。这个目标的好处是干净、直观算出来的结果就是“在不违反所有约束的前提下最多能消纳多少风”。适合学术论文里的机理分析、方案对比。如果偏工程应用目标函数会写成系统运行成本最小化并加上弃风惩罚项min ∑ [C_CHP(P_CHP(t)) C_c(P_c(t)) λ × Curt(t)]其中 C_CHP 和 C_c 是CHP机组和纯凝机组的燃料成本λ是弃风惩罚系数我一般取 100~500 元/MWh。λ取大一点相当于给弃风很高的“价格”优化器会主动优先消纳风电取小一点则代表电网更能忍受弃风系统倾向降低运行成本。在做研究算例时我建议先用弃风最小模型把结论做出来再换经济目标做敏感性对比。两个模型结论一致说明方案在工程上更具说服力。2.2 CHP机组可行域建模四边形不是随便画的CHP机组的电热运行区间在工程上常用一个凸四边形表示。它的边界由四组约束构成P_CHP(t) ≥ P_cond_min c_m × H_CHP(t) P_CHP(t) ≤ P_CHP_max - c_v × H_CHP(t) 0 ≤ H_CHP(t) ≤ H_CHP_max其中c_m 是供热抽汽使电出力下限抬升的系数c_v 是抽汽量增大导致最大电出力下降的系数P_CHP_max 是纯凝工况最大发电功率。为什么上下限都有斜率下限那条边对应“凝汽流量不能小于某个最小值”抽汽越多为了保持最小凝汽流量总发电功率就得越高上限那条边对应“最大进汽流量有限”抽汽占了一块能用于发电的蒸汽就少了最大电功率自然下降。例如参数设为 P_cond_min80MWP_CHP_max300MWc_m0.15c_v0.12H_CHP_max150MWth。当热出力100MWth时电出力下限 80 0.15×100 95MW电出力上限 300 - 0.12×100 288MW。这个可行域是个线性不等式组用线性规划就能处理千万别写成非线性函数。很多初学者在这里把模型搞复杂导致求解困难其实根本没这个必要。2.3 系统平衡约束与机组运行约束系统层面必须有电功率平衡和热功率平衡这是所有调度模型的骨架。电功率平衡P_CHP(t) P_c(t) P_w(t) P_load(t) P_eb(t)其中 P_eb(t) 是电锅炉 t 时段的耗电功率。注意电锅炉是负荷要放在等式右侧。热功率平衡H_CHP(t) H_eb(t) H_dis(t) - H_cha(t) H_load(t)其中 H_cha 是储热罐充电功率H_dis 是放热功率H_eb 是电锅炉供热功率。风电出力约束也很好写0 ≤ P_w(t) ≤ P_w_forecast(t)P_w 是风电实际出力P_w_forecast 是预测最大可用出力。风电不能超过预测值但可以下调下调的量就是弃风Curt(t) P_w_forecast(t) - P_w(t)爬坡约束容易被漏掉。CHP机组和纯凝机组都有出力变化率限制比如|P_CHP(t) - P_CHP(t-1)| ≤ R_chpR_chp 一般取额定功率的 2%~4% 每分钟折算到小时取 20~50MW。加上爬坡约束后模型更贴近实际也能避免优化结果中出现相邻时段大幅跳变的“伪最优”。2.4 热电解耦手段的建模储热罐的模型写成一个差分方程E_ts(t1) E_ts(t) η_ch × H_cha(t) - H_dis(t) / η_dis其中 E_ts(t) 是 t 时段初的储热罐热量MWhη_ch、η_dis 分别是充放热效率工程上取 0.9~0.98 比较合理。储热罐还有容量和功率限制0 ≤ E_ts(t) ≤ E_ts_max 0 ≤ H_cha(t) ≤ H_cha_max 0 ≤ H_dis(t) ≤ H_dis_max电锅炉的模型简单一些H_eb(t) η_eb × P_eb(t) 0 ≤ P_eb(t) ≤ P_eb_maxη_eb 是电转热效率一般 0.95~1.0。电锅炉在时序上很灵活凌晨弃风时段开启刚好能把风电变成热白天热负荷不高时关掉即可。储热罐和电锅炉这两个环节本质上是给热负荷增加了“时间平移”能力热负荷不再必须由CHP实时跟随可以提前产、滞后用或者把风电时段的多余电能变成热存起来。模型里加上它们就是联合优化控制的实体基础。3. Matlab代码实现从参数设置到求解器配置3.1 程序总体框架在Matlab里做这个优化我习惯把工程拆成几个清晰模块千万别把所有代码塞进一个脚本里。推荐目录结构如下project/ ├── data_load.m % 输入负荷、风电、参数 ├── define_params.m % 定义机组和储能参数 ├── build_model.m % 用Yalmip建立变量、约束、目标 ├── run_optimization.m % 调用求解器并处理结果 └── plot_results.m % 画图输出这样分开写后期换数据换参数只改一两个文件排查问题也容易定位。3.2 变量和参数定义求解前要统一量纲。我建议功率统一用MW能量用MWh时间间隔用1小时价格用元/MWh。别一会儿用kW一会儿用MW单位错了模型再精确也没意义。常用参数表参考如下参数取值示例含义P_cond_min80 MWCHP纯凝最小电出力P_CHP_max300 MWCHP最大发电功率c_m / c_v0.15 / 0.12热电耦合系数H_CHP_max150 MWthCHP最大供热功率R_chp30 MW/hCHP爬坡限值E_ts_max50 MWh储热罐容量H_cha_max / H_dis_max10 MW充放热功率上限P_eb_max10 MW电锅炉额定功率P_w_forecast(t)24h数组风电预测出力3.3 核心约束与目标函数的代码写法我一般用Yalmip工具箱建模代码简洁求解器切换也方便。核心部分长这样T 24; % 决策变量 P_chp sdpvar(1, T); % CHP电出力 H_chp sdpvar(1, T); % CHP热出力 P_c sdpvar(1, T); % 纯凝火电出力 P_w sdpvar(1, T); % 风电实际出力 Curt sdpvar(1, T); % 弃风量 P_eb sdpvar(1, T); % 电锅炉耗电 H_cha sdpvar(1, T); % 储热充电 H_dis sdpvar(1, T); % 储热放电 E_ts sdpvar(1, T1); % 储热罐能量 % 约束集合 Cons []; % 电功率平衡 Cons [Cons, P_chp P_c P_w P_load P_eb]; % 热功率平衡 Cons [Cons, H_chp H_eb_heat H_dis - H_cha H_load]; % CHP可行域 Cons [Cons, P_chp P_chp_min c_m * H_chp]; Cons [Cons, P_chp P_chp_max - c_v * H_chp]; Cons [Cons, 0 H_chp H_chp_max]; % 风电约束 Cons [Cons, 0 P_w P_w_forecast]; Cons [Cons, Curt P_w_forecast - P_w]; % 爬坡约束 Cons [Cons, -R_chp diff(P_chp) R_chp]; % 储热罐约束 Cons [Cons, E_ts(2:end) E_ts(1:end-1) eta_ch * H_cha - H_dis / eta_dis]; Cons [Cons, 0 E_ts E_ts_max]; Cons [Cons, 0 H_cha H_cha_max]; Cons [Cons, 0 H_dis H_dis_max]; % 目标函数弃风电量最小 Objective sum(Curt); % 求解 ops sdpsettings(solver, gurobi, verbose, 1); optimize(Cons, Objective, ops);注意几个容易错的地方diff 函数对向量求差分长度会少1爬坡约束要像上面这样写储热罐的 E_ts 我习惯定义成 T1 维初始值 E_ts(1) 要提前设置所有向量运算前先确认列向量还是行向量Yalmip 的 sdpvar 定义成 sdpvar(1,T) 就是行向量后面与数组相乘务必保持一致。3.4 求解器选择和Sdpsettings调参如果只装了Matlab基础环境用内置的linprog、intlinprog也可以解线性模型。但Yalmip的优势是可以直接调Gurobi、CPLEX这些商业求解器速度快、数值稳定。我第一次跑这个模型时用的内置求解器30多个约束还算流畅后来切换到Gurobi同样是24时段模型几乎是秒解。在sdpsettings里常用两个选项ops sdpsettings(solver, gurobi, verbose, 0, gurobi.MIPGap, 0.01);MIPGap设成 0.01 表示允许1%的次优误差很多场景下这已经够用而且能明显缩短求解时间。如果你的模型是纯线性连续模型连MIPGap都不用管直接解析。另外如果没有商业求解器Yalmip还支持免费的SCIP、HiGHSMatlab官网的工具箱和部分开源求解器也能跑中小规模算例。先用免费方案把逻辑跑通再换商业求解器提速这是比较稳妥的路线。4. 典型日算例用一组数据验证联合优化的效果4.1 算例系统与负荷数据空谈模型没用我给一组可以直接复现的24小时典型日数据。系统包含一台抽汽式CHP机组额定发电300MW、最大供热150MWth、一台纯凝火电50~200MW、风电场装机150MW、10MW电锅炉和50MWh储热罐。关键数据如下功率单位MW时间为1~24时电负荷低谷出现在4时185MW晚峰21时320MW热负荷早峰7时140MWth午间低至100MWth左右风电预测凌晨达到70~80MW中午只有20MW出头。这组数据的核心特征就是“凌晨风电大、热负荷高、电负荷低”正好是弃风最严重的时段组合。4.2 两种场景的调度结果场景A不做联合优化CHP按“以热定电”直接跟踪热负荷电锅炉和储热不参与场景B用上面第3节的模型做联合优化。结果对比如下指标场景A不联合场景B联合优化风电预测总电量1100 MWh1100 MWh实际消纳风电868 MWh1028 MWh总弃风量232 MWh72 MWh弃风率21.1%6.5%CHP日平均电出力188 MW173 MW从结果能看到联合优化之后弃风率从21.1%降到6.5%主要变化集中在那几个凌晨时段。CHP日平均电出力下降了约15MW腾出来的缺口基本由风电顶上这就是“让热负荷不要死死绑住电出力”的直接收益。场景B里储热罐的调度轨迹也很有意思白天电负荷高、风电小时段储热罐蓄能凌晨热负荷高、风电大发时放热CHP就可以降低热出力进而降低最小电出力给风电让出空间。4.3 储热容量和电锅炉功率的敏感性我接着做了储热容量的敏感性分析分别取0、20、50、100MWh保持其他参数不变。弃风率变化大致如下储热容量弃风率0 MWh18.2%20 MWh13.5%50 MWh6.5%100 MWh4.8%可以看出储热容量从0加到50MWh弃风率下降非常明显是“性价比”最高的区间从50加到100MWh效果增速放缓说明边际效益递减。做工程方案时不能盲目追求大容量储热要在弃风收益和投资成本之间找平衡点。电锅炉功率也有类似规律。10MW电锅炉夜里多耗10MW风电同时代替CHP产生大约10MWth热在凌晨时段能多挤出10MW风电空间。如果电锅炉配到30MW以上效果会逐步饱和因为凌晨弃风时段也就那么几个小时热负荷需求总量有限。5. 调试心得模型不可行、求解慢、结果离谱怎么办5.1 “INFEASIBLE”多半是约束冲突第一次跑这个模型我遇到的第一个报错就是Yalmip返回INFEASIBLE。这类问题十有八九不是程序写错而是约束之间互相矛盾。最常见的矛盾有几种热负荷大于所有热源的最大供热能力和储热最大放热之和热平衡约束在某个时段无解电负荷太低但CHP最小电出力、纯凝最小出力加在一起已经超过负荷卡死了风电空间储热罐初值或终值设置不合理导致能量守恒约束前后矛盾。排查方法很简单先把约束一条条注释掉从“只有基本电平衡机组上下限”开始逐步加约束看到底哪条约束加进去之后模型不可行。我调试这类模型一直都是从最简单版本开始确认无误后再一层层加储能、加爬坡、加电锅炉这套习惯帮我节省了大量排错时间。5.2 求解慢的两个方向模型规模一大求解时间就上去了。纯连续线性规划一般几秒钟就能解完一旦引入0/1变量变成混合整数规划问题就复杂了。如果模型中电锅炉或者储能充放需要启停状态可以用0/1变量描述。但很多时候并不是非用不可储能充电和放电天然不同时发生可以通过给充放功率之间的关系加一个适当约束来避免比如H_cha H_dis ≤ H_max这样一个简单线性不等式就能防止两个变量同时为正省掉整数变量。电锅炉同理弃风惩罚已经会让优化器在不需要它的时候自动关掉不一定非要二进制启停变量。求解器参数方面把MIPGap设到0.01~0.05或者限制最大运行时间都能避免模型在最优解附近反复试探。5.3 结果合理性自检清单模型能求解不代表结果可用。我习惯在出结果后按下面这张清单逐项核对检查项异常表现可能原因风电出力在预测高值时段仍大量弃风负荷太低或CHP最小出力偏大CHP电出力长期贴着下限走目标函数惩罚系数不合理储热罐SOC出现负值或超容量充放热模型方向写反电锅炉功率白天大白天也开启弃风惩罚设置过高导致失真机组出力相邻时段剧烈跳变爬坡约束缺失或时间间隔不一致这表是我自己调试时的速查手册遇到结果奇怪先对着查一遍大部分问题都能定位到模型细节。5.4 Yalmip小技巧与Matlab环境注意事项Yalmip安装很简单在官网下载压缩包把文件夹放到工具箱路径在Matlab里把路径加入JAVA路径即可。版本兼容性要看Yalmip和求解器是否匹配我用过的R2020a、R2022b版本跑这段代码都没问题。有个细节提醒在建模循环里写约束时不要把中文字符放在约束字符串里。Yalmip对中文注释没有问题但某些求解器输出信息对非ASCII字符处理得不好报错信息会变得很乱。我一般统一用英文注释中文单独写在外部说明文档里。另外Matlab的license如果报错先去确认授权文件在当前机器上有效再检查工具箱路径是否完整这类环境问题排查顺序基本上就是“授权 → 路径 → 版本兼容 → 求解器接口”按照这个顺序走效率最高。6. 进一步扩展滚动优化、随机场景与更大系统6.1 风电预测误差来了怎么办走滚动MPC前面模型假设风电预测曲线完全准确实际显然不是这样。风电预测误差是消纳研究里最躲不开的现实问题。处理方式并不复杂把原来一次性解24小时的开环优化改成滚动模型预测控制每小时更新一次风电预测重新求解未来N小时比如6小时的优化问题只执行第一个时段的调度指令下一时刻滚动前往前。这样预测误差被不断修正比开环结果稳健得多。代码改动也小把optimize放进循环里用最新的预测数组更新P_w_forecast和初始E_ts(1)即可。6.2 单场景换成多场景随机优化单场景优化对预测误差基本没有防备。升级思路是用多场景代替单条预测曲线取历史数据生成若干风电场景并赋予概率目标函数从“单一曲线下的弃风最小”变成“加权期望弃风最小”。随机优化的模型规模会成倍增长但对消纳方案的鲁棒性评估非常有意义。在做课题结题或写论文时加上随机场景的结果会比单场景更有说服力。6.3 从调度到规划容量配置联合优化第三个扩展方向是把调度和规划结合起来。前面算例里储热容量、电锅炉功率都是固定参数实际工程决策时这些容量本身就是变量多配置储热能减少弃风但投资成本高少配置省钱却可能达不到预期消纳目标。把储热容量、电锅炉容量作为决策变量加入模型目标函数同时考虑弃风惩罚和年化投资成本一阶阶段决策容量二阶阶段模拟典型日调度这就是典型的容量规划联合优化问题。做完调度优化后再往这个方向拓展能把研究的应用价值提升一大截。我做这类调度优化课题的体会是模型能跑通只是第一步。真正决定研究质量的是数据口径统一、算例可复现、边界条件写清楚。你看很多论文里的结果一算就对自己复现却总是差一截多半是参数范围、单位换算或者约束细节没有对齐。建议先拿一个最简单的两机组系统把模型跑通再逐步加入储热、电锅炉、爬坡、多场景千万不要一开始就把模型做得特别大。分段验证、从小规模起步排错效率会高很多。这个方向后续的可玩空间很大滚动优化、随机优化、容量规划都是很实际的方向祝你也早日跑出让人满意的结果。
返回列表