含分布式电源的配电网可靠性评估:孤岛划分与Matlab实现

发布时间:2026/9/16 4:30:22
含分布式电源的配电网可靠性评估:孤岛划分与Matlab实现 做配电网可靠性评估这几年我最大的体会是很多人一听到“含分布式电源”就把重心放到DG怎么建模、怎么算潮流上结果真正的难点——故障后孤岛怎么形成、哪些负荷能被DG救回来、指标怎么统计——反而被绕过去了。我在这篇内容里会把这些坑一个个讲清楚并且给出一个能直接落到Matlab代码里的完整评估思路。文章适合正在做配电网可靠性方向课题的研究生也适合刚接触可靠性评估、想快速上手的工程师。基于的案例是IEEE RBTS测试系统的常见改法数据和代码逻辑都是可复现的你照着往下走至少能少走我当年两个月的弯路。1. 问题本质DG接入后可靠性评估为什么变难了1.1 传统评估的几个关键假设被打破了先说说传统配电网可靠性评估在做什么。经典算法不管是解析法里的故障模式后果分析法FMEA还是模拟法里的蒙特卡洛都建立在同一个基本逻辑上配电网是放射状结构电源点在馈线首端潮流从系统向负荷单向流动。一旦某个元件故障保护动作跳闸、故障隔离、负荷转供或等待修复整条下游馈线都可能停电。评估要做的事情只有一件把所有可能的故障场景列出来或者抽样抽出来算出每个负荷点的停电频率和停电时间再聚合成系统指标。这个逻辑在纯辐射网络里非常好用因为故障影响范围是清晰可判定的故障点上游能通过重合闸或联络开关恢复故障点下游只能等故障修复。但分布式电源接入后网络的边界变了。DG不再是只管出力的“额外注入源”它在故障隔离后可能主动形成一个孤岛给一部分下游负荷继续供电。这一下就把“故障影响范围”变成了一个需要判断的问题——哪些负荷跟着DG走了取决于孤岛划分策略、DG出力水平和负荷需求之间的匹配关系。1.2 分布式电源带来的三个新变量第一个变量是DG出力不确定性。光伏看光照风电看风速这不是一个固定值。做可靠性评估时如果直接假定“故障期间DG一定能带起孤岛所有负荷”结果会明显偏乐观如果假定“完全带不起来”又忽略了DG的真实价值。所以必须把DG出力建模成多状态或者时序序列在评估框架里做概率化处理。第二个变量是孤岛形成能力。DG能否在故障隔离后顺利脱离主网形成供电孤岛涉及逆变器控制策略、同期并网、频率电压支撑等一系列动态问题。传统可靠性评估是静态或准稳态的不会去仿真这些毫秒级过程但它必须在模型里以“孤岛成功率”“孤岛启动时间”这种参数形式体现出来。很多论文直接就假设孤岛成功率为1这其实是比较理想化的。第三个变量是保护与开关动作策略。DG接入后故障电流方向不再单一原来的三段式电流保护和自动重合闸策略会受影响故障隔离区域可能和没有DG时不一样。做评估时网络拓扑中哪些地方有分段开关、联络开关故障发生后开关怎么动作直接决定了DG能救回哪些负荷。这些在代码里不是“配置项”而是评估逻辑的一部分。这三个变量叠加在一起可靠性评估就从“按拓扑查表”变成了“按场景做判定”。这也是为什么很多人拿师兄的传统评估代码改DG时改到一半就发现到处都在打补丁最后不得不推倒重写。2. 指标先行可靠性评估到底在算哪些数2.1 负荷点级指标和系统级指标的关系代码写之前先把指标口径定清楚。可靠性指标分为负荷点级和系统级两类前者是后者的基础。做研究时最常用的负荷点级指标是年平均停电频率λ次/年和年平均停电时间U小时/年。这两个数算出来后所有系统级指标都可以往上叠。常用的系统级指标有五个我整理成一张表方便你对照指标全称计算公式文字版关注点SAIFI系统平均停电频率指标用户总停电次数 / 用户总数频率维度SAIDI系统平均停电持续时间指标用户总停电时间 / 用户总数时间维度CAIDI用户平均停电持续时间指标SAIDI / SAIFI单次停电的恢复速度ASAI供电可用率指标用户实际用电小时数 / 用户需求总小时数可用性维度ENS系统电量不足指标所有负荷点停电期间损失电量之和能量维度SG的工程师会特别关注SAIDI和CAIDI因为直接关系供电服务考核做研究的同学经常用ENS来算DG接入前后的经济性收益。要注意的是SAIFI和SAIDI基于“用户数”ENS基于“平均负荷”所以负荷点数据里必须同时维护用户数和平均负荷两个字段少一个指标就算不齐。2.2 算DG场景时指标统计的特殊处理DG接入后指标统计有一个以前很少遇到的情况同一个负荷点在一次故障中可能出现“短时停电后通过DG恢复供电”的状态。比如故障发生了下游某个负荷本来要停5小时等检修但因为DG孤岛成功停了0.5小时就被DG带起来了。那么这次事件对这个负荷点来说算停电一次还是算停电一次但持续时间只有0.5小时我的处理原则是算停电一次停电时间按实际断电时长统计。也就是SAIFI里计数1次SAIDI里累加0.5小时。这时候你会发现如果DG能把所有受影响的负荷都成功带上SAIFI可能没降多少因为停电事件还是发生了但SAIDI和ENS会大幅下降。这非常直观地反映了DG的效益方向它改善的是停电时长而不是停电频率。拿这个结论去解释结果导师和外行都容易听懂。另外如果孤岛失败负荷在故障修复前一直断电那停电时间就是修复时间如果孤岛成功但DG容量不够只能带起部分负荷就要按“孤岛内负荷削减策略”对每个负荷点分别计算停电时间。我见过不少代码在这一步直接用“孤岛概率”给所有负荷统一打折这其实是不严谨的。后面第5章算例里我会具体演示这两种口径的差别。3. 方法选型解析法还是蒙特卡洛3.1 状态枚举法的实现逻辑解析法的核心是“枚举所有可能出错的元件组合逐个计算后果”。传统配电网里元件多但故障率小所以一般只枚举一阶故障单个元件故障最多考虑二阶故障。对每个元件故障做一次网络影响分析就能得到它影响到的负荷点集合和停电时间。所有元件遍历完指标自然累加出来了。代码层面逻辑非常清晰遍历每条支路假定它发生故障找到保护动作和开关隔离后形成的区域划分对每个负荷点判断停电类型转供恢复、孤岛恢复、等待修复累加停电频率和停电时间。这个方法的优点是快一次遍历就能出结果而且结果稳定不依赖随机数。缺点是随着DG数量增加多个DG同时参与孤岛的组合场景会指数膨胀。如果网里有4个DG你至少要考虑一个故障下4个DG可用/不可用的2的4次方种组合。这时候就得做状态合并或者抽样不能全枚举。3.2 蒙特卡洛模拟法的实现逻辑模拟法走的是另一条路按元件的故障率和修复率随机生成一整年或者几千小时的运行—停运序列跑完这个时间跨度后统计每个负荷点的停电事件和停电时间。状态持续时间抽样是它的核心% 元件状态持续时间抽样示例 % lambda 为故障率(次/年), mu 为修复率(次/小时) TTF -1 / lambda * log(rand); % Time To Failure单位年 TTR -1 / mu * log(rand); % Time To Repair单位小时这里用的都是指数分布假设也是可靠性工程里最通用的做法。模拟法的优势在于DG出力的时序波动、负荷跟着季节变的特性都可以直接建模进时间轴里不需要像解析法那样用概率折算。缺点是计算量大——为了获得统计稳定的指标动辄跑几万次抽样如果每个故障场景还要做网络搜索那Matlab跑起来会非常煎熬。3.3 我做取舍的经验如果目标是算一个中型配网的可靠性指标且DG数量不超过三五个优先用枚举法。代码简单、结果可复核、论文里好解释。等DG和微网的结构复杂到枚举组合爆炸或者你要研究DG出力时序变化对可靠性的长期影响再上序贯蒙特卡洛。从我实际教学和做项目的经验来看大多数同学卡住不是因为方法选错了而是用枚举法的思路写了半天却忘了DG孤岛是概率事件需要引入孤岛成功率或者用DG出力状态做折算。这块模型直接决定结果趋势比纠结用哪种方法重要得多。下一章代码实现就按枚举法为主线讲时序因素用状态概率折算进去这样计算量可控又不会失真。4. Matlab代码实现从数据到指标的完整框架4.1 核心数据结构设计我写这类评估代码第一步永远是定义数据接口。不要一上来就写计算主循环先想清楚网络数据长什么样。这里推荐一种“节点—支路—负荷—DG”分离的数据组织方式以Matlab矩阵为核心% 支路数据: [送端节点, 受端节点, 长度(km), 每公里故障率(次/年), 平均修复时间(h)] branch [ 1 2 0.6 0.10 4.0; 2 3 0.4 0.10 4.0; 3 4 0.5 0.10 4.0; 4 5 0.4 0.08 3.5; 5 6 0.3 0.08 3.5; 4 7 0.6 0.10 4.0; ]; % 负荷点数据: [所在节点, 用户数, 平均负荷(kW)] loads [ 3 56 135.5; 5 89 210.0; 6 41 98.6; 7 72 178.4; ]; % DG数据: [接入节点, 类型(1光伏/2风电/3储能), 额定功率(kW), 可用率] dg [ 6 1 300 0.85; % 光伏接入节点6 ];支路故障率注意单位换算。如果已知的是“每公里每年故障率”乘上长度得到这条支路的年故障次数。这个写法好在两个地方一是后续画拓扑、写判据都可以复用节点—支路关联关系二是加载数据时一眼能看出数据范围对不对不容易出现“铁定出错的脏数据带进计算”的情况。4.2 网络拓扑搜索与故障影响分析解析法的核心函数是“故障影响分析”。对于一条支路k故障首先要在网络里找到这样两类集合受故障影响的负荷集合这些负荷因为支路k停电而失去主网供电可通过DG恢复的负荷集合这些负荷处于故障隔离后的孤岛区域内且孤岛内有DG能够支撑。代码里最需要花时间写的是网络搜索。我通常先用拓扑矩阵节点邻接表做深度优先搜索DFS找出上游/下游关系。然后结合分段开关位置判断哪些负荷会在故障后处于什么样的供电状态。核心搜索逻辑如下function downstream findDownstream(branch, nodeMap, faultBranch) % 找到故障支路下游节点集合 % branch: 支路矩阵 % nodeMap: 节点编号到连续索引的映射 % faultBranch: 故障支路编号 visited false(size(branch,1)1, 1); startNode branch(faultBranch, 2); % 受端 queue startNode; visited(nodeMap(startNode)) true; downstream startNode; while ~isempty(queue) cur queue(1); queue(1) []; % 遍历所有以cur为送端节点的支路 nb find(branch(:,1) cur); for i 1:length(nb) next branch(nb(i), 2); if nb(i) ~ faultBranch ~visited(nodeMap(next)) visited(nodeMap(next)) true; queue(end1) next; downstream(end1) next; end end end end这里把每条支路的“下游节点集合”都提前算好存到cell数组里后续遍历故障时直接用就不需要每次都重新搜索这也是提速的关键。4.3 孤岛划分与负荷削减逻辑孤岛判定是整个代码里最容易出错的环节。实际场景中故障发生后开关开断形成一个局部区域区域里有DG和负荷。DG能不能带起负荷要判断两个条件DG当前出力能力是否大于等于孤岛内负荷总和区域内是否存在可行的供电结构也就是DG和负荷在电气上是连通的。文献里的“孤岛划分”本身可以做成一个优化问题但工程评估中太复杂了我建议用简化的容量判据islandLoad sumLoad(islandNodes); % 孤岛内总负荷 dgAvail sumDgCapacity(islandDg); % 孤岛内DG可用总功率 if dgAvail islandLoad % 全部负荷由DG供电停电时间 开关切换时间 outageTime(islandNodes) switchTime; else % 容量不足削负荷 % 按负荷重要程度排序重要负荷优先普通负荷等待修复 [~, idx] sort(priority(islandNodes), ascend); curLoad dgAvail; for i 1:length(idx) n islandNodes(idx(i)); if curLoad loadLevel(n) outageTime(n) switchTime; curLoad curLoad - loadLevel(n); else outageTime(n) repairTime; end end end注意这里的负荷削减是静态的、按优先级顺序的简化处理。如果你研究的系统里负荷本身就是时变的那就需要把孤岛时长按小时切片依次判断每一小时的DG出力水平能不能满足负荷。这个方法我放在5.2里详细说这里先不铺开。一个重要的提醒检修时孤岛内DG能否支撑负荷还要看DG是否处于计划停运状态这个概率在算孤岛成功率时必须乘进去很多人会漏掉“DG自身故障”的影响。4.4 指标计算与结果输出最后一个环节是把每个故障场景下的影响累加为指标。不要用全局变量随手累加而是先建立一个“负荷点停电记录矩阵”最后统一算指标这样调试时可以随时调出来看中间结果。参考代码如下% record: 每个负荷点的停电记录行数等于故障场景数列数等于负荷点数 % 矩阵元素为停电时间-1表示该场景不影响该负荷点 nLoad size(loads, 1); record -ones(nFault, nLoad); % ... 主循环里填充 record ... % 统计指标 lambdaLP zeros(nLoad, 1); % 负荷点停电频率 ULP zeros(nLoad, 1); % 负荷点停电时间 for i 1:nLoad lambdaLP(i) sum(record(:, i) 0); ULP(i) sum(record(record(:, i) 0, i)); end SAIFI sum(lambdaLP .* loads(:, 2)) / sum(loads(:, 2)); SAIDI sum(ULP .* loads(:, 2)) / sum(loads(:, 2)); CAIDI SAIDI / SAIFI; ASAI 1 - SAIDI / 8760; ENS sum(ULP .* loads(:, 3)); % 电量不足kWh/年这里计算SAIFI、SAIDI时乘以用户数再除以总用户数就是标准的用户加权口径。我见过某版本代码计算时忘了乘以用户数结果画出来的指标“看起来还行”实际上偏差很大——这种错误最好在写完指标函数后用不含DG的纯网架数据跑一遍和教科书算例对标校验通过了再往DG场景上加。5. 算例验证与结果解读5.1 测试系统与参数设置我用的算例是IEEE RBTS Bus 2馈线F1的简化模型RBTS是电力系统可靠性评估标准测试系统Bus 2常用于配电网可靠性基准研究。原始系统有22个负荷点、4条馈线为了讲代码逻辑我把F1馈线做成了一个含7个节点、6条支路的简化网架数据就是4.1节里列出的那几行。系统主电源在节点1节点2处装了一个分段开关节点7处通过联络开关接入备用电源转供容量按300kW考虑。DG为节点6处的一台300kW光伏可利用率0.85。对各支路故障故障隔离加转供的开关切换时间取0.5小时故障修复时间按支路平均修复时间取3.5~4小时。这里有一个关键点我必须说明光伏按“可用率0.85”折算意思是故障期间DG能正常出力为孤岛供电的概率是0.85反过来说有15%概率DG因光照不足、逆变器故障等原因带不起孤岛。更精细的做法是用24时序光照曲线在白天时段光伏可用率更高但初版代码用平均可用率来估算整体趋势是可以接受的。5.2 结果对比分析跑完代码后我得到三组数据无DG、有DG但孤岛成功率按0.85折算、有DG且假设孤岛必定成功可用率设为1.0。系统指标对比见下表指标无DG有DG可用率0.85有DG假定必成功SAIFI次/年1.631.631.63SAIDIh/年8.156.476.12CAIDIh/次5.003.973.76ASAI%99.90799.92699.930ENSkWh/年25.1819.8818.83注意SAIFI完全没有变化。这是因为在这套网架里DG孤岛只是“减少停电时间”并没有“消除停电事件”。所有受故障影响的负荷点不管孤岛成不成功故障瞬间都经历了停电只不过孤岛成功的话很快恢复。这验证了我在第2章说的口径问题SAIFI对DG不敏感是正常的不是代码写错了。SAIDI的差别则很明显DG孤岛让平均停电时间从8.15小时降到6.47小时降幅约21%。而“假定必成功”和“可用率0.85”差了0.35小时这个差距直接反映了DG不确定性对可靠性收益的侵蚀。如果论文里需要用这个结果说明DG的价值我建议同时报告两套数据并解释清楚差异来自DG可用率这样比单报一个“最好情况”要扎实得多。5.3 孤岛成功率敏感性分析我习惯在上述基础上再加一步敏感性分析把孤岛成功率从0.6按0.05步长涨到1.0画出SAIDI和ENS的变化曲线。这一步在代码里非常省事因为孤岛成功率是全局变量主循环里乘一下就行islandSuccessRate 0.6:0.05:1.0; for r 1:length(islandSuccessRate) pIsland islandSuccessRate(r); % 重新执行故障影响分析 % ... saveResult(r) SAIDI; end这样做的价值是把“DG可靠性”当成一个可调参数而不是一个拍脑袋给定的常数。实际工程里提高孤岛成功率的手段比如更快的频率电压控制、更完善的同期装置、DG黑启动能力都可以映射到这个参数上评估结果直接变成设备投资的效果论证。虽然我不能在这里给出精确的投资回报计算但是用这个思路作为论文的扩展章节是完全够用的。6. 常见问题与调试经验6.1 孤岛概率计算结果不合理问题往往在“孤岛范围”定义我做第一版代码时DG接入节点6结果SAIDI比无DG时还差怎么查都查不出问题。后来一检查——我写的故障影响分析把所有受故障影响的负荷都算进了“孤岛内负荷”可实际上这些负荷分布在故障隔离区域两侧一部分在故障点上游一部分下游根本不在同一个电气岛上。孤岛判定必须严格基于故障隔离后的连通关系如果只是“节点序号在某个集合里”就会把不相邻的负荷错配进去导致容量判据偏差很大。建议完成后画一张拓扑图随机选几个故障场景手动推演一遍开关动作顺序核对代码判定结果。6.2 DG时序出力与负荷时序的处理取舍用平均可用率只能出“全年平均”指标但光伏和风电出力跟时段强相关。如果你做的是季度或者月度可靠性分析就需要改用24小时或8760小时时序模型。工程上有个折中全年按8760小时切故障发生时刻按小时随机抽样故障期间DG出力取该小时的典型出力值比如白天光伏取0.8×额定夜间取0。这样比平均模型精细代码增加量也不大。我做过一次对比时序模型算出来的SAIDI会比平均模型高约8%——因为很多故障发生在光伏出力低的晚上平均模型高估了DG的支撑能力。6.3 枚举法代码跑得太慢的优化技巧如果是几十条馈线、几百个负荷点的大网架枚举所有一阶故障再加孤岛判定Matlab可能跑几十秒甚至几分钟。优化方式是我前面提到的预计算节点拓扑关系提前把每个节点的下游支路和负荷算好存起来不要每次遍历都用DFS现搜。另外一个优化点是利用矩阵运算批量处理不需要对每个负荷点写循环% 用逻辑索引一次性取出受影响负荷而不是for循环判断 isAffected ismember(loadNode, downstreamSet); outageTime(isAffected) switchTime;如果用了这两个技巧还慢那就说明该上蒙特卡洛了——不是降精度而是枚举空间已经大到不现实换方法才是正确选择。6.4 和“出力削减”“储能配置”相关扩展的衔接代码框架如果打好后面扩展方向很清楚加储能只需要在DG数据结构里增加储能容量和充放电策略孤岛时的可用功率要按储能SOC动态算加微网就要把孤岛内部的网络约束线路容量、电压约束放进来可靠性评估就和潮流计算耦合了。这块是当前研究的热点但底层还是“故障影响分析孤岛可用容量”的逻辑。我在实际中做得最多的扩展是把这里的可靠性评估结果作为上层优化模型的目标函数。比如用遗传算法或粒子群去搜索储能的最优选址定容每次迭代里调用一次可靠性评估程序算SAIDI或ENS然后送回优化器。这种耦合方式代码结构清晰Matlab里用function handle把评估函数包起来优化算法只关心输入输出十分方便。这套经验希望能帮你少走弯路真要往深做裕度比我这里讲的还要大一个个攻下来就行。