资讯动态

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

发布时间:2026/10/24 5:48:59 来源:尧图企业网站定制
配电网可靠性评估这块早几年做的人还都是按照教科书上的老一套来——辐射状网络、单一电源、故障模式后果分析一套下来中规中矩。但分布式电源DG一接入原来的评估逻辑就有点转不动了。电源不再是唯一的一个点故障状态下馈线也不再是单纯的“断两段”那么干净。最近我正好把一个“最优孤岛划分下含分布式电源配电网可靠性评估”的Matlab程序完整跑通了一遍从孤岛划分策略到可靠性指标统计再到代码结构设计踩了不少坑也理顺了不少思路。这篇就把整个逻辑、算法选型、代码框架和调试经验一次说清楚给正在做这个方向的同学一个可以直接参考的路线。1. 先把问题说清楚为什么要做孤岛划分下的可靠性评估1.1 传统配电网可靠性评估的局限传统配电网的典型结构是单电源辐射状网络变电站出来的馈线像树杈一样一级一级往下带负荷每个负荷点只有一个供电路径。在这个前提下做可靠性评估逻辑非常朴素哪条支路故障下游负荷停电上游由电源侧恢复下游等维修完毕或通过联络开关转供。经典的故障模式后果分析法FMEA就是按这个逻辑逐条支路分析再统计出系统指标。这个方法本身没有错问题在于DG接入之后场景变了。馈线中段接入一个分布式电源比如一台风机或者一片光伏原本“单电源单向供电”的假设就失效了。故障发生后故障点划分出的下游区域不再是必须在停电状态下干等维修它可以尝试由本地DG带起来——也就是进入孤岛运行状态。这时候再用传统的FMEA逻辑去统计就会低估系统的供电能力算出来的可靠性指标偏高评估结论失真。所以含DG配电网的可靠性评估核心不再是“怎样算故障影响”而是“故障发生后哪些负荷能通过孤岛恢复”这直接决定了最终的指标数值是否合理。换句话说可靠性评估的精度很大程度上取决于孤岛划分策略的质量。1.2 “最优孤岛”到底在优化什么很多人第一次接触“最优孤岛划分”这个概念时容易误解以为孤岛划分就是找几个连通子图把DG包进去。其实没那么简单。真实配电网里每个负荷重要程度不一样每个DG的出力能力和接入容量不一样开关的分合操作还有次数约束和时序约束。所谓“最优”是在故障状态下的有限时间内找到一组孤岛划分方案让恢复的负荷价值最大、失负荷量最小同时满足功率平衡、电压约束和网络拓扑约束。可以类比一个大商场发生局部火情后的疏散方案保安不能只想着把人分片区疏导还得考虑每个出口的通行能力、每片区域的人员密度、消防通道的联动规则目标是总疏散效率最高而不是某个片区跑得最快。配电网孤岛划分也是同样道理只是把“人”换成了“负荷”把“出口通行能力”换成了“DG出力和线路容量”。这也是为什么绝大多数相关研究都把孤岛划分和可靠性评估放在一起做——离开可靠性指标谈孤岛最优性没有落点离开孤岛策略谈可靠性的提升幅度也没有依据。两者是一个完整的闭环。我见过不少新手只把孤岛划分当作一个独立模块来做最后算出来的可靠性指标改善幅度小得可怜本质上都是因为孤岛策略本身没有优化到位。2. 可靠性评估的理论基础与指标计算2.1 指标体系从负荷点到系统层面该怎么选做可靠性评估第一步不是写代码而是定指标。含DG配电网的可靠性评估行业里常用的指标依然是那几个经典值因为只有这样横向对比才有意义。负荷点层面看的是“这个点一年停多久”“一年停几次”系统层面看的则是用户均停电时间、停电频率和缺供电量。我把最常用的几个指标整理成表指标全称计算公式含义SAIFISystem Average Interruption Frequency Index(\frac{\sum N_i}{N_{total}})系统平均停电频率次/(用户·年)SAIDISystem Average Interruption Duration Index(\frac{\sum U_i N_i}{N_{total}})系统平均停电持续时间h/(用户·年)CAIDICustomer Average Interruption Duration Index(\frac{SAIDI}{SAIFI})用户平均停电持续时间h/次ASAIAverage Service Availability Index(\frac{8760-SAIDI}{8760})平均供电可用率ENSEnergy Not Supplied(\sum L_i U_i)年缺供电量MWh/年AENSAverage Energy Not Supplied(\frac{ENS}{N_{total}})平均缺供电量MWh/(用户·年)公式里(N_i)是负荷点i的停电用户数(U_i)是该负荷点的年停电持续时间期望值(L_i)是节点i的平均连接负荷。这里要特别注意含DG场景下负荷点停电时间的统计方式和传统方法差别很大。传统方法里某条支路故障后其下游负荷的停电时间基本就等于故障修复时间是个固定值。含DG之后这个负荷点的停电时间可能是“故障持续时间的某一段”——因为故障发生后孤岛成功建立之前它可能停了孤岛建立后又恢复了修复完成后重新并网可能还会有一次短时切换。所以统计停电时间期望值(U_i)时用的是时序上的叠加逻辑不能简单地套“修复时间”这个常数。2.2 方法论选型状态枚举法和时序蒙特卡洛法的取舍明确了指标之后下一个要面对的问题是用什么方法获取停电频率和时间这里有两个主流路线状态枚举法和时序蒙特卡洛法。状态枚举法的思路是枚举系统可能出现的故障状态。比如馈线上有20个元件每个元件有“正常”和“故障”两种状态那么就逐一分析每一个元件故障时的系统响应。计算量相对可控结果确定性高、可重复性强。它的短板也很明显无法自然处理DG出力的时序波动。光伏白天有出力晚上完全没有风机出力随风速变化孤岛能不能建立、能带多久是随时间变化的。状态枚举法强行处理时序就得把一年砍成很多个时段再逐段枚举模型复杂度直线上升。时序蒙特卡洛法则是按时间步长比如每小时对系统状态做随机抽样用一系列时序场景模拟整年的运行情况。每种场景下DG出力、负荷大小都不同故障状态也是随机出现的再对各个场景做故障影响分析和孤岛划分最后累计统计指标。它的优势恰恰弥补了枚举法的短板能自然耦合DG出力的时序性也更贴近真实运行状态。代价是计算量大单次模拟结果有随机波动需要设置随机种子并做多次仿真取期望值才能稳定。就我目前的经验来看除非你只做极小规模系统的概念验证否则含DG配电网的可靠性评估不太建议用纯枚举法。我这次程序采用的是“时序蒙特卡洛抽样 最优孤岛划分 故障影响分析”的组合计算量可控结果也更接近工程实际。实际算例中用标准IEEE测试系统做修正模拟一年的运行状态在主流配置的电脑上几分钟内就能跑完一轮。3. 最优孤岛划分的建模与求解思路3.1 目标函数和约束条件怎么定才合理既然叫“最优”孤岛划分就绕不开数学建模。目标函数不能随便拍脑袋要根据评估目的来定。如果关注的是停电损失目标函数可以设为故障期间系统停电成本最小化如果关注的是供电可靠性影响面可以设为故障期间恢复的负荷量最大或失负荷量最小。我这次采用的是“故障期间总失负荷量最小化”作为目标。对于某一次故障状态目标函数可表示为[ \min P_{loss,s} \sum_{i \in Bus} P_{L,i} \cdot (1 - x_{i,s}) ]其中(P_{L,i})是节点i的负荷功率(x_{i,s})是0-1决策变量表示第s个故障场景下节点i是否被孤岛恢复供电。之所以选这个目标是因为它能直接对应到ENS指标后期统计的衔接最顺畅。约束条件才是真正考验建模功底的地方核心约束有这么几类功率平衡约束每个孤岛内DG总出力必须大于等于孤岛内负荷需求考虑损耗后否则孤岛无法稳定运行。拓扑连通性约束同一孤岛内的节点必须在拓扑上连通不能出现“画饼式”的孤岛——节点电压能算通但实际没有通路。分布式电源容量约束单个DG的出力不能超过其额定能力也不能低于最小技术出力。电压约束孤岛内各节点电压偏差保持在允许范围内一般取±7%或±10%。开关操作约束用于构建孤岛的开关数量和操作顺序要符合配网调度原则。这里面最容易被忽略的是拓扑连通性约束。我在前面调试程序时曾经过了一个看似合理的孤岛方案负荷恢复量和功率平衡都满足但仔细检查发现被“隔离开关”分开的两段并没有物理连接路径。孤岛划分搜索时如果只做“节点归属”层面的判断而不做图连通性校验很容易出现这种逻辑上成立、物理上不成立的错误解。3.2 求解算法怎么选从图搜索到智能优化明确了目标和约束接下来是怎么求。这里要区分问题的规模。对于单次单点故障的小规模系统可以直接用图搜索的方法深度优先或者广度优先去遍历可能的孤岛组合找到最优解。但对大规模系统尤其是含多个DG、多故障场景的组合优化问题穷举是走不通的这时候要借助智能优化算法或数学规划工具。我在程序中使用了“深度优先搜索确定连通域 功率平衡校验 遗传算法优化划分方案”的三层结构。第一步先确定故障隔离后的失电区域的拓扑连通关系把可恢复的馈线片段划分为若干候选连通域第二步对每个候选连通域做功率平衡校验筛选出具备孤岛运行条件的区域第三步再用遗传算法在候选解空间中搜索最优划分组合迭代收敛后输出恢复方案。这样做的好处是用前两步把搜索空间压缩下来遗传算法不必在无效解上浪费大量计算。当然如果系统规模不大也可以直接用线性整数规划来求解。MATLAB里提供了一系列优化接口可以把上述约束写成标准形式求解结果比启发式方法更稳定、可解释性更强。但如果节点数超过一定规模混合整数规划的求解时间会显著增长这时再考虑智能优化是合理的。4. Matlab实现框架与核心代码思路4.1 程序总体架构模块划分和数据流实现这个评估程序我最重要的一条经验是一定不要把孤岛划分和可靠性评估揉在一个脚本里。看起来省事实际上后期每次要改参数、换场景时都会非常痛苦。推荐的架构是分模块、串流程。整个程序大致分成这么几个模块输入数据模块网络拓扑矩阵、支路参数阻抗、额定容量、负荷数据每个节点的年负荷曲线或典型日负荷、DG数据类型、容量、位置、出力时序曲线、元件可靠性参数故障率、修复时间、孤岛策略参数。系统状态生成模块根据时序蒙特卡洛逻辑按照年时间轴抽样生成每一小时或每半小时的系统运行状态包括负荷水平、DG出力、元件健康状态。故障注入与影响分析模块在给定系统状态下注入元件故障事件判断失电区域为孤岛划分提供输入。最优孤岛划分模块对失电区域执行连通域搜索、功率校验和优化求解输出孤岛划分方案。可靠性指标统计模块基于每个时段的停电信息累加统计负荷点停电次数、停电时间并汇总出系统级指标。输出模块输出指标报表和关键场景分析结果。数据的传递要保持统一的数据结构。我在程序里用结构体数组来管理节点参数和支路参数节点结构体里的字段包括节点编号、负荷类型、有功和无功负荷、是否接DG、DG类型和额定容量等支路结构体则包含首末端节点、阻抗、额定电流、开关状态等。结构化组织数据的好处是后续写故障分析函数和孤岛搜索函数时传参清晰代码可读性和可维护性都会好很多。4.2 故障场景生成与负荷停电判断故障场景的生成是整个评估中频率最高的操作因为时序蒙特卡洛每一时刻都要判断系统里有没有元件发生故障。常规做法是采用元件可靠性参数每个元件都有年故障率(\lambda)次/年和平均修复时间(r)小时。在时序仿真中每秒或每小时判断该元件是否发生故障通常用“当前时刻故障状态”与“下次故障发生时间”之间的随机抽样来确定。这里我给一个典型的实现思路基于指数分布假设来模拟元件故障间隔时间。以小时为仿真步长对每个元件独立抽样它的“下一故障时刻”当仿真时钟推进到该时刻时判定该元件进入故障状态持续修复时间(r)后再恢复正常。同时抽样下一故障时刻如此循环。核心思路的代码框架如下% 元件故障过程抽样时序仿真用 % lambda_yearly: 年故障率(次/年) lambda_hour lambda_yearly / 8760; % 随机抽样下次故障时刻累积分布函数逆变换法 time_next_fault -log(1 - rand) / lambda_hour; % 若当前仿真时刻 t 到达该时刻则元件故障持续修复时间 r 小时后恢复 if t time_next_fault component.fault_state 1; time_recover t r; % r为平均修复时间 end这个逻辑写起来简单但要注意元件故障抽样结果依赖于随机数序列所以每次仿真结果都会有波动。为了得到稳定指标程序里需要设置固定随机种子并且对多个随机种子分别仿真最后取所有仿真轮次的平均结果。我在实际程序中设置了20组随机种子每组模拟50年运行状态并丢弃第一年的预热数据这样得到的指标波动可以控制在可接受范围内。故障发生后就要判断负荷点的停电范围。判断逻辑是找到故障元件线路或变压器从故障点往潮流方向下游追踪凡是通过该故障元件供电的负荷节点全部标记为失电候选节点但同时要检查这些节点是否有备用联络线路如果有且联络线可用则这部分负荷可以由备用路径转供不停电或仅在切换期间短时停电。这一步骤的结果直接决定了孤岛划分的初始失电区域。4.3 孤岛可行域搜索与功率平衡校验孤岛搜索的核心是“连通域”的遍历。在故障隔离后的失电区域中DG接入节点是孤岛的潜在根节点。从每个DG接入节点出发沿失电区域的带电线路向相邻节点搜索凡是能通过仍处于闭合状态的支路连通的节点都可以纳入该DG的候选孤岛域。这里我使用的是深度优先遍历代码逻辑大致如下% 从DG节点出发搜索候选孤岛连通域 function candidate_nodes search_island(adj_matrix, dg_node, deenergized_nodes) visited false(1, size(adj_matrix, 1)); stack dg_node; visited(dg_node) true; candidate_nodes dg_node; while ~isempty(stack) current stack(end); stack(end) []; neighbors find(adj_matrix(current, :) deenergized_nodes); for i 1:length(neighbors) n neighbors(i); if ~visited(n) visited(n) true; stack(end1) n; candidate_nodes(end1) n; end end end end搜索到连通域后下一步是功率平衡校验。校验时要注意DG出力的时序特性在某个时步下给定风速、光照强度条件下DG的出力是某一确定值或在一定置信区间内的随机值。因此校验不能只看“DG额定容量之和是否大于负荷”而要看“当前时步DG实际可用出力是否大于等于孤岛内总负荷需求”。如果DG出力不足孤岛不能成立该部分负荷只能停电等待系统修复如果DG出力富余量很大可以考虑在连通域内进一步收紧搜索范围只恢复更靠近DG的高价值负荷。这一步就是“最优”的体现并不是所有能恢复的节点都要恢复而是选择恢复价值最大的组合。这也是后面遗传算法要做的事情。4.4 遗传算法搜索最优划分组合遗传算法在这里的作用是在候选连通域集合基础上搜索最优的负荷恢复组合。编码方式可以有多种选择我采用的是0-1编码每个失电节点对应一个基因位1表示该节点被选中恢复供电0表示不恢复。适应度函数定义为目标函数失负荷量最小并对违反功率约束、电压约束的个体施加惩罚系数。这里有一个比较重要的细节遗传算法的初始种群生成一定要利用前面的连通域搜索结果而不是完全随机生成。完全随机生成的个体大量违反拓扑连通性约束算法收敛速度会非常慢。我采用的做法是初始种群的一部分个体直接从搜索算法得到的各个候选孤岛方案中抽取另一部分在候选方案附近做少量变异扰动这样种群起点高迭代效果显著改善。% 遗传算法核心参数设置 options optimoptions(ga, ... PopulationSize, 100, ... % 种群规模 MaxGenerations, 200, ... % 最大迭代代数 CrossoverFraction, 0.8, ... % 交叉概率 MutationFcn, mutationadaptfeasible, ... % 自适应变异 Display, off);需要提醒的是遗传算法的结果有随机性每次运行得到的恢复方案可能略有不同。为了可靠性评估的结果可复现建议固定随机种子或者在多轮蒙特卡洛仿真中共享同一个优化配置和种子这样最终统计的指标不会因为优化算法的随机性而产生额外波动。4.5 可靠性指标的累加统计指标统计是所有计算的收口环节。做法并不复杂关键是别漏统计、别重复统计。程序里维护了几个累加器每个负荷点的停电次数计数、停电持续时间累加、缺供电量累加。每完成一次故障场景分析就把本次故障造成的停电信息记入对应负荷点仿真结束后汇总计算系统指标。这里要注意一个易错点某负荷点在故障期间可能经历“先停电、后孤岛恢复、再短时切换停电、最终并网”的复杂过程。统计停电次数时“短时切换停电”是否计入停电事件取决于你选择的统计口径。行业里通常区分“持续性停电”和“短暂停电”在SAIFI统计中短暂停电一般不纳入但在用户感知层面它确实造成了影响。程序实现时我会单独设置一个开关来控制是否统计短暂停电这样在做对比分析时可以灵活变换口径。5. 调试过程中遇到的常见坑与排查技巧5.1 孤岛搜索结果不满足功率平衡白算一整轮我最早调试时遇到的一个高频坑是DFS搜索出的连通域范围很大把一堆低价值负荷也包了进去结果功率平衡校验通不过整个孤岛方案被直接否决。这个问题的根源在于搜索算法只考虑了“拓扑可达”没有考虑“供电能力”。解决方式是在搜索阶段就加入简单的剪枝判断搜索过程中实时计算当前累积DG出力与累积负荷需求一旦负荷需求超过DG出力的某个阈值比如1.2倍就停止继续向外扩展。虽然这不能保证全局最优但能把搜索空间大幅压缩减少无效计算。5.2 时序仿真收敛性差指标波动大时序蒙特卡洛仿真的结果波动是个绕不开的课题。如果你用同一组参数跑两次得到完全相同的指标那大概率是你忘了设置随机种子或者仿真轮数不足。根据我的经验含DG系统的可靠性指标要想稳定在相对误差5%以内至少要跑20组独立随机种子、每组50年仿真。如果DG渗透率比较高孤岛划分对场景的敏感性也会增强轮数需要进一步增加。另一个实用技巧是分层抽样。如果系统里某个元件的故障率特别低完全随机抽样下该元件的故障次数可能很少统计到该元件上游负荷点的停电次数就会很不稳定。解决方法是把故障率低的元件单独做条件抽样保证在整个仿真周期内至少出现足够次数的样本然后对统计结果做加权修正。5.3 DG出力时序和负荷时序对不齐导致结果失真这个坑我印象深刻。早期版本里负荷数据我直接用年最大负荷值DG出力用的却是典型日曲线结果导致孤岛划分几乎永远无法成立——因为负荷取的是峰值而DG出力取的是平均值两者根本不在同一个时间维度里比。后来改成完整的一年8760小时负荷曲线和DG出力时序曲线两者在时间轴上对齐后孤岛成立的场景数量和指标数值才变得合理。做时序仿真时负荷和DG出力的数据粒度一定要一致要么都是小时级要么都是半小时级。如果原始数据粒度不同需要做插值或聚合处理不要为了省事直接混用不同粒度的数据。5.4 遗传算法收敛后结果不稳定遗传算法本身的随机性会让同一算例两次运行得到的划分配置不同。这也是为什么我之前强调要在评估程序中统一随机种子。如果出现“算法每次运行给出的最优孤岛方案差异很大”的情况先不要急着调种群数先检查约束是否设置正确。很多时候差异大是因为目标函数里缺少了对恢复方案规模的惩罚项——比如两个方案失负荷量几乎相同但一个恢复了20个节点另一个只恢复了5个节点本质上一个更优但目标函数值却差不多导致算法在两个方案之间摇摆。可以在目标函数里加一个微小的节点恢复数量奖励项比如在原目标函数基础上减去系数(\epsilon \cdot N_{restored})其中(\epsilon)是一个远小于单位负荷功率的数值。这个小技巧在工程中挺实用能让算法在同等失负荷量的情况下偏向恢复范围更大的方案。6. 评估结果怎么解读以及这套程序还能怎么扩展跑完程序拿到一堆指标之后最重要的工作是解读。如果你针对同一网络分别做“无DG孤岛划分”和“有DG最优孤岛划分”两种场景的评估正常会发现SAIFI、SAIDI、ENS均有不同程度改善具体幅度取决于DG的容量和接入位置。DG接在馈线中段和后段的效果通常优于接在馈线首段——这个结论其实很好理解首段故障上游电源可以直接恢复DG在首段发挥的作用很有限接在馈线末端则可以保障末端长线路负荷的供电改善效果更明显。在解读指标时我给你一个非常实用的建议在做指标对比时把所有负荷点分类成“含DG节点”“DG下游节点”“DG上游节点”“联络线转供节点”四类分别统计各类节点的停电时间和停电次数。这样一份简单的分类统计就能直观看出DG孤岛运行的主要受益对象也能暴露出网络结构的薄弱点在哪里。很多研究报告里只给一个系统级的SAIDI数值无法指导后续的DG选址定容优化。这套程序目前的状态还有一个可以快速扩展的方向把孤岛划分从“故障状态下的应急响应”扩展为“正常运行状态下的主动配电网重构”。两者的数学模型框架高度一致差异主要在目标函数——可靠性评估里优化的是故障后的失负荷量主动重构里优化的是网损或者运行经济性。你把目标函数和约束条件做一下替换网络拓扑数据沿用现有结构就能把程序扩展到配电网优化运行的领域。另外如果后续要加入储能系统那孤岛划分模型里需要考虑储能荷电状态的时序变化。储能的存在会让孤岛运行不再只依赖DG的瞬时出力而是可以一群孤岛共用一个储能系统削峰填谷这会显著改变孤岛可行域和最优划分方案。模拟的方法是把储能当作一个带能量上下限约束的特殊“可调DG”在功率平衡约束里加入储能充放电项其余框架都可以沿用。我个人的经验是做这类项目不要试图一步到位做一个“万能”程序先跑通基本流程拿到可对比的结果再逐步扩展场景。这个方向后续能玩的东西非常多——配电网韧性评估、含电动汽车充电桩的网络可靠性、多微网互联的孤岛协同这些本质上都是同一个框架下的变形和深化。把基础代码模块化、结构化后面就能以一当十地复用这也是我做这个程序时最有收获的地方。

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

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

免费获取报价 →
↑