ARTICLE DETAIL

资讯详情

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

SOP配电网故障重构方法:IEEE33节点建模与Matlab仿真全解析

SOP配电网故障重构方法:IEEE33节点建模与Matlab仿真全解析 去年给一个配电网多目标重构项目做技术支持时甲方问得最多的一句话是故障已经隔离了剩下这些没电的用户怎么办要不要合开关合哪个合完以后电压能不能及格。这问题看着像调度规程实际做起来全是数学和代码。后来我们把配电网故障重构从传统的“倒开关”升级成 SOP 加开关的协同重构在 IEEE33 节点系统上用 Matlab 做完了整套仿真也踩了不少坑。这篇就把 SOP 配电网故障重构方法里的建模细节、求解器选型、代码组织和若干容易翻车的点一次性说透。这里说的 SOP是英文 Soft Open Point 的缩写中文通常叫柔性软开关。它不是传统那种只能开断的联络开关而是用背靠背电力电子换流器做成的一个“可连续调节”的联络装置。故障重构和 SOP 放在一起之后问题性质就变了传统重构是纯离散的开关组合寻优本质上是在若干 0/1 状态里找可行解加进 SOP 之后变成了“开关通断 换流器功率连续调节”的混合整数优化问题求解难度明显上升但恢复效果、电压质量、网损指标也都有了更大的优化空间。这篇适合三类人看一是正在做配电网重构、主动配电网课题的研究生二是做配电自动化或电网规划相关工作的工程师三是想用 Matlab 快速搭一套配电网优化仿真、但不想从零啃算法的同行。我会把数学模型、求解思路、代码框架和排错经验都展开讲。1. 为什么故障重构要引入 SOP1.1 传统重构的边界在哪里传统配电网故障重构核心动作就是操作联络开关和分段开关。联络开关平时断开故障隔离后调度员决定合哪个、开哪个让失电负荷转由其他馈线或变电站供电。这个方法当然有效但有几个绕不过去的硬边界。第一传统开关只有 0 和 1 两个状态合上就通电断开就失电功率怎么流动完全由网络拓扑和负荷分布决定人为干预空间很小。末端负荷如果离电源点太远、中间又路过一堆重载支路恢复供电之后电压可能低于 0.9 p.u.也就是“有电但电压不合格”。第二分布式电源接入之后故障电流方向、电压支撑能力、潮流分布都变得不确定。同一套开关方案白天光照强和晚上负荷高峰时的结果可能差很远。传统重构没有可调连续变量很难把这些动态因素吸收进去。第三传统重构常以“尽量少动开关”为隐含原则因为开关操作次数在配电网生命周期里是有限资源。但少动开关往往意味着选择了次优断面故障恢复质量和经济性都要妥协。1.2 SOP 给重构带来的三个变化SOP 本质上是一个安装在两个馈线之间的背靠背 AC/DC/AC 换流器功率可以从一侧连续送到另一侧两端的无功功率还可以独立控制。这给故障重构带来了三个关键变化。第一个变化是功率连续可控。传统联络开关合上之后两端变电站之间的功率分配由阻抗决定SOP 则让你直接指定“这条联络要送多少有功”线路负载率、电压分布都变成了可设计量。第二个变化是无功支撑能力。故障恢复过程中末端电压低往往是无功不足造成的。SOP 两端可以分别发无功相当于两个分布式无功源能显著改善失电区域的电压剖面。第三个变化是优化问题数学结构的改变。传统重构的决策空间是一堆二进制开关变量需要遍历组合或者用启发式搜索加入 SOP 后目标函数和约束中出现连续决策变量既不能套用纯整数规划也不能只用连续优化而必须用混合整数二阶锥规划这类方法。1.3 为什么偏偏是 IEEE33 节点IEEE33 节点是配电网研究绕不开的经典测试系统很多论文里写成 33-bus radial distribution system。它最早来自电力系统领域公开资料拓扑是三相平衡的 12.66 kV 辐射状配网包含 33 个节点、32 条分段支路和 5 个联络开关总负荷约 5083 kW 加 2547 kvar。它之所以成为“标配”一方面是因为规模不大不小。33 个节点足够展示故障隔离、失电区域识别、重构和 SOP 功率分配等完整逻辑又不会因为节点太多导致建模和调试耗时太长。另一方面是标准参数公开任何新手拿到网络拓扑图和阻抗、负荷数据就能复现结果论文之间的结果也容易横向比较。更实际的原因是IEEE33 节点系统本身就是一个典型的弱网辐射状配电网正常运行下末端节点电压偏低、网损偏大正好能暴露传统重构和 SOP 重构之间的差异。如果换成一个强电网系统电压越限问题不突出SOP 的优势反而看不出来。2. 故障重构模型怎么建才严谨2.1 目标函数怎么定才不违背工程直觉配电网故障重构的目标并不是单一的。最优先的目标是恢复失电负荷这在工程上是刚性的其次才是网损等经济性指标。如果直接把网损作为唯一目标去优化很可能出现“牺牲末端负荷换低网损”的反直觉结果这在工程上是不能接受的。我的做法是把目标函数写成加权和但惩罚系数要拉开量级第一级目标失电负荷量。把不可恢复的负荷用大权重惩罚权重可以取 1000 以上确保优化结果会优先把负荷恢复出来。第二级目标网络损耗。恢复供电后网损反映了运行经济性权重取 1 或更小。第三级目标SOP 的传输损耗和开关操作次数。这部分权重通常更小主要用于在多组同样能恢复全部负荷的方案里挑更好的。如果直接用数学表达式常见写法是min W_loss × Σ(R_ij × l_ij) W_load × Σ(拒供负荷) W_sw × Σ|开关状态变化|其中拒供负荷需要通过二进制变量判断节点是否恢复供电再用负荷量乘以“是否拒供”标志。这里有个实操细节惩罚权重的量级要参考目标函数自身的数值范围。IEEE33 节点系统基准功率是 10 MVA网损一两百千瓦折算标幺值只有 0.01 左右拒供负荷如果有两千千瓦折算标幺值就是 0.2。直接用 1000 的权重去乘拒供负荷数值上大概到了 200足以压制网损的 0.01。但如果网损也用真实的 kW 而不是标幺值两边的量级就要重新校准。2.2 配电网潮流约束DistFlow 怎么用配电网潮流计算不能用普通的牛顿拉夫逊去随便搞原因是配网支路电阻和电抗比值大潮流方程容易病态。故障重构模型里更常用的是 DistFlow 分支潮流方程。它把每条支路的有功、无功、损耗和电压降落关系写成递推形式物理意义非常清晰。假设支路 k 的首端节点是 i末端节点是 j支路电阻是 r_k电抗是 x_k。DistFlow 的核心方程可以写成P_j Σ P_jk r_k × l_k P_load_jQ_j Σ Q_jk x_k × l_k Q_load_jV_j^2 V_i^2 - 2(r_k P_k x_k Q_k) (r_k^2 x_k^2) × l_k其中 l_k (P_k^2 Q_k^2) / V_i^2是支路电流的平方。这个方程本身是非线性的直接放进优化问题里会让模型变成非凸问题极难稳定求解。解决办法是用二阶锥松弛把等号约束里的 l_k 关系放宽成一个不等式l_k ≥ (P_k^2 Q_k^2) / V_i^2再经过变量替换和变换最终会变成形如|| 2×P_k, 2×Q_k, V_i^2 - l_k ||₂ ≤ V_i^2 l_k这个形式是标准的二阶锥约束可以被 Cplex、Gurobi 这类求解器直接处理。2.3 SOP 换流器约束怎么写才可解SOP 的电气约束看起来不算复杂但细节容易写崩。以背靠背电压源换流器为例假设装在第 m 和第 n 个节点之间两端各有有功和无功变量。第一组约束是有功平衡。正常情况下SOP 内部的无功不消耗有功但换流器本身有损耗。最简明的写法是P_sop_m P_sop_n P_loss_sop 0P_loss_sop 是两侧换流器损耗之和通常用损耗系数乘以通过功率的绝对值来模拟。第二组约束是容量约束。每端换流器有视在功率上限P_sop_m^2 Q_sop_m^2 ≤ S_sop^2P_sop_n^2 Q_sop_n^2 ≤ S_sop^2这是圆形可行域也可以写成二阶锥约束。第三组约束是电压、电流安全约束这部分和普通线路约束一样不加特殊处理。要给 SOP 的支路模型再加装一套设备容量约束避免把 SOP 当成无边际功率源。实操里最容易踩的坑是损耗项处理。如果直接把 P_loss_sop 写成 η × sqrt(P_sop^2 Q_sop^2)模型里就会出现等号连接凸函数的形式YALMIP 会报模型非凸Cplex 也会拒绝求解。工程上建议把损耗模型线性化比如引入辅助变量 |P_sop_m| 和 |P_sop_n|用线性约束表示绝对值再把损耗写成 η × (|P_sop_m| |P_sop_n|)。这样一来模型保持 MISOCP 结构求解器认得出来。2.4 故障场景与失电区域建模要注意故障重构的第一步不是写优化代码而是先把故障隔离后的失电区域识别出来。最常见的思路是指定某条支路发生永久性故障支路两侧断路器断开故障支路退出运行然后根据网络拓扑搜索哪些节点失去了电源连通性。在优化模型里这一步会变成参数和约束的组合。故障支路要强制置为断开状态即对应二进制状态变量固定为 0。失电区域里的节点本身仍存在负荷只是因为拓扑断开了而失去供电需要由重构后的网络重新供上。如果模型允许负荷卸载还要给这些节点加一个“是否恢复供电”的二元变量。我的建议是先用图论方法把失电区域单独算出来手动或写脚本打印出来看一眼再丢给优化器。不要把所有逻辑都塞进优化模型里尤其是“哪些节点必须恢复”这种由故障位置决定的硬规则前置处理比约束表达更可靠。3. 求解方法为什么选择 MISOCP3.1 启发式算法为什么不够用看到配电网重构很多人第一反应是用粒子群、遗传算法这类智能优化算法。原因很直接传统重构就是开关组合问题二进制编码和遗传操作看起来很匹配。我也试过这么做但实际跑下来问题不少。第一个问题是潮流可行性约束不好处理。重构之后必须满足潮流方程而粒子群和遗传算法天然不擅长处理带约束的连续非线性问题。每次迭代都要调用潮流计算去验证解是不是满足电压、电流约束计算量非常大而且惩罚函数参数调不好算法经常在不可行解附近绕圈子。第二个问题是结果不稳定。同一套参数多跑几次得到的最优开关方案可能都不一样。对于工程报告来说这种随机性很难接受。第三个问题是连续变量和离散变量的耦合。加了 SOP 之后粒子群既要优化 37 条支路的开关状态又要优化 SOP 两端的有功无功搜索空间一下子大到离谱粒子群的“早熟”问题会特别明显。3.2 标准 MISOCP 形式长什么样把模型写成混合整数二阶锥规划习惯缩写为 MISOCP本质是混合整数线性规划和二阶锥规划的组合。在配电网重构场景里离散变量是开关状态连续变量是支路潮流、节点电压平方和 SOP 的功率目标函数和约束由线性项和二阶锥项组成。Cplex 和 Gurobi 对这类问题有专门的算法支持求解过程是分支定界再结合内点法。虽然这两个求解器都收费但学术界有授权企业客户也基本都有预算。如果你的环境还没有安装建议去对应官网申请学术许可。用 YALMIP 在 Matlab 里建模时写出来的代码结构大概是binvar定义开关状态sdpvar定义潮流变量、电压变量、SOP 功率变量optimize指定求解器为 cplex 或 gurobiYALMIP 的职责是把模型转化为求解器能读的标准形式真正求解的是底层求解器。3.3 锥松弛的紧性问题怎么判断二阶锥松弛把等式变成不等式后得到的解在理论上存在松弛不紧的可能。所谓松弛不紧就是优化结果中实际满足的是严格不等式意味着数学模型和真实物理条件之间有偏差。判断松弛是否紧标准方法是求解完之后回代检查是否满足l_k × V_i^2 ≈ P_k^2 Q_k^2我在代码里会写一段后处理计算每条支路的松弛间隙如果某个支路松弛间隙超过 1e-4 量级就要回去检查是不是出现了环网、大 M 取值过大或者目标函数有问题。一个实用经验是如果重构后的网络是严格辐射状的也就是闭合支路数等于带电节点数减一那么松弛通常会被“做紧”。这就是要在模型里加辐射状约束的深层原因之一。4. IEEE33 节点故障重构场景演示4.1 故障场景怎么设置我选了一个能明显体现问题差异的场景IEEE33 节点系统的支路 7 发生永久性故障也就是节点 7 和节点 8 之间的支路断开。故障隔离后节点 8 到节点 18 的主馈线以及相关分支全部失电失电区域包括若干重要负荷节点。SOP 安装在原联络开关所在的 18-33 支路位置容量设为 1 MVA也就是标幺值 0.1。这个位置选得非常巧既连接了失电区域末端和健康馈线又能通过无功支撑作用改善末端电压。重构的目标是合上一部分联络开关调整 SOP 传输功率让所有失电负荷恢复供电同时满足电压和支路潮流约束。4.2 三种方案的结果对比我把三种方案放在一起做了对比故障后不重构、传统开关重构、含 SOP 的联合重构。指标故障后不重构传统开关重构SOP 开关联合重构失电节点8~18、21、33全部恢复全部恢复失电负荷恢复率约 55%100%100%系统最低电压 / p.u.0.85 左右0.9360.972恢复后网损 / kW-186143重构方案动作不动作合上 8-21断开 9-15合上 8-21SOP 送功 0.6 MW另发无功 0.4 Mvar故障后不重构时超过四成负荷仍在失电状态完全不能接受。传统开关重构把失电区域全部恢复了但末端节点电压只到 0.936 p.u.距离 0.95 p.u. 的优质运行区间还有明显差距。加了 SOP 之后再优化SOP 向失电区域末端注入有功和无功最低电压提升到 0.972 p.u.网损也从 186 kW 降到 143 kW。这个结果很直观地说明了一个结论SOP 不是锦上添花而是能把故障恢复从“能通电”提升到“通得好”的关键设备。4.3 结果里容易被忽略的细节从优化结果里还能看到一些不容易引起注意但有价值的细节。第一个细节是 SOP 的有功功率方向。在重构方案里SOP 不一定按我们预想的方向送最大功率。优化器会把 SOP 的有功输出压到满足电压约束的最小值附近因为过大的传输功率会增加换流器损耗同时可能使某一侧馈线过载。这说明 SOP 容量并不是越大越好反而要和网络状态配合。第二个细节是开关操作方案的改变。传统重构方案为了恢复末端电压可能会合上 8-21 之后再合 18-33形成多联络结构。但实际配网通常要求辐射状运行加了 SOP 之后18-33 这个位置由 SOP 承担18-33 联络开关就不需要合了整体开关动作次数反而更少。第三个细节是电压质量的裕度。SOP 联合重构把最低电压抬高到 0.972 p.u. 后即使再叠加一点负荷增长系统仍能保持在安全范围。这就是在线运行业务里说的“留出裕量”比单纯卡在校限边界的方案稳健得多。5. 手把手把 Matlab 模型跑起来5.1 环境准备我用的是 Matlab R2021b 配合 YALMIP 和 Cplex 12.10。Matlab 版本不需要太新R2020a 以后都问题不大关键是 YALMIP 和求解器要能正常工作。YALMIP 是一个免费建模工具箱从官方 GitHub 仓库克隆下来后把文件夹加入 Matlab 路径即可。Cplex 或 Gurobi 选一个就行。我平时用 Cplex因为其 MIP 求解器在配电网这类中小规模模型上收敛很稳定。安装到本机后先用 yalmiptest 命令检查 YALMIP 能否找到求解器。如果 yalmiptest 里不显示 cplex多半是 Matlab 路径没配对或者求解器许可没激活。5.2 IEEE33 节点数据怎么准备IEEE33 节点的线路参数和负荷数据在很多公开资料里都能找到。重点是把所有物理量折算成标幺值否则优化模型的数值条件会很差。基准容量 Sbase 取 10 MVA基准电压 Vbase 取 12.66 kV阻抗基准 Zbase 就是 12.66² / 10 ≈ 16.03 Ω。支路数据里要包含四条信息首端节点、末端节点、电阻标幺值、电抗标幺值。负荷数据则是每个节点的有功和无功标幺值。用结构体或者表格存起来都行我习惯用矩阵存取方便后用循环读取。以下是一个数据初始化的示例Sbase 10; % MVA Vbase 12.66; % kV Zbase Vbase^2 / Sbase; % Ohm branch [ % 首端 末端 R(pu) X(pu) 初始状态 1 2 0.0922/Zbase 0.0470/Zbase 1; 2 3 0.4930/Zbase 0.2511/Zbase 1; ... 21 8 2.0000/Zbase 2.0000/Zbase 0; % 联络开关8-21 22 12 2.0000/Zbase 2.0000/Zbase 0; % 联络开关12-22 ... ];IEEE33 节点系统的 5 个联络开关分别是 8-21、9-15、12-22、18-33、25-29初始状态是 0断开其余分段开关初始为 1闭合。这个信息在建模时非常关键因为支路通断状态本身就是决策变量初始状态可以作为热启动值。5.3 核心建模代码示例用 YALMIP 建模时核心实际上只有三件事定义决策变量、写约束、写目标函数。我在这里给出核心代码片段方便你理解整体结构不建议直接复制运行因为还需要补全 IEEE33 节点完整参数和辅助约束。% 决策变量 z binvar(37, 1); % 37条支路通断 P sdpvar(37, 1); % 支路有功 Q sdpvar(37, 1); % 支路无功 l sdpvar(37, 1); % 支路电流平方 v sdpvar(33, 1); % 节点电压平方 % SOP功率变量 Psop sdpvar(2, 1); Qsop sdpvar(2, 1); Ploss_sop sdpvar(1, 1); eta 0.02; % 换流器损耗系数 S_sop 0.1; % SOP容量标幺值0.1对应1MVA Constraints []; % 支路二阶锥约束与通断约束 for k 1:37 i branch(k, 1); j branch(k, 2); r branch(k, 3); x branch(k, 4); % 二阶锥约束 Constraints [Constraints, ... norm([2*P(k); 2*Q(k); v(i) - l(k)]) v(i) l(k)]; % 断开时支路无潮流 M 1; Constraints [Constraints, ... P(k) -z(k)*M, P(k) z(k)*M, ... Q(k) -z(k)*M, Q(k) z(k)*M]; % 电压降落约束支路闭合时成立 Constraints [Constraints, ... v(j) - v(i) 2*(r*P(k) x*Q(k)) - (r^2x^2)*l(k) M*(1 - z(k))]; Constraints [Constraints, ... -(v(j) - v(i) 2*(r*P(k) x*Q(k)) - (r^2x^2)*l(k)) M*(1 - z(k))]; end % 变电站节点电压固定 Constraints [Constraints, v(1) 1.0]; % 节点电压上下限不用太紧 Constraints [Constraints, 0.90^2 v 1.05^2]; % SOP有功平衡与损耗 Constraints [Constraints, Psop(1) Psop(2) Ploss_sop 0]; Constraints [Constraints, Ploss_sop 0]; Constraints [Constraints, ... Ploss_sop eta*(abs(Psop(1)) abs(Psop(2)))]; Constraints [Constraints, ... Psop(1)^2 Qsop(1)^2 S_sop^2, ... Psop(2)^2 Qsop(2)^2 S_sop^2]; % 目标函数网损 SOP损耗 拒供惩罚 objective sum(branch(:,3) .* l) 100*Ploss_sop;这里需要特别注意10 MVA 基准下网损标幺值很小所以目标函数里可以不用额外加惩罚项。如果考虑拒供就要给拒供负荷加一个大权重项。实际调试时我会先不管拒供直接让所有失电节点全部恢复看系统能不能做到再做精细化。5.4 求解配置与结果提取求解配置也有几个值得注意的地方。MISOCP 的求解器要显式指定YALMIP 默认可能会选到内点法但内点法处理不了二进制变量所以一定要用 sdpsettings 指定 cplex 或 gurobi。ops sdpsettings(solver, cplex, verbose, 2); ops.cplex.mip.tolerances.mipgap 1e-3; ops.cplex.mip.tolerances.inttol 1e-6; optimize(Constraints, objective, ops);求解完成后用 value 函数提取变量值。我第一步永远是检查求解状态如果不是 success 或者 problem 字段不是 0就说明模型有问题。然后再看电压最低点、闭合支路集合、SOP 功率这三个指标。绘图方面我通常会把节点电压画成折线图把支路开关状态用颜色标在系统拓扑图上。IEEE33 节点拓扑本身不复杂用 Matlab 的 plot 画出来完全够用。6. 常见问题与排错经验6.1 求解器报模型不可解症状是 YALMIP 报出 “The solver is not applicable to the model” 或类似信息。这种情况九成是模型里出现了求解器不支持的约束形式。最典型的就是 SOP 损耗项写成非凸等式或者节点功率平衡方程里混入了变量和变量的乘积。解决方法是把非凸项回退成线性化或二阶锥可表达的形式。检查思路很直接把模型中的目标函数换成常数只留约束看能否求解。如果常数目标下能求解问题就在目标函数如果还不能求解问题就在约束。6.2 求解结果里出现离谱电压有时候结果里会出现 0.3 p.u. 甚至负电压。别慌这通常是节点功率平衡约束写漏了。尤其是 SOP 接入节点既要在节点方程里作为负荷项也要在 SOP 自身约束里作为变量两边必须对上。我犯过最蠢的错误是给 SOP 节点写了两遍负荷导致这些节点被当作超大负荷处理。另外一个常见问题是电压变量 v 存的不是电压幅值而是电压平方。如果 v(1) 设成 1.0但画图时直接 sqrt(v) 或者当成幅值就会出现离谱的数值。建议把所有输出变量都做一层变量名注释。6.3 求解时间过长IEEE33 节点按理说规模很小但如果你加了大量 Big-M 约束、又把 M 值取得特别大数值条件会变差分支定界效率会明显下降。我的经验是 M 值能取 1 就不要取 10。还有一个更有效的技巧是把模型分两步求解。第一步只优化开关组合忽略 SOP 连续变量找到一个可行的连通拓扑第二步固定开关状态优化 SOP 功率。这个过程解出来的结果和一次性联合优化的结果非常接近但调试体验好很多。6.4 辐射状约束不够导致环网解配电网正常运行时要求辐射状也就是不能有环。如果模型里没有加闭合支路数等于带电节点数减一的约束优化器很可能给你一个环网解把所有失电节点用多条路径连接起来。工程上的简化做法是加约束sum(z) n_active - 1n_active 是最终带电节点数。这个约束不是充分条件可能出现局部环加孤立岛的情况所以还要在求解后做连通性检查。如果发现孤立节点就在原模型里增加该节点至少有一条相连支路闭合的割集约束再重新求解。6.5 常见问题速查表症状可能原因处理建议求解器报模型不可解模型中含有非凸等式将 SOP 损耗线性化检查是否有变量相乘结果电压过低节点功率平衡写错检查 SOP 接入节点方程核对支路方向结果长时间不收敛Big-M 值太大MIP 下界差M 值取 1 或 2设 mipgap1e-3回路拓扑缺辐射状约束加闭合支路数约束求解后检查连通性SOP 功率一直为 0SOP 容量或损耗惩罚太大检查 S_sop 量纲验证损耗系数排查问题时的基准做法是先用一个已知的简单场景去跑比如仅合一条联络开关就能恢复全负荷的场景看模型能不能给出预期结果。如果连这种场景都跑不对说明模型框架有系统性错误不要继续增加复杂度。我个人在实际项目里最深的体会是配电网故障重构瓶颈多半不在算法而在模型细节。IEEE33 节点系统跑通并不是终点把它扩展成实际馈线组、接入多个 SOP 和分布式电源时建模质量直接决定仿真结果能不能被调度人员信任。如果你也在做类似课题建议先把基础场景吃透再加复杂度这样后续调试会有底很多。
返回列表