配电网韧性提升:移动储能预布局与动态调度策略解析

发布时间:2026/10/13 19:16:33
配电网韧性提升:移动储能预布局与动态调度策略解析
配电网韧性、移动储能、预布局、动态调度这几个词放在一起基本就是当前配电系统防灾减灾领域最热的方向之一。我之前在好几个项目里都碰到过类似的课题这次完整跑通并复现了IEEE33节点下的移动储能预布局与动态调度策略整个过程踩了不少坑也积累了一些心得打算全部写出来。这套方案解决的核心问题是极端灾害台风、冰灾、洪水等来临前后配电网往往来不及完全依靠固定设备硬抗而移动储能车可以在灾前灵活的预先放置到关键节点附近灾后再根据故障实际情况动态转移、并网供电从而把负荷损失降到最低。这比单纯堆固定储能要划算得多也比完全靠抢修恢复快得多。适合正在研究配电网韧性提升、微网孤岛运行、移动储能调度的高年级本科生、研究生以及电力系统优化方向的工程师参考复现。1. 项目到底在解决什么问题1.1 配电网韧性是个啥概念韧性Resilience和传统的可靠性Reliability不一样。可靠性关注的是随机故障下的平均停电指标比如系统平均停电持续时间指标SAIDI、系统平均停电频率指标SAIFI这些长期统计量。韧性关注的则是极端小概率-高损失事件下系统性能曲线的下降幅度和恢复速度。简单说可靠性看的是“平时稳不稳”韧性看的是“被重锤砸了之后能不能挺住、能不能快速缓过来”。台风过境这种场景配电网往往不是一根线断而是区域性成片故障分布式电源、固定储能如果恰好不在关键节点附近基本帮不上忙。所以就有了移动储能这种“平时可用、灾时可动”的资源。在IEEE33节点的标准算例里复现这个策略核心价值在于你不用去处理一堆地理信息、路网约束这些旁支细节可以把注意力全放在储能怎么布置、怎么移动、怎么出力这个主逻辑上。等主逻辑跑通再往实际系统迁移就会顺畅很多。1.2 为什么选移动储能而不是固定储能拿生活来打个比方。固定储能像家里的固定电话位置定死了停电时如果人不在旁边它再好用也使不上劲。移动储能更像共享充电宝哪里缺电就调度到哪里去灵活度高了好几个量级。在配电网韧性提升场景下移动储能有几个天然优势。一是灾前预布局。虽然灾害路径有不确定性但往往有预测范围可以在台风登陆前12到24小时把储能车开到预测的关键节点附近待命。这就像暴雨预警前把沙袋放到容易进水的小区门口而不是等水淹了再满城找沙袋。二是灾中动态调度。故障发生后受损区域可能有多个孤岛每个孤岛里如果有分布式光伏或者小水电还能撑着但缺的是短时功率支撑和电量支撑。移动储能车可以在道路通行允许的前提下从一个孤岛转移到另一个孤岛轮流支撑关键负荷。这相当于把有限的储能资源当成“救火队”用谁最危急先支援谁。三是灾后恢复辅助。配电网重构也好、抢修联动也好在合闸和并网的过程中往往伴随短时电压波动移动储能可以临时充当电压支撑源配合黑启动过程。固定储能当然也有不可替代的优势比如响应快、容量大、不用考虑运输时间。但移动储能突出的就是“时空可转移”这四个字这也是本课题模型里最核心的变量。1.3 这份代码方案和普通储能的区别单纯做储能优化调度的代码很多但通常都是固定位置、固定接入点属于“给定储能在哪然后去优化充放电功率”。这份实现真正把装备预布局和灾后转场两层决策放进了同一个建模框架里。说得直白一点普通调度代码的变量是“某个时刻充多少电、放多少电”而这份代码的变量还包括“储能车预先放在哪个节点”“故障发生后移动到哪个节点”“什么时候转移到下一个节点”。这就带来了一个很关键的建模区别普通调度是连续时间上的功率分配而这个课题是功率分配加上离散的资源选址和路径转移本质上是混合整数优化问题。后面我会详细说这里面的坑。2. 整体模型与数学框架拆解2.1 两阶段决策框架移动储能参与韧性提升不能用一个单一时间断面去建模因为决策发生在不同时刻信息来源和确定程度也不同。这里采用的是学术界比较标准的两阶段随机优化框架。第一阶段是灾前预布局。在灾害事件发生前基于对故障场景的预测比如根据台风路径预报生成多个可能受损的设备场景决定移动储能车的初始停放节点。这个决策必须在灾害发生前锁定因为一旦灾害来临道路可能中断储能车没法再大规模移动。第二阶段是灾后动态调度。观测到实际故障发生后在配电网重构、分布式电源出力、负荷需求等条件下动态决定移动储能车的转场路径、接入节点、充放电功率以及停电负荷的恢复量。两阶段之间的耦合点就是第一阶段的预布局结果——车载储能初始在哪直接决定了第二阶段灾害刚发生时能多快支撑起第一个孤岛。从目标函数的角度很多文献用“最小化负荷削减期望值”也有用“最大化恢复负荷量”的。本质上一样就是让韧性曲线中间那个下凹的坑尽可能浅、尽可能短。2.2 预布局阶段的核心变量和约束预布局阶段最重要的变量是布点变量。假设系统有若干个候选节点每台移动储能车选择一个节点接入。这是一个二进制变量比如储能车 v 是否在 预布局阶段放在节点 i。在这个阶段约束相对简单无非是一台车最多放在一个节点一个节点最多接入一台车根据容量和现场条件决定可调整预布局节点的数量不能超过车队总数如果有充电条件约束还要考虑预布局期间储能车的SOC状态一般假设出发时是满电的或者允许在预布局节点充满。这里特别提醒一点预布局节点和候选接入节点往往不是同一个集合。预布局要考虑地理可达性和场地条件往往选在变电站附近、关键馈线首端或者重要用户所在的节点附近。而故障后动态调度阶段的接入节点可以是分布在网络各处的负荷节点、联络开关附近节点等。2.3 动态调度阶段的核心约束第二阶段才是模型的重头戏包含的网络约束和时序约束比较多。储能车转场约束是移动储能区别于固定储能的核心。储能车在时刻 t 位于节点 i到 t1 时刻要么原地不动要么移动到相邻节点。如果用二进制变量 m(i,j,t) 表示时刻 t 到 t1 是否从节点 i 转移到节点 j那么需要满足每台车每个时刻至多转移一次车在 t1 的位置等于 t 的位置加上转移效果如果移动需要消耗时间一般假设跨节点转移耗时一个调度步长如果时间尺度更细可以设转移时间矩阵转场过程中不能充放电即功率为 0。这部分实现起来最繁琐的其实是时空一致性因为位置变量、转移变量、功率变量之间需要互相耦合稍不注意就会出现“车还没到节点却已经在放电了”这种逻辑上不可能的调度结果。充放电功率约束和普通储能一致包括充放电功率上下限、SOC动态方程以及SOC上下限。移动储能车一般容量不大常见的配置是250kW/500kWh到500kW/1000kWh这个区间对应一辆中型储能车。潮流约束是配电网络侧的约束。由于要处理孤岛运行状态网络拓扑不再是一个简单的辐射状连通图。常见做法是引入辅助二进制变量表示线路是否投入运行然后用DistFlow方程建立潮流模型并通过大M法或者二阶锥松弛来处理潮流方程中的二次项。2.4 目标函数设置与韧性指标大多数文献的目标函数可以写成最小化所有场景下的负荷削减风险[ \min \sum_{s \in S} p_s \sum_{t \in T} \sum_{i \in N} w_i \cdot (1 - \lambda_{i,t,s}) \cdot P_{i,t}^L ]其中 λ 是负荷恢复比例w 是负荷权重重要负荷权重大普通负荷权重小p 是场景概率。这里有个工程经验可以分享对重要负荷的权重设置非常关键。如果所有负荷权重一样优化结果往往是雨露均沾每个节点都恢复一点但重要的医院、通信基站可能得不到足够的功率支撑。实际做项目时我一般给一级负荷设10倍以上的权重仿真结果会更贴近调度员的实际操作习惯。韧性指标的落地通常在得到优化结果后通过系统的“时间-性能曲线”来刻画也就是计算每个时刻系统负荷供应率或可用容量百分比然后考察曲线的最低点韧性下降幅度、在低水平停留的时间韧性持续损失时间以及恢复到正常水平的斜率恢复速率。移动储能预布局与动态调度主要作用于“降低下降幅度”和“加快恢复速度”这两个环节。3. IEEE33节点系统与算例设计细节3.1 IEEE33节点系统的基本参数IEEE33节点是配电网研究里的经典算例我见到的大多数相关方向文献都会拿它做基准测试。这个系统的基本情况是基准电压12.66千伏33个节点32条支路5条联络开关总负荷约5084千瓦加2547千乏也有版本用3715千瓦加2300千乏数据不同是因为部分文献对负荷做了标准化处理复现的时候一定注意保持全网数据统一。网络结构上它是典型的辐射状结构1号节点为电源点通过主变压器与上级电网相连。对于移动储能调度来说这种规模的好处是潮流计算快模型求解压力适中同时网络结构又有足够的分支去构造孤岛场景。比如把中段某几条支路断开就能形成带分布式电源的孤岛运行区域。做预布局时我不会把全部33个节点都当作候选节点那会显著增加整数变量个数。一般根据拓扑特征筛选出6到10个关键节点作为候选布点集比如馈线末端节点末端容易电压越限储能支撑效果好大负荷节点负荷集中恢复收益高联络开关附近节点方便形成孤岛和转供分布式电源接入节点可以和分布式电源联合支撑孤岛。3.2 故障场景怎么构造灾害场景的构造直接影响预布局结果。我用的是场景法根据历史灾害数据或者气象预报生成一组故障场景每个场景对应不同的线路开断组合和故障时段。一个比较实用的做法是先给定几个典型故障区域比如“首段故障”“中段故障”“末端故障”再在每个区域内随机选择少量线路作为故障集故障线路数控制在2到5条。这样既有足够的场景覆盖度又不会让枚举指数爆炸。举个例子场景故障线路影响区域概率S1线路2-3、3-4馈线主干中断末端大面积停电0.3S2线路6-7、8-9中段辐射支线孤岛0.25S3线路10-11、12-13末端支线孤岛0.25S4线路15-16、25-26双侧末端负荷失电0.2场景概率的设置对预布局结果影响很大。如果概率高的场景都集中在网络中部预布局点自然往中部靠如果均匀分布布点就会比较分散。这一点在做结果分析时可以重点观察。如果后期想做得更深入可以用蒙特卡洛采样生成大量场景再用同步回代缩减法fast forward selection把场景削减到几十个以内这样能明显提高求解效率。但初次复现时建议先用20个以内的场景把流程跑通。3.3 移动储能参数设置建议移动储能车参数要贴近实际不能拍脑袋。以下是我在一组对照测试中用的参数储能车数量2到3台单台容量500千瓦时功率上限200千瓦充放电对称SOC范围10%到90%初始SOC90%转移耗时同一电气区域内部转移一个调度步长15分钟跨区域转移两个步长调度时段24小时96个时间点15分钟分辨率这里我特别想提醒第一次做这个课题的朋友时间分辨率选择很关键。如果用1小时分辨率一天才24个点求解快但调度指令太粗糙无法体现储能车“先支援A孤岛再转移去B孤岛”这种时序转移的价值。用15分钟分辨率点数是96个计算量上升很多但才能看到移动储能的动态优势。如果计算机性能有限建议先做两步走先用60分钟分辨率跑通功能确认建模正确再切换到15分钟分辨率做正式实验。不要一上来就跑全部分辨率否则模型有bug的时候调试成本会很高。4. Matlab代码实现的关键环节4.1 建模工具与求解器选型以Matlab为主的复现方案中优先推荐用Yalmip工具箱建模因为Yalmip对混合整数二阶锥规划支持得比较友好代码表达清晰排查约束比较直观。求解器方面如果有条件用Gurobi或CPLEX那是最省心的直接求解MISOCP没有问题如果条件有限可以试试免费的Mosek或SCIP。比较尴尬的是Matlab自带的intlinprog只能求解混合整数线性规划处理不了二阶锥约束遇到这种情况要么把DistFlow二阶锥约束近似成线性约束要么换求解器。我在实际复现过程中踩过的一个坑是MISOCP的求解时间对节点数和时间点数非常敏感。33节点加96个时点再加3台储能车整型变量能轻松破万Gurobi默认参数下有时候能跑几十分钟甚至更久。这时候就不要傻等了要用以下手段加速开启Gurobi的MIPFocus参数设置成3强调快速找到好解而不是证明最优设置TimeLimit参数比如600秒到期取当前最优解削减场景数量至5到10个适当松弛整数变量的Big-M值减小约束矩阵的条件数。4.2 核心代码骨架示例代码框架一般分成四层参数定义层、变量定义层、约束组装层、求解与结果输出层。下面给出一段我整理的Yalmip骨架代码帮助你先理解结构。%% 算例参数定义 % 系统参数 N 33; % 节点数 T 96; % 时间段数 TimeStep 15/60; % 小时 % 移动储能参数 numMES 2; % 移动储能车数量 CapMES 500; % kWh PMaxMES 200; % kW SOCMin 0.1; SOCMax 0.9; SOC0 0.9; % 候选布点与动态接入位置集合 initCandidates [5, 12, 18, 25, 30]; dynCandidates [3, 5, 6, 7, 10, 12, 18, 22, 25, 30]; %% 定义优化变量 % 预布局位置 x(i) 二进制 x_pre binvar(33, numMES, full); % 动态位置 w(v, i, t) 二进制 w_pos binvar(numMES, N, T, full); % 充放电功率 p_ch, p_dis (kW) p_ch sdpvar(numMES, N, T, full); p_dis sdpvar(numMES, N, T, full); % SOC变量 soc sdpvar(numMES, N, T, full); % 节点电压、支路潮流DistFlow P_ij sdpvar(32, T, full); Q_ij sdpvar(32, T, full); V_sq sdpvar(33, T, full); % 电压幅值平方 %% 约束条件 Constraints []; % 预布局约束每台车只能放置在一个候选节点 for v 1:numMES Constraints [Constraints, sum(x_pre(:, v)) 1]; end % 动态位置一致性任一时刻车有且仅有一个接入节点 for v 1:numMES for t 1:T Constraints [Constraints, sum(w_pos(v, :, t)) 1]; end end % 预布局与初始动态位置一致性 for v 1:numMES Constraints [Constraints, w_pos(v, :, 1) x_pre(:, v)]; end % SOC动态方程 for v 1:numMES for t 2:T for i 1:N Constraints [Constraints, ... soc(v, i, t) soc(v, i, t-1) TimeStep*(p_ch(v,i,t)/1000 - p_dis(v,i,t)/1000)]; end end end %% 求解 ops sdpsettings(solver, gurobi, verbose, 2, ... gurobi.TimeLimit, 600, gurobi.MIPGap, 0.05); optimize(Constraints, Objective, ops);注意这段骨架代码做了大量简化实际使用中还需要加入储能车转移约束w_pos在时间上的空间连续性、充放电互斥约束、节点功率平衡约束、DistFlow约束以及孤岛负荷恢复约束。但整体结构就是这样的分层搭建思路。4.3 第二阶段的转移逻辑必须用额外约束锁死我通读很多初版代码发现很多人把动态位置变量 w_pos 定义好之后就直接写SOC方程和功率平衡结果跑出来发现储能车的SOC轨迹完全不符合物理规律。原因是只定义了“车在某时刻属于某个节点”但没定义“车如何从一个节点到另一个节点”。没有转场约束的模型里优化器可以让一辆车第1时刻在节点5放电第2时刻在节点20放电第3时刻又在节点7充电看起来每个时刻的位置都满足约束但实际车辆不可能瞬移。所以必须额外添加转场约束% 转移连续性约束车辆v在时刻t位于节点i则在t1只能位于i或与i相邻的节点 for v 1:numMES for t 1:T-1 for i 1:N if w_pos(v,i,t) 1 % 相邻节点集合 neighbor{i} Constraints [Constraints, ... w_pos(v, i, t1) sum(w_pos(v, j, t1) for j in neighbor{i}) 1]; end end end end这里需要注意Matlab的Yalmip语法里没法直接对二进制变量做“if 1”这种逻辑判断你需要用大M法或指数型约束。我当时实现时是构造了转移变量 trans(v, i, j, t)然后用三个约束把它们耦合起来核心思想就是前一刻在 i后一刻位置只能是 i 或相邻节点。这一步是整个建模过程中逻辑最绕、也是出错率最高的地方做完之后一定要做后检验输出每台车每个时刻的位置序列人工核对是否存在瞬移。5. 结果分析与可视化方法5.1 预布局结果怎么呈现预布局结果是一个二进制选择矩阵直观展示方式是在IEEE33节点的单线图上标出储能车的初始位置。我习惯用不同颜色区分不同车再用圆圈标注候选节点。如果做多场景对比可以生成一张表格列出不同场景概率下的布点方案差异比如方案车1位置车2位置车3位置对应的负荷切除期望均匀场景节点12节点25节点5128kWh概率偏向中段节点18节点7节点30103kWh概率偏向末端节点30节点12节点5141kWh这种对比最容易讲清楚一个观点预布局是跟着风险走的不是拍脑袋选的。5.2 动态调度曲线怎么解读动态调度结果的核心是两个图。第一张图是各台储能车的SOC随时间变化曲线多条曲线画在同一张图上。从这张图上能清楚看到储能车在哪个时段放电、哪个时段充电、哪个时段处于转场停运状态。转场期间SOC是一条水平线功率为零这是判断转移约束有没有生效的直观证据。第二张图是节点电压分布或负荷恢复比例热力图。横轴时间、纵轴节点、颜色表示电压或负荷恢复程度。这种图很适合放进论文里展示时空动态效果能一眼看出哪些节点在什么时段被恢复了哪些节点恢复得晚。第三个推荐画的是系统韧性曲线即总供电负荷占正常负荷的比例随时间的变化。对比无储能、固定储能、移动储能三条曲线三者的差异就是移动储能价值的最直观体现。实测下来移动储能在严重故障场景下能把最低点抬高8到15个百分点恢复速度也能提前2到3个小时。5.3 对比实验设计建议做这个课题对比实验做得越扎实结论就越有说服力。我建议至少设计四组方案方案A无储能仅靠重构恢复方案B固定储能位置提前给定且不可移动方案C移动储能但只做灾前预布局灾后不转场等价于“位置选得好的固定储能”方案D移动储能预布局加动态转场本文方法四组方案对比核心论点就很清晰了D比C强说明动态转场有价值C比B强说明预布局有价值。如果D和C差距不大反而说明灾害场景里道路转移条件太差或者时间窗口太短这时候你的分析重点要转向“什么时候转场价值高、什么时候价值低”。这个研究方向上有不少文献已经指出当故障持续时间较长、道路可通行窗口充分、多个孤岛相距较近时动态转移的增益最明显。反过来如果故障在2小时内就被修复储能车可能刚到位就要返程移动价值就被削弱了。6. 常见问题与排查技巧实录6.1 求解器报“Infeasible Problem”怎么办这是做MILP/MISOCP最常碰到的问题。模型不可行通常不是某一个约束写错了而是多个约束之间的矛盾造成的。排查顺序我一般是这样先把所有和移动储能相关的二进制变量固定成某个已知可行解比如把储能车全部固定初始位置不参与转移然后求解连续优化问题看是否可行。如果连续问题可行再把位置变量按时间顺序逐步放开逐步缩小不可行范围。重点检查SOC动态方程里的充放电效率。很多模型初版默认充电效率100%但实际是95%左右。如果设置了不等于1的效率SOC方程用效率系数耦合要注意数值方向别搞反了。检查节点功率平衡约束里负荷和电源的方向定义。DistFlow中注入功率为正、负荷取出的方向各家代码符号习惯不一样一旦跟储能功率方向对不上模型必然不可行。另外一定检查时间尺度的单位统一。我见过把功率单位设为kW、储能容量设为MWh结果SOC变化量差了一千倍的情况表面上看不可行实际上只是单位错乱。6.2 求解时间过长怎么加速如果Gurobi跑了几十分钟还卡在10%的MIP Gap上我的经验是从三个方向下手降场景数。把20个场景削减到5个代表性场景计算量基本能降到原来的四分之一以下。降对称性。多台移动储能车如果参数完全相同模型里会产生大量对称解Gurobi会在等价分支里反复搜索。解决办法是给每台车设置微小的参数差异比如初始SOC相差2%或者固定第一台车的候选布点序号小于第二台。添加有效不等式。比如如果一台车在某时刻根本不参与任何供电那么它转移的二进制变量应该为0。这类逻辑约束可以大幅收紧搜索空间。有个通用经验问题规模大到一定程度求解器调参比建模优化更能立竿见影。Gurobi相关参数中MIPFocus3、MIPGap0.05、TimeLimit300是我跑这类模型的标准配置大多数情况下都能在数分钟内给出工业级可用的满意解。6.3 二阶锥松弛不紧导致奇怪结果DistFlow的潮流方程为[ U_j U_i - 2(r_{ij}P_{ij} x_{ij}Q_{ij}) (r_{ij}^2 x_{ij}^2) L_{ij} ]其中 ( L_{ij} ) 是电流平方。为了保证模型凸性一般把 ( P_{ij}^2 Q_{ij}^2 \leq U_i L_{ij} ) 作为二阶锥形式引入即经典SOCR。但这里有一个局部最优的问题SOCR只有在目标函数“鼓励”电流尽可能小的时候才是紧的。如果你的目标函数里有某种让电流增大的机制比如给储能充电的协调策略反而鼓励网损增大松弛可能不紧求出来的解实际上不满足原始潮流方程。排查方法很简单求解后用原始潮流方程逐时段验算一遍电压和潮流把偏差最大的节点、时段打出来看。如果偏差明显就把该节点的二阶锥约束改成等号约束或者在该节点上用大M法加入电压偏差惩罚项。6.4 场景削减后结果不稳定怎么办场景削减本来是降计算量的好办法但削减后的结果往往和全场景结果有偏差。如果只做几组场景然后发现结果波动很大先别急着怀疑算法大概率是场景代表性不足。我当时做的一个案例里5个削减场景得到的预布局方案与20个原始场景的最优方案不一致原因是最优布点恰好在一个被削减掉的场景对应的关键位置附近。解决办法是保留该场景再重新削减或者采用收敛性判断——多次用不同的初始场景子集跑如果最优布点变化不大说明结果对场景选择不敏感如果每次布点都不一样说明需要增加场景数或调整场景概率。7. 个人体会与后续可以扩展的方向模型框架跑通代码结构稳定之后我自己最大的感触是这个课题的难度并不在于数学建模本身有多深而在于把“时空转移”的逻辑用离散变量准确表达出来并且时刻保持物理常识感——优化结果出来以后先问自己一句储能车真的能从A点开到B点吗如果不能模型里一定缺了约束。从扩展角度来说这套框架后续还有几个很好的升级方向。一是把交通网和配电网耦合起来。车载储能的转场时间、路径选择目前是按简化的转移时间矩阵处理的如果加入实际路网信息距离、拥塞、道路是否被灾损破坏模型会贴近工程实际得多当然求解难度也会大幅上升。二是加入修复时序协同。目前的模型只优化储能调度和重构没有跟抢修队路径规划、修复顺序选择协同优化。现实中储能车到了现场还要等抢修队完成线路修复才能并网这个协同优化价值很大但也复杂很多建议在基础版本彻底搞懂之后再往这个方向延伸。三是把台风、暴雨的气象动态预测直接耦合进场景生成。如果能够把气象模式输出的时间变化趋势转化为故障概率的时变参数预布局方案就可以做到“滚动更新、动态调防”而不是只做一次性静态决策。最后再分享一个小技巧。很多人拿到这类代课题喜欢先去找代码资源。这个可以但建议先自己把数学建模推一遍至少把变量表、约束表、目标函数手写清楚。这一步做好后面看任何人的代码都是降维打击。我见过太多同学因为没有提前建模拿着现成代码跑了好几天连变量维度都对不上改起来完全无从下手。希望这套从建模到实现的完整过程能给你一个清晰的参考。移动储能这个方向还有很大的研究空间基础版本跑通之后能延伸的方向非常多祝顺利。