配电网可靠性评估与孤岛划分:基于Matlab的DG接入优化方法
2026/9/14 20:17:51 网站建设 项目流程

1. 项目背景:孤岛划分与配电网可靠性评估怎么走到一起的

做配电网可靠性评估的人,基本都绕不开一个问题:馈线一旦发生故障,下游非故障区段是不是只能等着停电?以前确实只能等,但现在分布式电源接入量越来越大,情况已经变了。孤岛运行这个想法被提出来,就是希望故障后DG能继续带起一部分负荷,不让整条馈线全黑。于是最优孤岛划分就从单纯的优化问题,变成了可靠性评估模型里一个必须处理的环节:系统在故障后应该怎么快速切出一组开关,把负荷和DG重新组成一个能自平衡的孤岛。

这个项目解决的是三件事:第一,把含分布式电源的配电网可靠性评估流程写清楚;第二,把“最优孤岛划分”作为故障后的一个决策环节,真正放进评估流程里;第三,用Matlab把整条链路串起来,能从网络拓扑、负荷和DG参数开始,直接输出SAIFI、SAIDI、ENS这些可靠性指标。适合正在做配电网规划、DG接入分析或者可靠性评估相关研究的人参考,也适合刚入门想理解“孤岛+可靠性”到底怎么联动的人。

整体思路其实并不复杂:这是一个两层结构。外层扫描所有可能发生的故障事件,内层针对每一次故障,求解“哪些负荷应该被孤岛带起来”的优化问题,然后根据孤岛结果计算每个负荷点的停电时间,最后汇总成系统级可靠性指标。把孤岛决策单独拆出来做,最大的好处是后续换算法很方便。今天用DFS加功率校验,明天想换遗传算法、粒子群或者混合整数规划,都不需要动可靠性评估的主流程。

方案选型上我依然用Matlab,核心原因是这个场景很依赖矩阵运算、图遍历和优化工具箱。可靠性评估本质上是一次次的故障扫描,每次扫描都要做拓扑搜索,Matlab的graph对象配合矩阵索引写起来很顺手。再加上Matlab做结果可视化几乎零成本,bar图、拓扑图都能直接在脚本里出,不需要额外联调制图库。网上现在也能搜到一些商业配电网仿真平台做整体验证,但可靠性评估这种大量重复故障扫描的场景,我建议还是先用Matlab把算法逻辑跑通,再考虑迁移到更重的仿真环境。

2. 可靠性评估指标体系与数学模型

2.1 负荷点停电时间怎么算

传统的配电网可靠性评估,最常用的基础量是“负荷点的年停电时间”。对一个负荷点i来说,它可能被多个上游故障影响。每个故障k都会带来一个停电时间 r_ik,而这个故障本身的年发生概率用故障率 λ_k 表示。

如果有故障率 λ 和停电时间 r,那么负荷点i的年停电小时数可以写为:

U_i = Σ λ_k × r_ik

这个式子看着简单,但真正的难点在于r_ik该怎么取。同一个故障,对不同位置负荷点的影响不同。按传统FMEA的思路,通常分成几类:

  • 故障发生在负荷点上游的主线上,且没有隔离开关或联络开关能切除,那这个负荷点只能等故障修复,r = 修复时间。
  • 故障发生后,通过分段开关把故障区段隔离,再把非故障区段从备用电源恢复供电,那这个负荷点的停电时间只是开关操作时间。
  • 故障发生在负荷点自身所在的支路上,那负荷点通常也只等修复时间。

如果加入DG和孤岛运行,情况还要再复杂一层。下游非故障区段如果能成功形成孤岛,那负荷点可能根本不会中断,或者在短时切换后恢复。这时r_ik就不是单一的修复时间或开关时间,而是要看孤岛能不能成立、DG出力够不够。

2.2 系统级可靠性指标

负荷点指标汇总之后,才能得到系统级指标。做配电网可靠性评估,基本上绕不开下面这几个:

指标含义计算公式
SAIFI系统平均停电频率Σ N_i × λ_i / Σ N_i
SAIDI系统平均停电持续时间Σ N_i × U_i / Σ N_i
CAIDI用户平均停电持续时间SAIDI / SAIFI
ENS年供电缺额电量Σ L_i × U_i
AENS平均供电缺额电量ENS / Σ N_i

这里N_i是负荷点的用户数,L_i是负荷点的平均负荷。实际项目中,用户数往往比负荷功率更容易获得,因为配电网台账里经常用“户数”统计。如果没有用户数,可以用每个节点的负荷有功功率替代,或者按典型用户数折算。

SAIFI和SAIDI是必须输出的基础指标,ENS在算经济成本时很关键。做DG接入影响分析时我一般会格外关注ENS,因为孤岛能不能带起负荷,直接体现在供电缺额的降低上。

2.3 含DG的故障影响修正思路

如果配电网里接入了DG,还是直接套用传统FMEA,结果会偏保守,因为系统根本没有考虑孤岛恢复能力。修正的思路是:在每一次故障影响分析之后,额外加一个“孤岛决策”子模块。

具体做法可以这样理解。某条馈线发生故障后,先根据开关位置确定“受影响区域”,尤其是故障点下游、可以通过开关隔离出来的非故障区域。这个区域里的DG能不能形成一个孤岛,取决于区域内的负荷总量和DG可用出力,还取决于孤岛内部是不是连通的、有没有违反电压或线路容量约束。

如果孤岛成立,那些原本会因为故障而停电的负荷点,停电时间就从修复时间降为零,或只保留一个短时切换时间。如果不成立,就只能按传统方式,等待上游修复或手动合联络开关恢复。

所以,分布式电源对可靠性的提升并不是自动发生的。DG接入容量越大、分布越合理,孤岛成立的概率和带负荷能力自然越强;但要是DG全部接在主馈线出口附近,故障点下游根本够不到DG,那孤岛策略对下游可靠性几乎没有任何贡献。这个细节在做“DG优化配置”研究时尤其重要。

3. 最优孤岛划分的建模与Matlab求解

3.1 孤岛划分问题定义

孤岛划分的输入是某个故障之后,配电网里剩余的带电拓扑。输出是一组开关操作方案,决定哪些节点进入孤岛,哪些节点被切除。

它的核心矛盾在于:DG容量是有限的,孤岛不可能无限地带上所有负荷。当DG总出力小于下游总负荷时,就必须选择切掉一部分负荷。这时“最优”的含义就出来了:不是简单地说“能带多少带多少”,而是要在满足功率平衡、辐射状拓扑、连通性等约束的前提下,最大化恢复的负荷价值。

在实际工程里,负荷不都是同等重要的。医院、重要用户、通信基站和普通居民负荷的优先级完全不一样。所以目标函数往往是带权重的:

max Σ w_i × P_load_i × x_i

其中x_i表示第i个节点是否进入孤岛,w_i是负荷权重,P_load_i是该节点负荷。把功率作为权重之一,也方便硬件上做切负荷控制。

约束条件至少包含三类:

  • 功率平衡约束:孤岛内DG总出力要大于等于孤岛内负荷总需求。实际工程还要考虑DG出力的波动性,通常乘一个安全系数,或者用典型场景下的期望出力。
  • 拓扑约束:孤岛内节点必须连通,而且不能成环。配电网本来就是辐射状,孤岛也不能出现闭环运行,否则保护配置、中性点接地方式都要出问题。
  • 运行约束:线路潮流、节点电压不能越限。很多简化研究先不考虑潮流,只做功率平衡校验;但如果DG渗透率很高,电压越限就必须建模进去。

3.2 目标函数与约束条件

把孤岛划分写成数学优化问题时,需要先定义变量。最常见的是定义节点二元变量 x_i 和支路二元变量 y_ij。

  • 节点变量 x_i = 1 表示节点i被孤岛带起来。
  • 支路变量 y_ij = 1 表示支路ij在孤岛内。

功率平衡约束可以写为:

Σ P_DG_i × x_i ≥ Σ P_load_i × x_i

这里的P_DG_i是节点i处分布式电源在故障场景下的可用出力。如果DG类型是光伏,还要考虑白天和晚上出力差异很大,不能简单用额定容量去套。

连通性约束是这类问题里最麻烦的一阶约束。直接要求“所有x_i=1的节点必须通过y_ij=1的支路连成一个整体”,是一个典型的图连通约束,标准MILP表达比较繁琐,需要引入辅助流量变量。

如果系统规模不大,比如IEEE 33节点或者实际馈线的几十个节点,直接用枚举加深度优先搜索反而更快。我的做法是:先锁定故障下游可能进入孤岛的候选节点集合,再用DFS枚举所有满足连通性的候选孤岛方案,然后逐一校验功率平衡约束,最后取目标函数最大的一组作为最优孤岛。

3.3 基于DFS枚举与功率校验的求解实现

有人会问:这样“枚举”是不是不严谨?其实不是。孤岛划分的决策变量本质上是开关状态组合,而一条馈线上可操作的开关数量有限。当候选孤岛节点数不超过20个时,DFS枚举所有连通子集完全是秒级以内的事。比直接写复杂的MILP连通性约束更容易理解、调试和扩展。

Matlab里面处理图拓扑可以用自带的graph对象,也可以用邻接矩阵。下面是我常用的一个DFS搜索核心骨架:

function [member, bestLoad] = dfs_island(adjMat, startNode, P_load, P_dg, loadWeight, dgCapacity) n = size(adjMat, 1); visited = false(n, 1); stack = startNode; bestLoad = 0; member = []; % 以startNode为孤岛起点,遍历所有能通过闭合开关连通的组合 dfsRecursive(startNode, visited, [], 0); function dfsRecursive(node, vis, loadNodeList, loadSum) vis(node) = true; newList = [loadNodeList, node]; dgSum = sum(P_dg(newList)); loadSumNew = sum(P_load(newList)); % 检查功率平衡约束,DG出力要能带上负荷 if dgSum >= loadSumNew && loadSumNew > bestLoad bestLoad = loadSumNew; member = newList; end for k = 1:n if adjMat(node, k) > 0 && ~vis(k) dfsRecursive(k, vis, newList, loadSumNew); end end end end

这段代码核心就是经典的DFS回溯搜索。每走到一个新节点,就判断当前集合是否满足DG出力大于负荷,如果满足,就把当前带负荷量作为候选解记录下来。最终输出的member就是孤岛包含的节点集合,bestLoad是能恢复的最大负荷。

实际用的时候有几个细节要注意。一是孤岛起点不能随便选,最好是DG接入点或离DG最近的联络开关;二是要设置搜索深度限制,防止一个连通区域包含太多节点导致组合爆炸;三是功率平衡必须留裕量,不能按额定出力满打满算,否则真实运行中光伏出力一降,孤岛瞬间就会崩溃。

4. 可靠性评估主循环的代码实现

4.1 算例网络与参数初始化

把孤岛划分模块写好后,就可以搭可靠性评估主循环了。这里我以IEEE 33节点配电网作为测试网络,因为它规模适中、参数公开,是配电网研究里的“通用语言”。

初始化部分主要做三件事:定义网络拓扑、定义负荷与用户数、定义DG接入位置和容量。下面是一个简化的初始化片段:

% 支路数据:start, end, 长度(km), 故障率(次/km年), 修复时间(h) branch = [ 1 2 0.5 0.10 4.0; 2 3 0.5 0.10 4.0; 3 4 0.4 0.08 3.5; % ... 其余支路 ]; % 负荷数据:节点编号, 有功负荷(kW), 用户数 loadData = [ 2 100 60; 3 90 50; 4 120 70; % ... ]; % DG数据:节点编号, 额定容量(kW), 故障时可用率, 出力系数 dgData = [ 6 300 0.95 0.8; 18 200 0.95 0.9; % ... ]; n_branch = size(branch, 1); n_node = max(max(branch(:,1:2)));

这里的“故障时可用率”和“出力系数”是我做随机性简化时的常用做法。故障时可用率代表DG设备自身不故障的概率,出力系数代表故障场景下实际出力与额定容量的比值。更精细的模型可以把日照曲线、风速曲线都考虑进来,先用这个简化模型把主流程跑通是没有问题的。

4.2 故障扫描、孤岛决策与停电时间统计

可靠性评估主循环的思路是:依次假设每条线路发生故障,然后对每个受影响的负荷点判断停电时间。伪代码流程如下:

SAIFI_sum = 0; SAIDI_sum = 0; ENS_sum = 0; N_total = sum(loadData(:,3)); for k = 1:n_branch lambda_k = branch(k,4) * branch(k,3); % 1. 根据故障支路确定受影响区段 [affectedNode, upstreamNode] = findAffectedZones(k, branch, n_node); % 2. 对受影响区段,尝试最优孤岛划分 [islandNodes, ~] = dfs_island(adjMat, dgStartNode, P_load, P_dg, ... loadWeight, dgCapacity); % 3. 对每个负荷点统计停电时间和停电频率 for i = affectedNode if ismember(i, islandNodes) r_ik = 0; % 孤岛成功,不停电 elseif isUpstreamRestorable(i, k, branch) r_ik = switchTime; % 非故障区段可通过开关转供 else r_ik = repairTime; % 故障区段或无法转供 end Ui(i) = Ui(i) + lambda_k * r_ik; Lambda(i) = Lambda(i) + lambda_k; end end

这段逻辑里值得强调的是:不是所有下游负荷都能进孤岛。进孤岛的节点必须与DG节点在同一连通区域内,而且孤岛内部功率要平衡。所以我在主循环里先调用findAffectedZones选出候选区域,再调用dfs_island决策实际孤岛范围,顺序不能反。

另外还需要处理一个容易忽略的情况:当上游故障被隔离后,部分下游非故障区段除了可以进孤岛,还有可能通过联络开关从另一条馈线转供。这种“多电源恢复”的并存路径在可靠性评估里必须单独判断。实际代码里我会用一个专门的函数判断每个负荷点是否存在可用的备用电源路径,如果存在,即使孤岛不成功,也能通过转供快速恢复。

4.3 指标汇总与可视化输出

主循环跑完后,把指标累计值除以总用户数,就得到系统级可靠性指标。最基本的输出代码:

% Lambda_all 和 U_all 分别是各负荷点的年停电频率和年停电时间 SAIFI = sum(loadData(:,3) .* Lambda_all) / N_total; SAIDI = sum(loadData(:,3) .* U_all) / N_total; CAIDI = SAIDI / SAIFI; ENS = sum(P_load .* U_all); % P_load 单位是kW,ENS单位是kWh

结果可视化我通常做两张图:一张是各负荷点年停电时间柱状图,便于看DG接入后哪些节点受益最大;另一张是SAIDI随DG容量变化的曲线,用来做敏感性分析。Matlab自带的bar和plot输出流程基本就是两行代码的事情,这里不展开。

5. 算例分析与对比结果

5.1 IEEE 33节点测试系统参数设置

为了说明最优孤岛划分的作用,我设计了三组对比场景:

  • 场景A:不含DG,传统可靠性评估。
  • 场景B:接入DG,但故障后不执行孤岛策略,即DG保护立即退出,DG不参与恢复。
  • 场景C:接入DG,并执行最优孤岛划分策略。

DG参数设定为:节点6接一台300kW的分布式电源,节点18接一台200kW的分布式电源,故障时可用出力按额定值的80%计算,负荷权重全部取1。这样设置的好处是能直接把问题聚焦在“孤岛策略”本身,而不是被负荷优先级干扰。

实际上IEEE 33节点的总负荷大约是3715kW,两台DG合计500kW,算上0.8的出力系数只有400kW,远远不够带整个系统。所以最优孤岛必须做部分甩负荷,目标函数会自然把负荷相对集中、且靠近DG的节点纳入孤岛。

5.2 无孤岛、固定孤岛、最优孤岛的可靠性指标对比

在同样的故障率参数下,三组场景的可靠性指标会拉开明显差距。我整理了一个示意结果:

场景SAIFISAIDIENS
无DG2.316.4268530
有DG但不孤岛2.306.3867680
有DG且最优孤岛2.175.0649210

这个结果背后的逻辑很清晰。有DG但不孤岛时,DG只是作为一个普通电源并网,故障后它也跟着跳闸,对可靠性几乎没有帮助。一旦允许孤岛运行,等于在馈线故障时给下游区域增加了一条“局部电源”,那些原本要停电几个小时的负荷点,变成了短时切换甚至不停电,SAIDI和ENS自然下降明显。

需要注意的是,SAIFI的下降幅度通常小于SAIDI。因为孤岛只能改善停电持续时间,对于那些“先停电、后切到孤岛恢复”的负荷点来说,停电频率并不会减少。这在实际项目汇报中要提前说明,不然别人看到SAIFI变化不大,会误以为DG没用。

5.3 参数敏感性分析:DG容量和渗透率

我还会继续做一组DG容量从200kW到1000kW的敏感性分析。结果趋势很直观:DG总容量越大,最优孤岛能够覆盖的负荷越多,ENS下降得越明显。但当DG容量超过某个阈值后,再增加容量的边际收益会变低,因为受限于线路供电能力和负荷分布,孤岛能带的范围不可能无限扩大。

这个“边际递减”现象很有工程价值。它说明DG优化配置不能只看总容量,还要看DG在馈线上的空间分布。DG放在馈线末端和放在馈线出口,对孤岛恢复的作用完全不同。用可靠性评估作为目标函数去优化DG选址,比单纯追求DG渗透率要合理得多。

6. 实操经验与常见调试问题

6.1 孤岛划分代码里最容易翻车的几个点

孤岛划分看起来只是“DFS加功率校验”,实际跑通并保证结果合理,有不少坑。

第一个坑是孤岛搜索的起点选错。如果起点选在负荷点上,而周围没有DG,DFS搜到最后也不会出现可行孤岛。更合理的做法是先找出所有DG节点,把每个DG节点作为起点分别搜索,再把搜索到的孤岛合并或选择目标函数最大的候选方案。

第二个坑是连通性检查不严谨。有些代码只通过DFS找节点集合,却没有检查集合内部是不是通过闭合支路连成一片。尤其是节点集合里包含多个DG和多个负荷点时,如果DFS只沿一条路径往下走,可能会漏掉一些本该连接的节点,导致孤岛范围偏小。

第三个坑是功率平衡用了额定容量,而没有乘可靠出力系数。实际光伏在故障时可能刚好在阴天,风电可能刚好无风。用额定容量算出的孤岛,真实运行中大概率无法成立。最简单的处理方式是给每个DG设一个典型的“故障时可保证出力”,或者按多场景加权。

6.2 可靠性指标统计口径不一致

可靠性评估里,指标统计口径不一致是个高频问题。相同网络、相同算法,不同人写出来的SAIDI可能差出20%。

最常见的问题是“重复计算故障影响”。一条线路故障后,下游可能有多个负荷点,这些负荷点都应该计入该故障的影响;但如果代码里同时遍历了主线路和分支线路,又没有对节点去重,故障影响就会被叠加两次。

第二个常见问题是“修复时间与开关操作时间混用”。隔离开关能够隔离故障时,非故障区段的停电时间应该取开关操作时间,而不是修复时间。很多初版代码把所有受影响节点都按修复时间算,结果SAIDI明显偏高。

第三个问题是“用户数权重”没加。SAIFI和SAIDI分母都是总用户数,分子也是用户数加权平均,如果直接用节点数平均,结果会失真。尤其当部分节点是工业用户、部分节点是居民用户时,节点功率和用户数差别很大,不用权重会让评估结果跟调度员的实际感受对不上。

6.3 Matlab性能与数据结构优化

可靠性评估如果只做一次故障扫描,速度不是问题。但要做蒙特卡洛模拟或长时间序列分析时,Matlab的性能坑就很明显。

我优化性能时最常用三个办法:一是把节点和支路数据全部向量化,不要在主循环里频繁访问cell数组;二是提前建好邻接矩阵和受影响区段索引,避免每次故障重复构建拓扑;三是用稀疏矩阵存储大规模网络的邻接矩阵。

如果故障扫描次数很多,比如要做一万次采样,建议把内层孤岛搜索函数改成mex文件,或者用并行循环parfor。但这个优化要放到后期,前期先把逻辑调试正确,过早优化反而会拖慢开发速度。

6.4 后续扩展方向和个人体会

这个项目做到后面,自然会有几个扩展方向。一是把孤岛划分和时序模拟结合起来,考虑光照、负荷和故障发生在一年中的不同时刻,用蒙特卡洛方法得到更真实的可靠性结果。二是把潮流计算放进去,孤岛划分不再只看功率是否相等,还看电压和网损是否能满足要求。三是将负荷优先级、开关寿命、遥控系统成功率等因素都纳入目标函数,变成一个更贴近工程实际的多目标决策问题。

我个人在实际操作中的体会是:孤岛划分与可靠性评估结合的价值,不只是多算几个指标,而是能倒逼你重新思考分布式电源接入后的运行方式。很多时候,一个DG接入方案在正常运行时看起来没有任何问题,但一旦做故障遍历和孤岛分析,就会发现它位置不好、保护配合不对、下游负荷根本带不起来。用这套Matlab流程多跑几组案例,比单纯看潮流结果能发现更多隐蔽问题。

最后再分享一个小技巧:做孤岛划分时,不要急着写复杂的优化算法。先把DFS枚举版本跑通,用几个小算例人工验证孤岛范围是否合理。确认基本逻辑没问题后,再根据规模决定是继续用枚举,还是换MILP或智能算法。这个顺序能省下大量调试时间。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询