ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

配电网可靠性评估蒙特卡洛非序贯仿真Matlab代码拆解

配电网可靠性评估蒙特卡洛非序贯仿真Matlab代码拆解

简介:面向电气工程、电力系统专业的学生、研究人员与工程技术人员,这份PDF聚焦蒙特卡洛法在配电网可靠性评估中的建模与应用,内容兼顾方法原理与实现示例。针对传统确定性评估假设参数固定、难以反映负荷波动与设备故障等随机因素的问题,资源从概率统计视角切入,通过大量随机抽样逼近复杂问题解,系统梳理了确定评估目标和范围、设定随机变量概率分布、批量抽样仿真、统计并输出可靠性指标的完整流程,同时分析了瞬时可靠性、长期可靠性等评估维度及方法在计算量、分布精度和模型准确性方面的优缺点,可为配电网规划、方案比选与运行决策提供参考。包体为1个PDF文档,大小174KB,文档内附Matlab代码示例,涵盖核心抽样与统计步骤,便于直接阅读和对照复现。当前已有20人学习下载,适合需要快速掌握随机模拟评估技术并用于配电网可靠性分析的学生与工程师,也适合在课程设计、论文仿真或工程预研中借鉴。

1. 配电网可靠性评估为什么要选蒙特卡洛:非序贯仿真的工程取舍

做配电网规划或运行方式分析时,可靠性评估总绕不开一个问题:手头网络规模一大,解析法直接算不动。传统最小割集法在辐射网里还行,一旦带上联络开关、分布式电源、多级转供路径,割集数量爆炸,建模成本和出错率都成倍上翻。这套基于蒙特卡洛法的配电网可靠性评估Matlab代码,用的是非序贯抽样思路——不追踪时间轴,只对元件状态做大量随机抽样,用统计结果逼近可靠性指标。相比序贯仿真,它的计算量小一截,适合做规划阶段的方案比选;相比解析法,它对网络复杂度的适应性更友好,不需要手工枚举故障集。适合正在做配电网可靠性课题的学生,以及需要做多方案比选的配网规划工程师。下面从模型建立、抽样逻辑到指标统计逐步拆开讲。

2. 配电网模型与参数化:从拓扑表到元件可靠性参数

用蒙特卡洛做配电网可靠性评估,第一步不是写抽样循环,而是把网络拓扑和元件可靠参数整理成程序能读的结构。代码里用的是最实用的两套数据结构:节点-支路表描述拓扑,可靠性参数表描述元件寿命分布。这段搞不扎实,后头抽样和负荷削减都对不上号。

2.1 拓扑怎么存:节点支路表与负荷分层

代码以节点-支路表为骨架。每个节点就是一个母线或负荷点,每个支路只记录首末端节点编号和支路类型。支路类型决定它是线路、断路器、隔离开关还是联络开关,这个字段直接影响故障隔离和转供路径的判定。

% --------------------------------------------------------------------- % 节点支路表:每行【支路编号 首节点 末节点 支路类型 长度(km)】 % 支路类型: 1=线路 2=断路器 3=隔离开关 4=联络开关 % --------------------------------------------------------------------- branch = [ 1 1 2 1 1.20 2 2 3 2 0.00 3 3 4 1 0.85 4 4 5 1 1.05 5 5 6 1 0.60 6 3 7 1 0.95 7 7 8 1 0.75 8 8 9 3 0.00 9 9 10 4 0.00 ]; % --------------------------------------------------------------------- % 节点表:每行【节点编号 节点类型 峰值有功(kW)】 % 节点类型: 1=变电站/电源 2=负荷 3=联络点 % --------------------------------------------------------------------- node = [ 1 1 0 2 2 180 3 2 120 4 2 150 5 2 90 6 2 60 7 2 110 8 2 80 9 3 0 10 3 0 ];

支路类型里线路和隔离开关要区分清楚。故障只会发生在类型为1的线路上,断路器负责故障区段隔离,隔离开关在隔离故障后配合联络开关恢复非故障段供电。节点表里的“节点类型”决定了负荷削减时哪些点能断电,哪些点只做转供通道。

2.2 可靠性参数怎么定:λ、r、修复时间与开关操作时间

每个元件要配两个核心参数:平均故障率λ(次/年)和平均修复时间r(小时/次)。对线路而言,λ通常按“每公里每年故障次数”折算,r是修复或更换时间。如果同一个区段内有多段线路串联,等效λ是各段λ之和,等效r是各段r按故障频次加权平均。这个等效值只在预计算里用,实际抽样时建议还是按分段独立抽样,否则区段内的隔离切换逻辑会被抹平。

% --------------------------------------------------------------------- % 元件可靠性参数:每行【支路编号 故障率λ(次/年) 修复时间r(小时)】 % 线路故障率按单位长度折算,开关类元件按动作可靠性计 % --------------------------------------------------------------------- relpar = [ 1 0.120 3.5 2 0.005 1.0 % 断路器 3 0.085 3.0 4 0.095 3.2 5 0.055 2.8 6 0.105 3.1 7 0.070 2.9 8 0.004 0.5 % 隔离开关 9 0.004 0.5 % 联络开关 ];

注意r的单位是小时,而抽样步长和指标统计用的是年,转换关系是8760小时/年。λ的单位归一化到“次/年”,一定不要用“次/小时”和“次/天”,不然SAIFI算出来直接错一个数量级。开关类元件的λ设得很低,代表操作机构机械故障概率,这在长馈线多联络的网架里尤其要保留,因为开关一旦拒动,故障隔离范围会扩大。参数表没有给负荷侧的停运成本系数,所以这套代码只出可靠性指标,不做经济性评估。

3. 非序贯抽样与负荷削减:状态生成、连通性判定与指标统计

非序贯蒙特卡洛的核心思路是:对每个元件,用均匀分布随机数判断它这一年里是否故障。抽样N次,每次得到一组系统状态;对每个故障状态做潮流或连通性分析,统计停电负荷和停电时长;最后用N次抽样的均值逼近指标真值。这套流程避开了时间序列的生成,收敛速度靠样本量撑,但每一步的状态判定逻辑并不简单。

3.1 两状态模型抽样逻辑

每个元件只有两个状态:正常或故障。故障概率等于λ×Δt,Δt取1年。抽样时每个元件独立抽取一个[0,1)均匀数,小于故障概率就置为故障。

% --------------------------------------------------------------------- % 单次系统状态抽样 % --------------------------------------------------------------------- function state = sample_system_state(branch, relpar) n_br = size(branch, 1); state = zeros(n_br, 1); % 0=正常 1=故障 for k = 1:n_br lambda = relpar(k, 2); p_fail = min(lambda * 1.0, 1.0); % Δt=1年,避免概率超过1 if rand() < p_fail state(k) = 1; end end end

这里直接乘1.0是因为抽样区间按1年模拟,λ是年故障率,两者相乘就是这一个抽样周期内的故障概率。用min截断是为了防λ异常输入时概率越界,实际配电网元件λ远小于1,基本走不到截断分支。要注意的是,这种两状态抽样假设同一元件一年最多故障一次,对高故障率元件会低估其多次故障情形,工程上配电网元件λ普遍在0.01到0.2区间,偏差可接受。

3.2 负荷削减怎么算:连通性判定与最少切负荷

抽样出故障状态只是第一步,更关键的是判断哪些负荷点失电。基本流程是:先把故障支路从网络中剔除,然后对每个负荷节点做拓扑连通性分析,看它和电源节点之间是否还存在路径;如果存在直达路径,不需要切负荷;如果路径断了,再看是否有联络开关能转供;最终仍失电的负荷点就是这年该削减的负荷。

% --------------------------------------------------------------------- % 对单个负荷节点判定失电状态 % --------------------------------------------------------------------- function [lost, restore_time] = check_load_lost(branch, state, NodeSet, src_node) % 剔除故障支路 active = find(state == 0); adj = build_adjacency(branch(active, :)); % 主电源连通性 reachable = bfs(adj, src_node); if reachable(NodeSet) lost = 0; restore_time = 0; return; end % 尝试经联络开关转供 restored = try_transfer(branch, active, NodeSet, src_node); if restored lost = 0; restore_time = 0; return; end % 无法转供,判定失电 lost = 1; restore_time = ... % 按故障修复时间或分段恢复时间折算 end

真实代码里转供判定不是这么简单。联络开关能不能合上,取决于目标馈线剩余容量是否足够,也取决于转供路径上有没有别的故障点。代码包里会把“相邻馈线可转供容量”作为输入数组传进来,若转供路径上的联络点所在馈线已过载,则该联络开关视为不可用,继续找下一条路径。这个容量约束是新手上手最容易漏掉的一块,漏掉后指标算出来偏乐观。

3.3 三个核心指标:SAIFI、SAIDI、ENS 的统计口径

可靠性指标不是只数停电次数就完事。统计口径必须先定死,否则不同人跑同一套数据得出的结论能差很远。代码统计的是下面三个口径:

指标统计口径单位备注
SAIFI系统总用户停电次数 ÷ 总用户数次/用户·年只统计持续停电(>1分钟)
SAIDI用户总停电持续时间 ÷ 总用户数小时/用户·年含故障修复与转供时间
ENS各负荷点失电量之和kWh/年失电负荷×失电持续时间
% --------------------------------------------------------------------- % 指标叠加到年度统计 % --------------------------------------------------------------------- SAIFI_sum = SAIFI_sum + lost_users / total_users; SAIDI_sum = SAIDI_sum + (lost_users .* outage_duration) / total_users; ENS_sum = ENS_sum + sum(lost_load_kw .* outage_duration); % 单位kWh

用户数不是节点数。一个负荷节点往往带多个用户(居民楼、台区、工厂),代码里的用户数数组按节点独立定义,SAIFI的分母是全网总用户数,不是负荷节点总数。很多初稿把负荷节点数当成用户数用,SAIFI直接虚高数倍。ENS里的失电持续时间,要分两段计:故障修复时间决定这段;若能转供,则只计开关操作时间,代码里默认取0.5小时/次。这两个时间在统计时必须区分开,SAIDI和ENS的误差主要来自这里。

3.4 收敛判据:什么时候可以停

收敛判据不设的话,抽样数要么不够、指标波动大,要么跑太多、浪费时间。代码里用了简单的相对偏差判据,对三个指标分别计算,等所有指标相对偏差都小于阈值(默认2%)才停止。

% --------------------------------------------------------------------- % 收敛判据 % --------------------------------------------------------------------- if (std_saifi / mean_saifi) < 0.02 && ... (std_saidi / mean_saidi) < 0.02 && ... (std_ens / mean_ens) < 0.02 converged = true; end

这是用样本标准差除以样本均值做变异系数。2%的阈值对规划比选够用;若要用于可靠性指标精确申报,建议收紧到1%,抽样数会明显增加。实际跑下来,几十个节点的馈线组,默认做到2%收敛大概需要一万到几万次抽样,单次抽样是秒级,总耗时在分钟级。如果网络规模上百节点,建议直接启用并行抽样,否则单线程跑一次方案比选要等很久。

4. 排查与避坑:收敛判据、随机数种子与负荷削减逻辑的五个长教训

蒙特卡洛代码写起来快,跑起来也快,但结果对不对,往往要看这些隐蔽问题处理得干不干净。以下是拆这套代码时新鲜踩过的几个坑,按现象到原因到解决写清楚。

4.1 抽样次数不够,指标一直抖

现象:连续跑三次,每次SAIFI差百分之二三十,无法判断两个方案谁好谁坏。
原因:方差太大。收敛判据没生效,或者初始抽样次数设太小,比如只跑两千次就强行停止,非序贯抽样的方差削减本来就慢。
解决:先固定抽样五千次跑一轮,看变异系数;再按第三节的判据自适应加样本。对长馈线末端负荷点这类小概率事件,变异系数特别大,单独给它做分层抽样更稳。

4.2 随机数种子不固定,复现结果对不上

现象:上次跑出来的ENS是12.3万kWh,这次跑变成13.1万kWh,想排查是哪段逻辑改坏了,结果发现什么逻辑都没改,只是随机数变了。
原因:代码里rand()直接用系统时钟做种子,每次结果都不同,这是概率算法的天然属性,不是bug。
解决:在抽样的入口处固定rng(42)之类的种子。同一台机器同一份数据,无论跑多少次结果都一致,便于排查改动影响。方案对比时,任何方案都用同一批随机数种子,这样方案间差异纯粹由网络结构引起,不受抽样噪声干扰。

4.3 联络开关误判为常闭,孤岛被当成失电

现象:某段线路故障,明明联络开关能恢复部分负荷,程序却判定全段失电,SAIDI明显偏高。
原因:联络开关在正常态是断开的,拓扑分析时没有把联络开关纳入“可闭合”集合,导致转供路径失效。
解决:对支路类型加一个“常闭/常开”标签。故障后隔离完成,把常开的联络开关与目标馈线连通的路径临时加入邻接表,再跑BFS。如果转供容量充足,负荷点恢复供电;容量不足,只能部分恢复,这部分负荷按开关操作时间计停电,剩余按修复时间计。代码注释里专门标注了这一步,实际使用时不要删。

4.4 负荷点归类错,SAIFI分母算错

现象:两组数据对比,一个方案SAIFI比另一个高,但ENS反而更低,怎么看怎么不对劲。
原因:总用户数数组与负荷节点对应错位。比如负荷节点5实际带200户居民,代码里默认了100户,导致SAIFI分母偏差,甚至不同方案下偏差方向不一致。
解决:把用户数数组作为输入参数,单独校验长度必须与节点表长度一致。程序启动时打印每个负荷点的“节点编号-用户数-峰值负荷”对照表,人工扫一眼就能发现错位。我有一次就是因为节点表最后加了两行联络点,用户数数组没补0,结果SAIFI直接少算了一截。

4.5 λ和r的单位混用,指标整个飘移态

现象:某段线路的λ写成0.12次/年,r写成3.5小时,正常。另一段改成0.001次/小时,程序不报错,结果SAIDI变成原来的二十分之一。
原因:参数表是手工录入的,单位没统一,抽样概率和修复时间直接算,程序不校验单位一致性。
解决:在参数读取函数里强制检查λ的数值范围。若λ大于1次/年,直接抛错退出,因为配电网单条馈线年故障率超过1本身就很可疑;同时把r的单位固定为小时,若r大于24小时,打印警告提示确认是否写错成“天”。这个校验逻辑花不了二十行,但能挡住大部分手误。

5. 把代码改造成工程可用:参数校验、批量方案比选与结果可视化

基础跑通后,下一步就是把这套脚本从实验室工具变成能反复使用的比选工具。核心是三个改造点:参数集中管理、批量场景仿真、结果导出与可视化。

参数集中管理建议抽成一个配置函数或脚本,把所有输入集中到一个文件里,文件名用场景名区分。我一般把配电网评估的每个方案建成一个配置脚本,里面定义节点表、支路表、可靠性参数、开关操作时间、允许转供容量,然后统一跑一个入口函数。这样改方案时不用动主流程代码,只需要改配置,跑对比时也不容易改串参数。

批量方案比选更实用。规划阶段通常要对比三四套网架,代码包里可以加一个外层循环:

% --------------------------------------------------------------------- % 批量跑多个方案,输出Excel结果表 % --------------------------------------------------------------------- scenarios = {'网架方案A', '网架方案B', '网架方案C'}; for s = 1:length(scenarios) scenario_cfg = load_scenario(scenarios{s}); result(s) = run_reliability(scenario_cfg); end write_results_to_excel(result, '结果汇总.xlsx');

并行改造也不难。非序贯抽样的每次迭代互相独立,天然适合parfor加速,把最外层抽样循环从for改成parfor即可。跑几十节点的算例,开启并行后速度能提三四倍,代价是内存占用上升。要注意的坑是并行池里不能随机种子固定死,否则每个worker生成完全相同的随机数,抽样结果退化成单一状态重复上万次。做法是每个worker用不同的随机流,比如用worker编号做种子偏移。

投运后做可靠性校验时,这套工具还能和网架规划模型联动。把指标算完后输出成结构化结果,直接作为供电可靠性约束条件,反馈给网架优化模型。实际工作里,我每次改完网架方案,都会强制走一遍这套流程:先校验参数表单位,再固定随机种子跑基准方案,确认指标复现一致,然后才开并行批量跑比选。最后再检查一次联络开关容量约束和用户数数组对齐,看着结果表里SAIFI、SAIDI、ENS三列和预想量级吻合,才敢把数字往报告里放。希望这份拆解能让你少走几步弯路。

本文还有配套的精品资源,点击获取

RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进