资讯动态

基于序贯蒙特卡洛的配电网可靠性评估Matlab实现与案例分析

发布时间:2026/10/9 7:50:02 来源:尧图企业网站定制
做配电网规划的人应该没人能绕开“可靠性”这三个字。一个网架方案好不好不只是看投资额和线损更要看它对用户停电的影响到底有多大。我用来做这件事的工具就是一套基于可靠性评估序贯蒙特卡洛模拟法的配电网可靠性评估程序全程Matlab实现。这套程序能把配电网元件的正常运行、随机故障、检修恢复整个过程按时间轴一条一条模拟出来然后统计出SAIFI、SAIDI这类硬指标拿来做方案比选、改造决策、分布式电源接入评估都特别好用。这篇文章我把整套方法的原理、Matlab实现细节、实测结果和一些排查经验都整理出来无论是刚接触可靠性计算的研究生还是要评估真实网架的工程师都有可以直接抄作业的东西。1. 可靠性评估配电工作者绕不开的“算账题”1.1 配电网可靠性评估到底在算什么配电网本质上是连接输电网和千家万户的“最后一公里”。输电网出事可能会有备用通道、有保护动作但配电网结构复杂、设备量大、自动化水平参差不齐所以绝大多数用户停电的根源都在配电网这一层。可靠性评估说白了就是回答两个问题这一片区域一年大概会停几次电每次停电大概停多久如果再进一步还要算清楚每次停电损失了多少电量折算成经济损失又是多少。要回答这两个问题业内早就定了一组标准指标。系统平均停电频率指标SAIFI反映一年里每个用户平均经历几次停电系统平均停电持续时间指标SAIDI反映每个用户一年平均停电多少小时要算停电损失就要用到期望缺供电量ENS这三个指标拿出去做横向对比、纵向考核都够用。再往下拆还有CAIDI、ASAI这类派生指标使用起来也很频繁。算这些指标听起来简单真正做起来难点不少。难点之一在于故障的随机性配电设备的故障率、修复时间都不是固定的某个区段今天不出事不代表明天不出事检修策略一变故障概率又变了。难点之二在于网络拓扑复杂一条馈线上可以挂几十上百个配变中间还有分段开关、联络开关、熔断器故障发生后隔离哪个区段、哪些用户能转移出去、哪些用户必须等修复这是一个需要逐段分析的问题。难点之三在于负荷本身也在变高峰负荷和低谷负荷下同样一次停电损失的负荷量完全不同。这些问题叠加在一起导致配电网可靠性评估没有一个“一把梭”的解析公式可以全覆盖数值模拟就成了最通用也最可靠的手段。1.2 解析法、非序贯模拟与序贯模拟怎么选配电网可靠性评估的主流方法大致分三条路线。第一条路线是解析法典型的如故障模式枚举法、最小割集法。它的思路是把所有可能导致负荷点停电的故障组合枚举出来然后按概率算期望值。对付结构简单的辐射网、分支不多的馈线解析法又快又准结果稳定不需要随机抽样。可一旦网络规模变大、分布式电源接入、储能参与运行故障模式会指数级增长枚举到后面就是天文数字代码跑起来慢逻辑也容易乱。第二条路线是非序贯蒙特卡洛模拟法。思路也直接按元件的故障概率随机抽样系统状态样本足够多之后统计停电指标。这个方法速度快、网架规模大了也不怕但有一个致命短板——它完全不考虑时间顺序。抽样出来的是“某时刻系统的静态状态”而负荷在一日之内的时变特性、修复过程需要跨越多小时、储能装置的充放电循环、季节性的故障率变化这些时序关联因素都没法建模。所以我更建议用序贯蒙特卡洛模拟法。序贯蒙特卡洛模拟法Sequential Monte CarloSMC的做法是沿时间轴一帧一帧推进完整模拟每个元件从正常到故障、再从故障修复回到正常的过程。它不用枚举复杂的故障组合也没有状态数量爆炸的问题而且天然保留时间维度分布式电源出力曲线、时变负荷曲线都能直接塞进去。代价就是计算量相对大模拟年限要够长、抽样次数要够多才能得到收敛的指标。但按现在的计算机算力一个中等规模配电网跑几万年的模拟历史Matlab也就几分钟的事完全可接受。2. 序贯蒙特卡洛模拟法的核心原理拆解2.1 元件状态时序模型TTF和TTR怎么来序贯蒙特卡洛模拟法最底层的单元是“元件”。一条馈线、一台配变、一个断路器统统都可以抽象为元件。常规的做法是把每个元件看成一个两状态模型正常可用和故障停运。正常状态持续的时间叫“故障前运行时间”英文缩写TTF故障状态持续的时间叫“修复时间”英文缩写TTR。元件就在这两个状态之间来回切换活脱脱像一个上班-休假的循环。抽样TTF和TTR工程里最经典的做法是假设它们服从指数分布。指数分布有一个很漂亮的特性无记忆性也就是说元件随时随地都有相同的概率发生故障修完之后一切从零开始。给定元件平均无故障工作时间MTTF即故障率λ的倒数那么一次抽样得到的TTF就是TTF -ln(U) / λ其中U是0到1之间均匀分布的随机数。同理给定平均修复时间MTTR即修复率μ的倒数TTR的抽样公式为TTR -ln(U) / μ这个逆变换抽样法在Matlab里实现起来只要一行代码比其他分布方便得多。不过要说明一点实际设备不一定完美满足指数分布。有的元件会有老化趋势运行时间越久故障概率越高有的元件检修后“状态恢复”明显。这时候可以用威布尔分布、正态分布甚至经验分布来建模原理都是一样的——从分布函数里抽出一个时间样本——只是Matlab代码里需要调用对应的分布函数或者自己写逆变换。给元件建模的时候我习惯把配电网里的主干馈线按长度和单位故障率折算成若干个等价元件。比如一条3公里的架空线路每公里每年故障率0.1次那这条线路整体每年的故障率就是0.3次直接作为一个元件建模TTF抽样公式里的λ就是0.3。配变的故障率一般低一些通常按“台年”算年故障率可能只有0.005到0.02。实际数据可以来自当地的运行统计台账实在没有就先用典型参考值评估结果做相对比较也够用。2.2 系统时钟推进下一步做什么时间怎么走有了每个元件的TTF和TTR剩下的核心问题就是“怎么让整个系统沿着时间轴走起来”。序贯蒙特卡洛模拟法和真实世界的事件推进逻辑很像不要一毫秒一毫秒地跳而是直接跳到“下一个事件发生的时刻”。具体流程是这样的。程序启动时给每个元件都抽样一个当前状态和对应的剩余持续时间。系统时钟设为0然后进入一个循环第一扫描一遍所有元件找出剩下持续时间最短的那个。这个元件就是下一个发生状态切换的“主角”。第二把系统时钟直接步进到这个事件时刻也就是把时钟往前拨拨到主角元件切换状态的瞬间。第三如果主角从“正常”转为“故障”就要启动故障影响分析搞清楚这次故障造成了哪些用户停电、停了多长时间、损失了多少负荷然后把这个记录累计到统计变量里。如果主角是从“故障”转为“正常”那说明这个元件修好了系统状态相应恢复需要把供电路径调整回来。第四给主角元件重新抽样下一个状态持续时间。比方说它刚刚故障了那接下来需要抽样一个修复时间如果它刚刚修复了那接下来需要抽样一个TTF。同时因为修复动作可能改变了网络结构部分负荷的供电状态也要重新评估。第五循环回到第一步。这个过程一直持续下去直到系统时间达到预设的最大模拟年限Tmax。注意这里“模拟年限”和“真实时间”是两回事。我们不是预测未来某十年而是在元件的概率分布驱动下虚拟生成一段足够长的系统运行历史。模拟1万年代表的就是1万个独立的“虚拟运行年”每一年里故障、修复不断发生指标统计量也不断累加。这里有一个很容易犯的错误某个元件检修或者故障之后其他元件的时间戳要不要跟着变在事件驱动的框架里只需要处理状态切换的那个元件其他元件的剩余持续时间不动但全局时钟走了一圈之后系统时刻已经变了因此判断某个元件是否处于故障状态、是否还有剩余备用时间都是以当前全局时钟为基准的。写代码时要时刻记得“全局时钟”和“元件自身状态剩余时间”是两套东西混在一起就会导致时序错乱。2.3 故障影响分析谁停电、能不能转供、多久恢复故障影响分析是整段程序里最见功力的地方。逻辑分三步走。第一步故障隔离。系统时间推进到某条馈线故障的时刻程序要找到故障区段两端的开关或者熔断器把它们断开把故障区段隔离出来。这一步决定了停运范围的边界。第二步负荷转移。被隔离区段之外的负荷不一定全停。如果网络里有联络开关、有备用馈线部分非故障区域的负荷可以切换到其他馈线恢复供电。这就是所谓“转供”。“能不能转”取决于网络拓扑约束比如联络容量够不够、接线模式是否允许、自动化开关能否动作。在简化模型里程序要遍历一遍未失电的区段判断它能否通过一个闭合的联络通道从别的电源取电。如果不能转供这些负荷就只能等着修复完成。第三步恢复供电。故障区段本身的修复时间结束后元件状态恢复正常系统把隔离区段重新接回原馈线所有负荷点恢复供电。三种负荷点状态可以对照记录下来第一类故障期间完全不受影响停电次数零、停电时间为零第二类故障后被成功转移到其他馈线停电时长只算转供操作的时间比如0.5小时第三类不能转供必须等待故障元件修复完成停电时间等于修复时间。这样一次故障案例给到每个负荷点一段“停电日志”日志里记录了发生时刻和持续时间后面统计指标时只需要把这些日志汇总即可。对于更复杂的网络比如存在多联络、闭环运行、分布式电源接入的情况故障影响分析还要额外判断出力分布、潮流约束和孤岛运行的可行性。我见过不少程序在这里偷懒直接假设“有联络线就能全转、容量不限”。这种假设在简单测试算例里问题不大放到实际网架上往往会高估可靠性指标、低估停电损失需要特别注意。3. Matlab程序实现全流程拆解3.1 顶层框架与数据结构设计先说我惯用的顶层框架。一个完整的序贯蒙特卡洛模拟程序我习惯拆成五个模块网络数据读取模块、元件状态初始化模块、主模拟循环模块、故障影响分析模块、指标统计与输出模块。五个模块各干各的事调试的时候也能定位问题。Matlab这门语言的特点是矩阵运算强、循环慢所以数据结构的规划要以“减少循环内不必要的重复计算”为原则。我用几个数组分别存放元件列表包含元件编号、上游节点、下游节点、长度/容量、年故障率、平均修复时间节点列表包含节点编号、连接的元件、挂接负荷的峰值和年曲线序号拓扑描述一般是邻接矩阵或者节点-支路关联表。模拟过程中需要频繁判断“故障元件会把哪部分网络隔开”我建议预先做一个“节点到根节点的上游路径表”每次判完上游路径直接查表避免在循环里反复做图的遍历。主循环的伪代码长这样% 初始化 for i 1:N_comp TTF(i) -log(rand) / lambda(i); TTR(i) 0; State(i) 1; % 1正常 0故障 NextEvent(i) TTF(i); end Time 0; % 统计变量清零 while Time Tmax [dt, idx] min(NextEvent); % 找最先切换状态的元件 Time Time dt; if State(idx) 1 % 正常转故障启动故障影响分析 [outage_log, energy_loss] FaultImpactAnalysis(idx, Time); % 累计停电指标 SAIFI_cnt SAIFI_cnt outage_log.count; SAIDI_sum SAIDI_sum outage_log.duration; ENS_sum ENS_sum energy_loss; % 更新状态 State(idx) 0; TTR(idx) -log(rand) / mu(idx); NextEvent(idx) TTR(idx); else % 故障修复恢复 State(idx) 1; TTF(idx) -log(rand) / lambda(idx); NextEvent(idx) TTF(idx); end end这个循环是事件驱动的核心。每轮循环只处理一个元件的一次状态切换其他元件的时间余量保持不变全局时钟往前推进dt。代码量不大但效率很关键元件总数N_comp如果是几百的量级循环几万次Matlab完全扛得住但如果把故障影响分析做成了每次都要全网络重算一遍的暴力程序耗时会呈指数上升。3.2 四个关键子模块的实现细节第一个关键子模块是元件状态抽样。指数分布抽样直接调用上述公式但要注意Matlab里rand生成的是均匀分布随机数取对数前最好加一个很小的下界比如eps防止U0时算出inf。如果要用威布尔分布可以直接调用wblrnd也可以用逆变换法自己写。实际运行中我发现指数分布对于“评估相对可靠性差别”这类问题已经足够除非手中握有大量真实历史数据能拟合出非指数分布否则不建议为了理论完备而把模型搞得过重。第二个关键子模块是故障影响分析。我的实现方式是把网络看成一张无向图故障元件o从图中暂时移除看每个节点能否从电源节点出发到达。用Matlab最顺手的方式是构建稀疏邻接矩阵然后调用graph和conncomp函数进行连通域分析。但每次故障都重新构图太慢所以更高效的技巧是预计算正常状态下的电源可达节点集合故障时只对有影响的区域做局部连通性检查。一个只影响若干节点的局部重排算法可以把单个故障的分析时间压缩到毫秒级。对于自动化程度比较低的网络故障后负荷能否转移常常取决于分段开关位置这部分信息可以写成一张“区段-开关关联表”分析时直接查表。第三个关键子模块是负荷削减与能量损失计算。可靠性指标里停电时间统计不受负荷大小影响但ENS一定要乘上停电期间的平均负荷。也就是说把故障时间段和负荷曲线对齐取该时间段内的负荷期望值再乘以故障持续时间。如果模拟程序里没有负荷曲线只用峰值负荷算恒功率得到的ENS会偏大用于方案对比问题不大用于精确电量损失估算则不准。第四个关键子模块是指标汇总。每轮模拟结束后把累加统计量除以用户总数、模拟年限就得到SAIFI、SAIDI、CAIDI、ASAI和ENS。我通常在最后加一段格式化输出把指标一行一行打在命令窗口同时再生成一张表格存成CSV方便拉数据画曲线。3.3 收敛判据与动态终止机制固定模拟年限最大的问题是不确定够不够。模拟3年得到的结果波动可能很大模拟3万年又明显浪费算力。更专业的做法是使用收敛判据来控制模拟何时终止。在蒙特卡洛模拟中可靠性指标的估计值会随着样本量增加逐渐收敛到真值附近衡量标准是变异系数即样本标准差与样本均值之比。给定一个阈值β0通常取0.02到0.05当指标估计值的变异系数小于β0时就认为结果足够稳定程序自动提前终止。具体到Matlab实现可以在模拟过程中每隔一定周期比如每500个模拟年计算一次当前已累加指标的均值、标准差和变异系数。这里有一个细节由于每轮系统时间的推进间隔并不固定各个事件发生的次数也是随机的所以指标方差不能按最简单的人口统计方差公式硬套更稳妥的做法是把每个负荷点的停电频率、停电持续时间分别记录成独立样本序列再算样本标准差。我的实际程序里给了两个退出条件达到最大模拟年限上限或者满足收敛判据。跑一个中等规模的算例通常在5000到20000个模拟年之间就能收敛到满意的精度。这个范围供参考实际和网络规模、元件故障率水平都有关系。4. 算例实测结果与敏感性分析4.1 基准算例与参数设置为了验证程序的正确性和稳定性我搭了一个经典的配电网测试算例一条10kV馈线由6个主干分段组成分支线上挂着12个配变负荷点。每个负荷点用户数不等从几十户到几百户都有。馈线总长度大约5公里单位长度故障率按每年每公里0.1次设置配变年故障率按0.006次设置。平均修复时间馈线取4小时配变取6小时。联络开关设了两处一处连到相邻馈线一处作为备用电源接口转供操作时间按0.5小时计算。负荷曲线我没有直接用恒定值而是用了一个简化版的日负荷曲线高峰时段9点到12点、18点到21点负荷是峰值的90%到100%低谷时段晚上23点到次日6点只有峰值的40%。这样做的目的就是让序贯蒙特卡洛的“时序”优势真正发挥出来同样的停电事件发生在高峰期和低谷期电量损失差别非常明显。模拟参数方面最大模拟年限我设为50000年收敛阈值β0取0.05每个算例重复运行3次验证稳定性。这个配置在我的普通笔记本上Matlab单次运行耗时大约三到五分钟。4.2 指标计算结果与解读跑完一次完整模拟典型的指标输出大致如下指标计算结果说明SAIFI0.452次/用户·年平均每个用户每年约停0.45次SAIDI2.31小时/用户·年平均每个用户每年停电约2.3小时CAIDI5.11小时/次平均每次停电持续约5小时ASAI0.999736供电可用率接近99.97%ENS1825 kWh/年全年缺供电量约1825千瓦时SAIFI和SAIDI这两个数字放在国内城市配电网水平看算是中等偏好。如果一个网架改造方案能把SAIDI从2.31压到1.8小时那意味着每年可以少停约0.5小时对用户侧来说体感改变很大。程序里的关键价值就在这不是算出一个绝对数字就算完而是能快速对不同方案重复计算做横向对比。有一点要特别提醒这些指标对参数设置极其敏感。如果我把馈线故障率从0.1次/年·公里调到0.15次/年·公里SAIDI几乎线性地跳到3.4小时左右。所以做方案比选时故障率、修复时间这些基础数据一定要从真实运行台账里取至少要做到统一口径否则比出来的差距可能是数据偏差造成的而不是方案优劣造成的。4.3 关键参数敏感性分析到底什么因素主导停电我用控制变量法做了几个敏感性实验还挺有意思。第一个实验调整馈线故障率从0.05到0.2次/年·公里其他参数不变。结果显示SAIDI基本随故障率线性上升馈线故障是系统停电的主要来源。这也符合直觉这么长的架空线路裸露在环境中受天气、树障、外破影响最大。第二个实验调整平均修复时间从2小时到10小时。结果发现SAIDI上升趋势接近线性但CAIDI变化更加显著。修复时间越长一次停电的“伤害”越重。这提示我在规划阶段投钱提升抢修能力、缩短故障修复时间的效果可能比单纯减少故障次数还明显。第三个实验调整联络开关的转供能力。如果转供失败、或者说本来就没有联络开关SAIDI会大幅恶化到4小时以上如果有可靠转供且操作时间短SAIDI能降至1.5小时左右。这说明网架结构对可靠性的影响要超过单个设备的参数变化。做配电网规划时优化分段和联络布局往往比换一茬高可靠性设备更划算。这些规律在传统解析法里也能得到定性的结论但序贯蒙特卡洛能给出定量的数值支撑尤其是配合时变负荷后能进一步区分停电发生在高峰还是低谷这个优势非常实用。5. 常见问题与排查经验实录5.1 模拟结果不收敛、波动太大怎么处理碰到的第一个典型问题是模拟结果波动大比如跑三次模拟SAIDI一会儿2.0一会儿3.0根本没法用。这种情况多数是模拟年限不够或者网络里故障率太低导致故障事件太少。故障率低的好网架经常出现“几千个模拟年才发生一两次故障”的情况事件少自然统计量方差大。解决办法不是单纯拉长模拟年限而是先检查目标指标是否已经满足收敛判据。我建议在程序里实时打印出变异系数的变化轨迹如果发现β一直降不下来优先考虑用方差缩减技术。比较实用的两个手段是对偶变量法即配对使用两组负相关随机序列以及重要抽样法对低概率高影响的故障事件提高抽样频率最后通过权重还原。这两个技巧在Matlab里实现都不算太复杂但能把同等模拟年数下的收敛速度提升数倍。经验之谈如果是做工程项目而不是学术研究变异系数阈值取0.05基本够用如果指标要拿去和外部机构对标甚至用于考核建议把阈值放到0.02以下宁可多跑一些模拟年数也别让人挑出“置信度不够”的毛病。5.2 程序跑得很慢怎么优化加速Matlab跑序贯蒙特卡洛最慢的一定是故障影响分析。我之前用暴力方法每个故障事件都对整个网络做一次完整的图遍历结果模拟5000年要跑一个多小时。后来改成预计算路径表加局部连通性判断单次故障分析时间从几十毫秒降到了零点几毫秒总耗时就降到了几分钟。另一个加速思路是矢量化。主循环里有一些操作可以变成矩阵运算比如批量抽样下一组TTF时不要逐个调用exprnd而是先生成一个随机数矩阵再一起变换。不过要提醒矢量化提高的是代码吞吐率如果网络规模不大收益并不明显反而会让代码可读性变差。我建议先把逻辑写正确再用profiler定位瓶颈不要一开始就为了“快”牺牲可维护性。还有一个小技巧在模拟过程中同一个元件在不同模拟年里的故障时序其实是完全独立的。可以考虑用Matlab的parfor并行计算把整个模拟年限切成若干段分别跑完后汇总指标。在四核机器上加速效果接近三倍逻辑也不复杂。唯一的坑是随机数种子的管理每个worker要分配不同的种子流否则并行出来的结果是重复的指标统计出来会不正确。5.3 随机数种子与结果可复现性做研究的时候最怕程序跑完了结果没法复现。蒙特卡洛模拟天然带随机性如果代码里每轮都用系统时间当种子你这次跑的结果和下次跑的结果必然不一样。审查或者复现时评审人第一个问题就是“你的随机数种子是什么结果能不能稳定复现”。我的习惯是在程序开头设置全局随机数种子比如rng(2024)这样只要代码路径不变、参数不变任何机器跑出来结果完全一致。多组对比实验时每组分配不同的种子序号但固定下来不随便改。这样一个项目跑完所有结果清清楚楚、严丝合缝。另外还要注意Matlab新版本的随机数生成器默认算法是梅森旋转法在统计性质上没问题但如果要做特别严谨的高精度模拟可以引入并行随机数流机制。普通场景下其实不必纠结这个用默认设置就好。5.4 常见问题速查表我在实际开发和带人复现的过程中把踩过的坑和常见问题整理成了一张表症状可能原因解决办法SAIDI比典型值高很多遗漏了负荷转移功能所有非故障区段都按等待修复算检查故障影响分析中的转供逻辑确认负荷转移路径是否生效模拟时间极长无进展故障影响分析里做了全网络重算改用预计算路径表和局部连通性判断两次运行结果差异巨大没有固定随机数种子或模拟年数太少设置rng固定种子延长模拟或使用方差缩减技术ENS异常偏大负荷曲线没对齐直接用了峰值负荷按故障时间段从日负荷曲线上取平均负荷再计算指标指标曲线长时间不收敛网络故障率极低故障事件样本不足提高模拟年限上限或降低收敛阈值必要时改用重要抽样元件编号一变结果就变程序逻辑中隐含依赖元件数组顺序检查所有与数组顺序相关的索引统一用节点/元件编号索引5.5 给初学者的三个避坑建议第一个建议是先从解析法算小算例验证蒙特卡洛结果对不对。拿一个两区段、三个负荷点的辐射网手推一遍SAIFI和SAIDI期望值再拿程序跑一遍两边对得上再往复杂网络扩展。这一步看起来慢实际上最省时间否则等你把大网架写完了才发现计算逻辑有偏差回头排查困难得多。第二个建议是不要迷信教科书里的“模拟年限越大越好”。模拟年限、抽样次数只是手段收敛判据才是终点。我见过有人把模拟年限拉到100万年跑了一个通宵结果发现其实5万年就已经满足0.01的收敛阈值的白白浪费了算力和时间。第三个建议是代码从第一天起就坚持模块化。故障影响分析、指标统计、参数输入这些模块互相独立后你后来想换一种负荷模型、增加一种新能源出力模型都只需要改对应模块不用动主体循环。这个收益在前几个算例时体现不出来项目迭代到第三版第四版的时候你会感谢当初忍住没有乱写一气的自己。结尾一点个人体会这套程序我前前后后改过好几轮从最开始只能跑通一个简单辐射网到后来能处理多联络、分布式电源接入的复杂网架中间踩过的坑大多集中在故障影响分析这一块。最初我用暴力遍历法代码是简单了但模拟速度让人难以接受后来改成预计算拓扑加局部重排效率提升了一个数量级。另一个体会是序贯蒙特卡洛模拟真正的优势不是算一个精确数值而是让你有了一个可以反复做方案对比的工具箱——这套网架结构改动后可靠性提升多少那套调度策略调整后又改善多少全都可以从模拟结果里读出量化答案。最后再分享一个小技巧程序里多留几个观测变量比如每个负荷点的年平均停电次数、每次故障中受影响负荷的用户数这些中间数据在评审、写报告时往往比最终指标更有说服力。希望这篇文章能帮你搭出自己的一套配电网可靠性评估工具也欢迎在实践中遇到具体问题时再来一起交流。

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

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

免费获取报价 →
↑