资讯动态

基于Matlab的最优孤岛划分与配电网可靠性评估方法

发布时间:2026/9/8 5:58:20 来源:尧图企业网站定制
做配电网规划或可靠性评估的同行应该都有感受分布式电源DG大规模接入后“故障后只能等抢修”的传统被动模式正在被打破。关键就出在孤岛效应——当上游变电站失电时只要局部电网里还有具备独立供电能力的DG就有机会把一部分负荷解列出来形成一个不受主网故障影响的微型孤岛。但孤岛里的电源容量有限到底该带哪些负荷、合哪些联络开关、切掉哪些负荷才能把少送电量压到最低这就是“最优孤岛划分”干的事。把这件事和配电网可靠性评估绑在一起用Matlab做出一套能复现、能改参数的代码正是我今天想重点拆解的内容。这篇文章适合电力系统方向的研究生、做配网规划和调度运行的工程师以及想在Matlab里上手混合整数规划的读者。我会从“为什么要做最优孤岛划分”讲起把可靠性指标的计算公式讲透再给出一套基于Matlab的实现框架和核心代码最后聊聊我在实际调试中踩过的坑。整个思路不绕弯子尽量让读完的人能直接对着拓扑改数据跑出自己的评估结果。1. 最优孤岛划分与可靠性评估为什么这两件事必须放到一起做1.1 含分布式电源配电网的可靠性问题游戏规则变了传统配电网是放射状无源网络潮流方向单一从变电站向负荷端单向流动。故障发生时继电保护动作切除故障段非故障区域如果有联络开关可以通过转供恢复到主网供电如果转供路径不存在就只能停电等修复。这种情况下可靠性评估的逻辑很清晰故障定位、隔离、恢复供电核心变量是故障率、修复时间、开关操作时间。接入DG之后这个逻辑被打破。故障隔离后部分区域虽然与主网失去联系但DG可以继续带负荷运行形成一个“有源孤岛”。只要孤岛内的发电容量和网络拓扑支持这部分负荷就不用停电。这样一来可靠性评估模型就必须考虑孤岛形成的可能性以及孤岛内如何选择恢复负荷的问题。否则算出来的停电次数、停电时间都会偏大直接影响电网投资决策。所以在可靠性评估中加入“最优孤岛划分”不是锦上添花而是必要环节。故障后的恢复策略从“要不要转供”变成了“怎么转供 怎么形成孤岛 孤岛内带哪些负荷”这比传统评估复杂了一个量级。1.2 孤岛划分的“最优”到底体现在哪很多人觉得孤岛划分不就是“把DG附近的负荷带上”吗实际上问题没那么简单。孤岛内的DG容量有限必须从网络拓扑、负荷重要程度、DG容量、线路传输能力等多个维度综合考虑才能确定最优的负荷恢复方案。把这个过程写成一个优化问题目标函数通常是最大化孤岛内恢复的负荷电量。如果考虑负荷权重也可以是最大化加权恢复负荷比如一二级重要负荷的权重更高。约束条件至少包含这么几项功率平衡约束孤岛内所有被恢复负荷的有功功率之和不能超过孤岛内DG的有功出力总量网络连通性约束被选入孤岛的节点必须通过闭合支路连接到至少一个DG节点不能在拓扑上变成“电气孤岛”线路容量约束每段参与供电的支路其流过的功率不能超过线路最大载流量电压约束孤岛内节点电压保持在一定范围但由于严格电压约束会引入非线性工程上常用直流潮流近似或直接忽略电压幅值变化只保留有功平衡。最优孤岛划分的“最优”就在于它能在故障场景中自动搜索出满足上述约束的最佳负荷恢复方案。人工经验判断在小规模网络里或许可行一旦网络规模变大、联络开关数量增多就必须靠优化算法来求解。这也是为什么Matlab里的intlinprog这类工具会派上用场。2. 可靠性指标体系与数学模型先把手上的公式理清楚2.1 四个常用可靠性指标怎么定义怎么从仿真里算做配电网可靠性评估一定要先把指标定义清楚。常用的四个指标看起来简单但在仿真代码里怎么正确累加很容易出错。SAIFI系统平均停电频率指标单位时间通常是一年内每个用户平均停电的次数。公式是SAIFI 用户总停电次数 / 用户总数在Matlab里就要在每次故障中统计“有多少个用户因本次故障停电”把这个数累加最后除以系统总用户数。SAIDI系统平均停电持续时间指标单位时间内每个用户平均停电的小时数。公式是SAIDI 用户总停电持续时间 / 用户总数计算时每次故障中未恢复供电的用户其停电时间按照故障修复时间计入能够通过转供或孤岛恢复的用户对应的停电时间只计入开关操作或DG启动的时间。CAIDI用户平均停电持续时间指标用户每次停电平均持续多久。公式是CAIDI 用户总停电持续时间 / 用户总停电次数可以理解为SAIDI除以SAIFI代表故障处理的平均速度。ENS系统总未供电电量单位时间一年内系统因为没有供电而损失的电量。常用单位是kWh/年。公式是ENS Σ每次故障的未供电负荷功率 × 停电持续时间它是经济评估里的核心指标能直接折算损失金额项目里我一般最关注它。2.2 故障枚举与可靠性评估的框架可靠性评估工程上一般分两大类枚举法和蒙特卡洛模拟法。枚举法适合规模不大、故障模式较少的场景好处是结果确定、可复现、计算快。蒙特卡洛模拟法适合考虑时序变化、随机故障和DG出力波动的场景但计算量大且每次运行结果有波动。本文采用的框架是“解析式故障枚举 最优孤岛划分”枚举网络中的N-1支路故障每条支路都有故障率λ和修复时间r模拟故障发生后保护动作隔离故障支路对隔离后的网络运行最优孤岛划分算法确定哪些负荷可以由DG继续供电统计本次故障中停电的用户数、停电持续时间、未供电电量把结果累加到全系统的可靠性指标中。整个过程可以写成伪代码SAIFI累计 0; SAIDI累计 0; ENS累计 0; for each 支路k in 所有支路 生成故障场景; 隔离故障支路; 执行最优孤岛划分; 得到孤岛恢复节点集合; 未恢复节点集合 全部负荷节点 - 恢复节点; 停电用户数累计 sum(未恢复节点的用户数); 停电电量累计 sum(未恢复节点的负荷功率 * 修复时间); 停电时间累计 sum(未恢复节点的用户数 * 修复时间); end SAIFI SAIFI累计 / 系统总用户数; SAIDI SAIDI累计 / 系统总用户数; ENS ENS累计;这个框架的好处是逻辑清晰每一部分都能单独调试也是我建议你入门时采用的结构。后续想加时序模拟再在循环里嵌套随机抽样就行。3. Matlab代码实现从拓扑输入到指标输出的完整拆解3.1 配电网数据组织和拓扑建模Matlab代码实现的第一步是解决“网络怎么存”的问题。我习惯把配电网数据分成三个矩阵支路数据支路编号、首端节点、末端节点、电阻、电抗、线路容量、故障率、修复时间负荷数据节点编号、有功功率、无功功率、用户数、负荷权重DG数据接入节点、有功容量、类型光伏/风电/柴油等。以IEEE 33节点系统为例支路数据的表头大致如下支路编号首节点末节点电阻(Ω)电抗(Ω)容量(kVA)故障率(次/年)修复时间(h)1120.09220.047050000.11542230.49300.251120000.0614........................在Matlab里可以直接用矩阵存储或者从Excel读入。为了后续调用方便我会把支路数据转成table类型列名固定这样代码可读性高很多。拓扑方面Matlab自带的graph函数非常好用。只需要从支路数据中提取首末节点就能构建一张无向图G graph(branchData.FromNode, branchData.ToNode);有了graph对象后面判断连通性、删除故障支路、查找可达节点都能直接调函数比自己维护邻接矩阵省事得多。3.2 故障场景生成与隔离操作故障枚举的核心是“每条支路都故障一次”。在Matlab循环里每次都从原始网络中复制一份拓扑然后用rmedge删掉当前故障支路模拟保护动作后的隔离效果for k 1:height(branchData) G_fault G; G_fault rmedge(G_fault, branchData.FromNode(k), branchData.ToNode(k)); % 判断哪些节点与主网失去联系 % 然后执行孤岛划分 end如果网络里有分段开关、联络开关还需要额外处理开关状态。简化处理时可以直接把故障支路当作“断开”联络开关仍然保持断开状态直到孤岛划分算法决定是否闭合它。更精细的做法是把联络开关也设为优化变量但模型复杂度会显著增加初学者可以从固定联络开关状态开始。3.3 最优孤岛划分的MILP实现这是整个项目最核心的部分。我用的是Matlab自带的混合整数线性规划求解器intlinprog它能求解0-1整数规划问题很适合孤岛划分这个场景。首先定义决策变量x_i表示节点i是否被选入孤岛供电范围1表示选入0表示不选。目标函数是最大化恢复负荷的加权和f -weight .* loadPower;因为intlinprog求解的是最小值问题所以对最大化目标取负号。功率平衡约束是最基础的约束sum(loadPower .* x) totalDGCapacity;这里totalDGCapacity是孤岛内所有DG的总容量。如果网络里只有一个DG那总容量就是该DG的额定出力如果有多个DG要把它们都包含在孤岛内。拓扑连通性约束稍微复杂一点。为了保证“入选孤岛的节点必须通过闭合支路连接到DG节点”我引入了一个虚拟网络流模型把DG节点设为源点向每个被选中的负荷节点输送单位流量。如果某个节点被选中那么它必须有至少一条路径连接到源点。这个约束可以通过辅助变量f_ij流经支路ij的虚拟流量实现% 对每个节点流入量 - 流出量 x_i 0DG节点除外实际写起来需要按节点构造稀疏矩阵。完整代码比较长这里给一段核心示意% 节点数 N % 支路集合 edges % DG节点集合 dgNodes % 决策变量x (N×1) f (E×1) Nvar N E; lb zeros(Nvar,1); ub ones(Nvar,1); intcon 1:N; % x为整数0-1f可以放松为连续变量 % 目标最大化加权恢复负荷 f_obj [-weight .* loadPower; zeros(E,1)]; % 节点流平衡约束 Aeq * [x; f] beq % 对负荷节点流出之和 - 流入之和 x 0 % 对DG节点流出之和 - 流入之和 -1作为源 % 对非孤岛节点不做要求但x0时会自动满足 % 简化写法示意 for i 1:N outEdges find(edges(:,1) i); inEdges find(edges(:,2) i); row zeros(1, Nvar); row(N [outEdges; inEdges]) [ones(length(outEdges),1); -ones(length(inEdges),1)]; row(i) 1; Aeq(i,:) row; end beq zeros(N,1); beq(dgNodes) 1; % DG节点出流比入流多1这个模型是网络流形式的连通性约束虽然需要一些辅助变量但线性化效果很好求解速度也能接受。intlinprog的调用方式如下options optimoptions(intlinprog,Display,off); [x_opt, ~] intlinprog(f_obj, intcon, A, b, Aeq, beq, lb, ub, options);求解结束后x_opt(1:N)就是节点级恢复方案值为1的节点表示在孤岛内被恢复供电。这里要特别提醒如果系统里有多个DG并且它们之间通过联络开关相连上述网络流模型需要扩展成“多源”模型也就是每个DG节点对应的beq不再强制为1而是作为可选源。否则算法会强制所有DG都向孤岛供电可能在部分场景下过度保守。3.4 可靠性指标累计循环孤岛划分函数写好后下一步就是把它嵌入可靠性评估的主循环。主循环的伪代码和之前类似但关键点是要把每个故障场景下“哪些节点停电”记录下来。在每次故障中先检查哪些节点与主网失去联系。主网节点定义为变电站节点根节点。如果失电节点集合非空就调用孤岛划分函数得到x_opt然后restoredNodes find(x_opt(1:N) 0.5); outageNodes lostNodes; % 与主网失去联系的节点 outageNodes(ismember(outageNodes, restoredNodes)) []; % 移除被孤岛恢复的节点 % 更新指标累加 SAIFI累计 SAIFI累计 sum(userNum(outageNodes)); SAIDI累计 SAIDI累计 sum(userNum(outageNodes) * repairTime(k)); ENS累计 ENS累计 sum(loadPower(outageNodes) * repairTime(k));这里我简化为所有未恢复节点都等着故障支路修好停电时间是修复时间repairTime(k)。实际工程中如果配网有自动化开关部分节点可能通过开关操作转供停电时间就不是修复时间而只是操作时间。这种细节需要在代码里根据转供路径判断但不影响总体框架。3.5 一个快速验证用的算例代码结构整个项目的文件组织方式我建议分成四个脚本load_data.m读取支路、负荷、DG数据build_graph.m构建网络拓扑图optimal_island.m输入故障后的拓扑和DG/负荷数据输出孤岛恢复方案reliability_assess.m主循环枚举故障调用optimal_island累计并输出指标。这种模块化结构的好处是以后想换别的孤岛划分算法只需要重写optimal_island.m其他部分不用动。我早期把全部代码写在一个脚本里后来要对比多种方案时改起来特别痛苦。4. 算例分析IEEE 33节点系统跑出来的结果怎么解读4.1 算例设置和参数我用来验证的算例是经典的IEEE 33节点配电网基准电压12.66kV总负荷大约3715kW系统总用户数按节点负荷占比分配比如每100kW负荷对应50户这样方便折算用户相关指标。DG接入方案设置为节点8接入一台500kW分布式光伏节点18接入一台300kW柴油发电机节点25接入一台400kW风电。三条DG总容量1200kW约占系统总负荷的32%。故障率取每公里0.065次/年线路长度从文献典型值中取近似修复时间统一取4小时。这个设置并不算复杂但足以让孤岛划分发挥作用。4.2 有无孤岛划分的可靠性指标对比我跑完整个枚举后得到三组结果场景SAIFI(次/户·年)SAIDI(小时/户·年)CAIDI(小时/次)ENS(MWh/年)无DG1.6126.4484.00023.96有DG不优化孤岛1.5476.1884.00022.77有DG最优孤岛划分1.4335.7324.00019.84可以看到接入DG后可靠性指标有一定改善但如果不做孤岛优化DG只能对所在支路故障形成一点有限的支撑效果不够明显。加入最优孤岛划分后SAIFI下降了约11%ENS下降了约17%效果非常可观。之所以有这么明显的提升是因为最优孤岛划分能在大量支路故障下通过合理选择DG供电范围把原本必须停电的负荷救回来。比如馈线中段故障时聚类在DG附近的负荷都能进入孤岛而优化算法会自动选择那些负荷大、权重高的节点优先恢复。4.3 影响孤岛效果的关键因素从多次算例对比中我总结出三个对孤岛效果影响最大的因素DG容量与负荷的匹配程度。DG总容量越大可恢复负荷比例越高但边际效用递减。在算例里DG容量从1200kW提高到1800kW时ENS下降幅度从17%降到12%左右说明容量上去了但如果接线方式不配合效果也会打折。DG接入位置。DG越靠近负荷中心孤岛划分能恢复的负荷越多。把DG放在馈线中段和末端的效果差异很大放在末端时由于拓扑瓶颈孤岛覆盖范围受限。负荷权重和重要程度。当目标函数考虑负荷权重后优化算法会优先恢复重要负荷。这样做在可靠性指标上可能看不出太大变化但经济性指标和用户满意度改善明显。另外联络开关的位置也是一个重要变量。如果孤岛划分允许闭合联络开关把两个DG接入同一个区域可恢复的负荷范围会变大。这也是后续做配网重构时最值得扩展的点。5. 调试与避坑我在Matlab实现中踩过的几个坑5.1 孤岛划分的连通性约束写不好结果总是不连通这是我最开始最容易犯的错。只加功率平衡约束intlinprog会贪心地选择那些负荷大但拓扑上不连通的节点导致求解出的“孤岛”实际上是一个断成几片的集合。后来我换成网络流模型从DG节点向候选节点注入单位虚拟流量并强制所有被选中的节点必须从DG节点收到单位流量问题才解决。连通性约束本质上是在约束“x1的节点必须与DG节点在同一个连通子图里”。网络流模型虽然引入了一些辅助变量但线性约束数量可控求解速度也不慢是目前实践里比较稳妥的做法。5.2 直流潮流近似到底要不要用孤岛划分的约束里线路容量约束和电压约束如果都上精确潮流模型会变成非线性规划Matlab处理起来很吃力。我的做法是先用直流潮流近似把线路功率看成DG出力在网路上的分配忽略无功和电压幅值只保留有功平衡和线路有功潮流约束。这样问题能保持线性intlinprog可以直接解。如果一定要考虑电压我建议分两步先用MILP解出孤岛范围再用Matpower或其他潮流工具校验孤岛内节点电压是否越限。不满足再对相应节点加限制重新求解。这种方式比一次性建立复杂约束要灵活得多。5.3 故障枚举太多跑不动怎么办IEEE 33节点系统支路只有32条枚举起来毫无压力。但如果你想扩展到大几十节点甚至上百节点再考虑到N-2故障计算量会爆炸。这个时候我建议先做故障筛选只枚举那些故障后会导致失电的支路避免把对可靠性无影响的支路也放进循环里。其次可以用parfor把故障场景循环并行化多核处理器下速度提升非常明显。如果要做真正的随机时序模拟那枚举法就不合适了得改成蒙特卡洛抽样。但抽样会造成指标结果带有一定随机性需要设置随机种子并保证采样次数足够多否则每次跑出来的指标都不稳定。5.4 intlinprog的数值陷阱intlinprog对于纯0-1规划通常表现不错但有两类场景容易出问题一是变量规模很大时分支定界可能耗时越来越长二是约束矩阵如果存在数值病态可能出现明明有可行解却求不到的情况。我的经验是把支路最大功率等参数归一到1.0附近能有效改善数值稳定性。同时设置合理的整数容差比如IntegerTolerance1e-4不要让求解器过分严格要求整数否则会增加大量计算时间。如果遇到求解时间过长我也不建议盲目加大容差而是先检查约束矩阵是否存在冗余。很多情况下把重复的约束删掉求解速度会快很多。5.5 指标累加时的用户数口径问题这是可靠性指标里最容易“算错”的地方。SAIFI和SAIDI的分母都是系统总用户数而不是故障影响用户数。如果你在循环里每次故障都把停电用户数累加最后却除以故障次数那指标就偏了。正确做法是所有的用户相关指标最后都除以同一个系统总用户数。而ENS不需要除以任何数它就是年损失电量的绝对值。我在初版代码里就犯过这个错SAIFI算出来比正常值大了一个数量级排查半天才发现是分母用错了。6. 后续扩展方向6.1 从单故障孤岛到多故障级联场景本文的框架只考虑了单重故障也就是N-1校验。实际运行中极端天气下可能出现多重故障同时发生比如台风导致多条馈线同时跳闸。这时候孤岛划分需要处理更复杂的拓扑甚至要把多个DG和多条故障支路放在一个模型里统一优化。网络流约束仍然适用但故障场景组合会成倍增加需要配合场景缩减技术。6.2 考虑DG出力随机性和储能协调光伏、风电的出力具有随机性和间歇性孤岛划分如果只按额定容量计算有可能在运行中因为出力不足导致二次停电。更进一步的做法是把DG出力的预测曲线或概率分布嵌入模型比如把确定性约束改成机会约束或者用随机优化处理。储能接入后孤岛划分的时间尺度也从“瞬间切负荷”变成了“小时级能量管理”这时候问题会变成一个更复杂的动态优化模型。6.3 与网架规划结合可靠性评估的最终目的是指导规划。你可以把本文的可靠性计算函数封装成一个黑盒嵌入到网架规划或DG选址定容的迭代优化中。比如在外层用遗传算法生成一组DG接入方案内层调用可靠性评估函数计算ENS从而求出综合成本最优的规划方案。这种两层嵌套的计算模式虽然耗时但在我做过的项目里效果很不错。最后再多说一句个人体会我第一次跑通这个项目时最大的意外是孤岛划分的计算量并没有想象中那么大真正花时间的是把配电网的拓扑约束转换成优化变量。只要节点支路数据组织合理、联通性约束写对Matlab的graph和intlinprog组合起来很快就能搭出一版可用的评估工具。如果你也打算做配电网可靠性方向建议先从这个“不复杂但完整”的框架入手跑通后再逐步加入时序、随机性、储能等复杂元素。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价