ARTICLE DETAIL

资讯详情

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

移动储能预布局与动态调度:配电网韧性提升的两阶段优化实战

移动储能预布局与动态调度:配电网韧性提升的两阶段优化实战 最近在帮几个师弟复现一个配电网方向的课题面向配电网韧性提升的移动储能预布局与动态调度策略测试平台是IEEE33节点代码用Matlab实现。这个题目前段时间收藏和询问量都挺高正好代码已经完整跑通把整个复现思路、模型设计、代码结构和踩过的坑一起写出来希望对准备拿这个方向做毕业设计或者发小论文的同学有帮助。这篇内容不是简单贴一段能跑的代码就完事而是把移动储能在配电网韧性提升中到底怎么建模、预布局和动态调度这两个阶段之间怎么衔接、IEEE33节点系统怎么处理、Yalmip建模时有哪些易错点全部拆开讲一遍。适合已经有电力系统潮流和优化基础、准备复现论文或者在此基础上做改进的读者如果你是刚接触配电网优化的小白我建议先看一遍DistFlow模型和Yalmip的基本用法再来读这篇效果会好很多。1. 项目到底在解决什么问题极端事件下的配电网供电恢复1.1 为什么固定储能不够用非要“移动”储能先说一个比较反直觉的事实配电网在正常情况下最怕的是负荷高峰但在极端灾害面前最怕的不是峰值而是多个故障点同时出现导致大范围、长时间的停电。台风、冰灾、洪涝这一类事件有一个共同特点破坏范围大、故障点多、修复时间长。固定储能虽然响应快但它安装在某个节点之后就不能动了如果故障发生在远离固定储能的位置储能只能通过重构或者远程供电来发挥作用效果大打折扣。移动储能Mobile Energy Storage, MES的出现就是为了解决这个空间错配问题。它的本质就是把电池储能系统装在拖车或者卡车上平时可以停在某个变电站参与调峰灾害预警发布后可以提前移动到关键负荷节点附近故障发生后直接支撑孤岛运行。这个“提前移动”就是预布局而“动态调度”则是指灾害发生过程中根据实际故障情况和负荷需求实时调整移动储能的连接节点、充放电功率和剩余电量。用大白话说固定储能像是固定岗哨移动储能像是机动巡逻队。灾害什么时候来、损坏哪条线路是高度不确定的机动力量比固定力量更能适应这种不确定性。1.2 韧性到底是什么和可靠性有什么区别配电网韧性resilience这几年在电力系统里被提到的频率越来越高但它和传统的可靠性reliability不是一回事。可靠性关注的是长时间尺度下系统的平均表现比如SAIFI、SAIDI这些指标衡量的是“平时有多不容易停电”韧性关注的是极端小概率事件下系统的表现衡量的是系统遭受严重冲击后能够维持多少供电能力、多久能恢复、恢复过程中关键负荷损失有多大。学术上经常用韧性轨迹图来描述这个过程从事件发生前的预防阶段到事件冲击时的抵抗阶段到灾后的降级运行阶段再到恢复阶段。移动储能的预布局正好作用于预防阶段动态调度则作用于抵抗和降级运行阶段。换句话说这个课题的核心问题可以概括为在灾害来临前移动储能应该放在哪些位置灾害发生后移动储能应该以什么功率、在什么时间、给哪些负荷供电。1.3 IEEE33节点系统为什么是标配测试平台IEEE33节点配电网系统是配电网优化领域最经典的测试算例之一。它包含33个节点、32条支路额定电压12.66kV总负荷大约3715kW 2300kvar系统结构本身带有联络开关所以也是配电网重构的标准测试平台。很多论文都在这个系统上做验证好处一是数据公开透明二是在这个系统上跑出来的结果可以直接和大量文献对比。选择IEEE33节点还有一个实际原因系统规模适中。Yalmip建模后算例规模不至于大到求解器跑不动也不至于小到无法体现移动储能调度的时空耦合特性。对于刚接触这个方向的读者直接用这个系统做仿真实验是最稳妥的选择。另外需要注意IEEE33节点的标准数据里有两种负荷单位有的文献用kW/kvar有的用kVA复现前一定要确认代码里读入的数据单位是否一致否则潮流结果怎么算都对不上。2. 模型拆解两阶段优化到底怎么设计2.1 第一阶段灾前预布局模型预布局阶段的决策变量相对简单核心是决定每台移动储能初始部署在哪个节点。但这个决策是在灾害实际发生之前做出的所以面临最大的困难就是不确定性我们不知道具体哪几条线路会断也不知道关键负荷的损失程度。一般有两种处理不确定性思路。随机优化直接给每个故障场景赋一个概率目标是最小化所有场景下的期望负荷削减鲁棒优化则只考虑最恶劣的场景目标是最小化最坏情况下的损失。两种思路的实现难度差别不大核心区别在于场景集合的构建方式。如果采用鲁棒优化场景集合通常是描述故障线路数量上限下的所有可能故障组合计算量相对大一些如果采用随机优化通过蒙特卡洛抽样生成故障场景然后用样本均值近似期望值计算量相对可控。从复现角度看我建议第一步先用随机优化框架把故障场景预先离线生成好存成矩阵后面多次实验直接读取就可以。这样比每次运行都重新采样稳定得多也方便别人复现你的结果。预布局阶段的目标函数通常写成最小化所有场景下的加权负荷削减量其中权重根据负荷的重要程度设定一级负荷权重最高二级次之三级最低。约束条件中除了移动储能的数量、节点容量等基本约束外还有一个容易被忽略的点预布局结果必须保证每台移动储能只能放在一个节点且不同储能不能放在同一节点如果储能容量不同这条可以放宽。2.2 第二阶段灾中动态调度模型动态调度阶段是模型最复杂的部分。此时故障场景已经明确移动储能需要根据实际情况调整位置和出力目标是在整个调度周期内、在所有可能的运行方式下尽可能减少负荷削减尤其是要优先保障关键负荷供电。动态调度模型里移动储能的时空耦合约束是核心难点。想象一下一台移动储能从节点5移动到节点20它需要时间移动期间无法充放电到达新节点后需要重新并网而且整个过程中剩余电量必须始终保持在合理范围内。由于配电网是辐射状运行的移动储能接入某个节点后它所支撑的孤岛范围也受到网络拓扑的约束不能随意扩大。还有一个常被忽略的细节移动储能本身在行驶过程中是要耗电的。很多复现代码里把移动过程建模成“瞬间转移”不考虑路程时间和能量消耗这在数学上简化了很多但和实际差别较大。如果想要结果更可信建议在模型里加入移动时间矩阵和行驶耗能系数。移动时间矩阵可以通过节点间的实际道路距离除以平均车速获得行驶耗能则根据单位里程能耗估算这些参数虽然不精确实测但可以体现移动储能的时空耦合特性。潮流约束方面IEEE33节点配电网通常采用DistFlow方程。这是一个精确的潮流模型但含有非线性项。对于韧性提升这类偏运行调度的优化问题最常用的做法是进行线性化处理忽略线路损耗项或者将其近似为常数把问题转化为混合整数线性规划MILP。线性化后的精度对配电网这种中压系统来说足够用而求解速度和稳定性会大幅提升。2.3 韧性指标怎么量化不能只看“停电量”复现这个课题时很多人都会问韧性提升效果最后怎么展示最直接的做法是比较“有无移动储能”两种情况下的总负荷削减量但这个指标比较粗糙。更专业的做法是计算韧性轨迹曲线下的面积或者采用加权缺供电量weighted energy not supplied作为评价指标。加权缺供电量的计算公式是每个节点每个时刻的负荷削减量乘以对应的负荷权重再对所有时间和节点求和。一级负荷权重设大一些比如100三级负荷权重设小一些比如1这样优化目标就天然倾向于优先保重要负荷。实际运行中一级负荷通常是医院、应急指挥中心、通信基站、供水系统等调度策略应该尽可能做到一级负荷零削减这是衡量策略优劣的最直接标准。还有一种评价方式是看移动储能的“最后一公里”供电效果故障隔离后移动储能支撑的孤岛内能持续供电多长时间孤岛内负荷恢复的比例有多高。这个指标更直观也更容易在答辩和论文中向评审老师解释。3. 代码框架与关键实现细节3.1 数据准备IEEE33节点系统参数怎么读第一步先把IEEE33节点系统的基础数据整理成Matlab可读的格式。节点数据包括节点编号、有功负荷、无功负荷支路数据包括首端节点、末端节点、支路电阻、支路电抗、额定容量。这些数据在公开资料里都有整理成Excel或者直接写在Matlab脚本里都可以。需要注意的是IEEE33节点系统的根节点节点1连接上级变电站电压恒定在1.0pu在优化模型里通常作为平衡节点处理。其他节点的电压约束一般设置为0.95pu到1.05pu。这个电压上下限的选取会直接影响可行域大小限值太紧容易导致模型无解太松则结果不符合实际。按照配电网运行规程取0.95~1.05是一个既贴近实际、又不会过度限制优化空间的合理选择。移动储能的数据需要自己设定。常见的设置是2台移动储能单台容量500kWh额定功率250kWSOC范围0.1~0.9初始SOC为0.5。调度周期一般取24小时时间步长1小时。之所以取1小时是因为移动储能本身的移动和并网操作以分钟级到小时级为单位1小时步长已经足够描述核心行为同时可以有效控制模型规模。如果研究时间粒度对结果的影响可以细化为30分钟或15分钟但求解时间会明显增加。3.2 决策变量与约束的Yalmip建模Yalmip是Matlab环境下最常用的优化建模工具语法简单底层可以直接调用Gurobi、Cplex等商用求解器。对于这个课题决策变量主要包括三类移动储能的位置变量、充放电变量、节点电压相关变量。位置变量是0-1整数变量表示某一时刻某台移动储能是否在某个节点充放电变量是连续变量受到额定功率和SOC约束的限制。下面给出一段关键约束的参考代码对应的是移动储能时空耦合约束% N: 节点数, T: 调度时段数, M: 移动储能数量 % x(m, n, t): 二进制变量, 1表示第m台储能在t时刻位于节点n % E(m, t): 第m台储能在t时段结束时的剩余电量 % Pc(m, t), Pd(m, t): 充电、放电功率 % 每一时刻每台储能只能在一个节点 for t 1:T for m 1:M Constraints [Constraints, sum(x(m, :, t)) 1]; end end % 每个节点同时接入的储能数量限制如最多1台 for n 1:N for t 1:T Constraints [Constraints, sum(x(:, n, t)) 1]; end end % 移动时间约束储能在t时刻位于节点a, 最早只能在ttravel_time(a,b)时刻到达节点b % 这里用节点间最短路径时间矩阵 travel_time, 约束写作: % x(m,a,t) x(m,b,tdt) 1 对所有 dt travel_time(a,b) 成立, 该约束表示移动需要时间 % SOC递推约束: 考虑充放电效率 eta_c, eta_d for t 1:T-1 for m 1:M Constraints [Constraints, E(m, t1) E(m, t) ... eta_c * Pc(m, t) - Pd(m, t) / eta_d]; end end % SOC上下限约束 for t 1:T for m 1:M Constraints [Constraints, E_min E(m, t) E_max]; Constraints [Constraints, 0 Pc(m, t) P_rated * sum(x(m, :, t))]; Constraints [Constraints, 0 Pd(m, t) P_rated * sum(x(m, :, t))]; end end这段代码只是整个模型的核心片段实际复现时还需要加上潮流约束、负荷削减约束和辐射状运行约束。有一个细节很容易踩坑SOC递推公式中的充放电效率放置位置。充电时电网侧输入的功率一部分转化为电池存储能量所以效率乘在充电侧放电时电池存储能量转化为电网侧功率也有效率损失所以是除以放电效率。把效率放错位置会导致SOC计算结果和预期不一致而且这种错误很难一眼发现。3.3 求解流程与参数设置模型建立完以后求解器选择直接影响能否快速拿到结果。Gurobi在求解MILP问题上的性能通常优于Cplex尤其是二次约束和整数变量较多的情况下差距会更明显。如果你的机器上有Gurobi的学术授权建议直接选Gurobi如果只有Cplex也完全没问题这个规模的问题在合理时间内都能求解。求解器设置方面有两个参数值得单独说。第一个是求解时间上限建议设置成3600秒防止某些场景下模型卡死第二个是MIP Gap容忍度默认值是1e-4对于工程应用可以放宽到1e-2甚至1e-3求解时间会大幅下降而目标函数值偏差很小。实际测试时把MIP Gap从默认值放宽到1e-3在某些复杂场景下求解时间可以减少50%以上最终目标函数值相差不到0.1%。对于需要批量跑场景对比实验的场景这个设置非常实用。4. 实操过程从空Matlab到成功跑出结果4.1 环境准备Yalmip和求解器怎么装、怎么配复现的第一步是准备环境。Matlab版本建议用R2018b以上因为Yalmip的更新版本对高版本Matlab支持更好。如果电脑上之前装过老版本Yalmip先彻底卸载再装新版本避免路径冲突。安装Yalmip最简单的办法是下载压缩包后解压然后在Matlab里把解压路径加入搜索路径addpath(genpath(D:\yalmip)); savepath;求解器方面Gurobi和Cplex都是独立安装的软件安装后需要把安装目录加入Matlab路径。很多同学装完以后Yalmip还是找不到求解器通常是路径没有添加正确或者求解器的许可证没有配置好。安装完成以后可以在Matlab命令行里运行yalmiptest如果安装正常会列出能够检测到的求解器及其状态。建议到这里多花几分钟把环境测试好再跑代码免得后面报错不知道是代码问题还是环境问题。4.2 主程序逻辑怎么搭分块写、逐步验证复现代码不建议一上来就把所有模块合在一起跑而是分块搭建每写完一块就先验证一块。我推荐的主程序结构是第一步加载数据并初始化参数包括IEEE33节点数据、移动储能参数、调度周期和时间步长第二步生成故障场景集用蒙特卡洛抽样确定哪些线路断开将故障场景存储成矩阵第三步调用预布局优化函数求解第一阶段模型得到移动储能的初始位置第四步调用动态调度优化函数在给定的预布局结果和故障场景下求解第二阶段模型得到每个时段储能的位置和功率第五步计算韧性指标并绘图。如果代码里有某个变量没有定义或者维度不匹配在分块写作的过程中会非常容易定位如果全部写完再调试报错信息会指向一个几百行的大脚本排查效率会非常低。还需要注意一个逻辑问题预布局阶段可能在场景集上做优化得到的结果是面向所有场景的“平均最优”或“最坏最优”而动态调度阶段是面向单个具体场景的。所以第二阶段求解时第一步已经确定了预布局位置第二阶段里储能的初始位置必须作为固定参数输入而不是可优化变量。这个衔接关系弄错的话模型结果会偏乐观实际上这是不合理的。4.3 结果可视化怎样把调度过程直观展示出来结果展示方面常用的图表包括移动储能位置随时间变化的Gantt图、SOC随时间变化的曲线、各节点负荷削减情况的热力图、以及在有无移动储能两种情况下的负荷削减量对比柱状图。Matlab里绘制不同节点负荷削减热力图时可以用imagesc函数横轴是时间时段纵轴是节点编号颜色深浅表示削减量大小。这张图能非常直观地展示移动储能接入后对哪些节点、哪些时段起到了支撑作用。如果代码跑完以后没有合理的结果展示答辩时评审老师很难快速理解你的工作价值所以可视化建议分配足够的时间来做。一个实操小技巧在输出结果前先检查一遍每个时段的负荷削减量是否和潮流结果匹配。很多情况下优化目标是最小化负荷削减但潮流约束没有正确耦合导致结果里储能虽然在某个节点但削减量却没有对应减少。这个错误不会导致求解失败但结果不可信数据检查时务必核算一遍。5. 常见问题与排查技巧实录5.1 求解器调用失败的排查报错信息“No appropriate solver for the problem type detected”这是Yalmip最常见的问题。出现这个报错的原因一般是没有安装求解器、安装后没有将求解器路径加入Matlab路径、或者求解器许可证过期。排查方法是先运行yalmiptest看看能否检测到求解器如果检测不到检查求解器安装目录下的bin文件夹路径是否被正确添加。还有一个比较隐蔽的问题当同时装了Gurobi和Cplex时Yalmip默认调用的求解器可能是早先安装的那个如果卸载后路径还残留可能导致调用失败。在求解命令中显式指定求解器是一个好习惯optimize(Constraints, Objective, sdpsettings(solver, gurobi));这样即使机器上装了多个求解器也能确保使用的是你指定的那个避免环境混乱导致的隐性错误。5.2 模型不可行、无界或者数值爆炸怎么处理模型显示“infeasible problem”时需要重点检查几个地方SOC边界是否设置过紧、移动储能接入数量限制和节点数量是否匹配、电压上下限是否过严、负荷削减变量是否被遗漏。特别要注意的是如果某个故障场景导致配电网解列成多个孤岛而孤岛内没有移动储能接入这个孤岛的负荷就会全部削减但如果模型没有设置允许完全削减的变量就会出现不可行问题。如果模型显示“unbounded”通常是因为没有设置储能SOC上限或者充放电变量没有接入功率上限约束。很容易理解优化器发现无穷出力可以让目标无穷小自然就无界了。给所有变量加上合理的上下界是解决这类问题的最快方式。数值爆炸问题则和参数量级有关。如果采用有名值进行优化电压量级是万伏级别功率量级是千瓦级别不同系数量级差异过大会导致求解器数值稳定性变差。解决办法是全部转成标幺值pu体系后再建模。IEEE33节点系统的基准电压取12.66kV基准功率取1MVA把潮流方程和储能约束都用标幺值表示数值稳定性会大幅提升。这里可以给出一个快速排查表报错类型常见原因排查方法No solver detected求解器路径未添加运行yalmiptest确认Infeasible problem约束过紧、变量遗漏逐条检查SOC、电压、削减变量边界Unbounded problem变量缺少上下界检查功率/SOC是否设置上下限Solver stalls / slowMIP Gap过严放宽Gap到1e-3或设置时间上限Numerical issues有名值量级差异大改成标幺值建模5.3 复现结果和论文对不上时的校准思路很多同学复现论文时会遇到一个问题按照论文的方法写代码结果和论文里的图对不上。这种情况很常见原因是论文里的参数细节不可能全部公开尤其是场景生成方式、负荷倍数曲线、移动储能参数、权重系数、求解器收敛精度这些东西不同设置会导致结果存在较大差异。遇到结果对不上时不要急着怀疑模型写错了。先把目标函数值和关键约束的拉格朗日乘子或对偶变量信息打印出来判断模型是否接近论文中描述的最优状态再检查场景生成方式是否一致比如故障线路数范围、故障概率分布、抽样数量最后检查负荷数据是否做了缩放很多论文会把基准负荷乘以一个“日负荷倍数曲线”来模拟一天内的负荷波动如果漏掉这一步结果差异会非常大。在这个课题里我强烈建议把一天的负荷倍数曲线作为参数输入而不是用恒定负荷。标准做法是设置24个小时的负荷倍数比如凌晨低谷0.5傍晚高峰1.2用节点基础负荷乘以对应时间段的倍数作为实际负荷。这个细节也是移动储能动态调度的核心意义所在负荷高峰时段让储能放电负荷低谷时段给储能充电配合预布局的位置选择实现削峰填谷和应急供电的双重目标。6. 实际工程视角的一点体会代码跑通只是第一步把结果讲清楚、让模型具备可迁移性才是这个课题目更有价值的地方。我实际测试时发现把移动储能数量从2台增加到3台韧性提升的边际效果逐渐降低但求解时间和模型复杂度明显上升——并不是储能越多越好合理的预布局策略才是决定效果的关键。这也符合工程直觉移动储能价格不菲一辆移动储能车加上配套并网设备成本很高在实际规划中必须做经济性和韧性的综合权衡。另一个很深的体会是这个课题的扩展空间非常大。目前模型里默认移动储能可以在任意节点之间自由移动但实际城市配电网中移动储能的移动时间受到道路拥堵、桥梁损坏、极端天气等因素影响这些不确定性都可以加入到模型中。另外移动储能与分布式光伏、固定储能、需求侧响应的协同优化也是当前研究的热点方向。如果你做完这个基础复现后还有余力建议选择一个方向做改进很容易在此基础上产生一篇高质量的期刊论文。最后再分享一个我在复现过程中觉得最值得注意的技术细节第一阶段预布局和第二阶段的耦合关系千万别把它当作两个完全独立的模型来搭。预布局结果本质上限制了第二阶段的初始可行域而第二阶段的实际情况又反过来验证预布局决策的好坏。把这两个阶段放在同一个框架里迭代分析比分开求解能获得更多有价值的结论。也正因如此这个课题非常适合用来加深对两阶段随机优化和鲁棒优化思想的理解把这些方法吃透之后再做其他调度类课题会顺手很多。
返回列表