☰
最优孤岛划分下含分布式电源配电网可靠性评估的Matlab实现
2026/10/24 5:48:58 网站建设 项目流程

配电网可靠性评估这块,早几年做的人还都是按照教科书上的老一套来——辐射状网络、单一电源、故障模式后果分析,一套下来中规中矩。但分布式电源(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(end+1) = n; candidate_nodes(end+1) = 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”,在功率平衡约束里加入储能充放电项,其余框架都可以沿用。

我个人的经验是,做这类项目不要试图一步到位做一个“万能”程序,先跑通基本流程,拿到可对比的结果,再逐步扩展场景。这个方向后续能玩的东西非常多——配电网韧性评估、含电动汽车充电桩的网络可靠性、多微网互联的孤岛协同,这些本质上都是同一个框架下的变形和深化。把基础代码模块化、结构化,后面就能以一当十地复用,这也是我做这个程序时最有收获的地方。

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

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

立即咨询