
简介这是一份面向电力系统研究者和工程师的配电网可靠性评估技术资料聚焦于用蒙特卡洛随机模拟替代传统确定性分析解决负荷波动、设备故障等随机因素导致评估偏差的问题。PDF详细介绍了蒙特卡洛法在配电网评估中的原理、评估步骤、优缺点及结论并附有Matlab代码实现思路适合需要开展可靠性量化分析、方案比选或电网规划设计的读者参考。资源为1个PDF文件整体约174KB内容紧凑、结构清晰便于快速查阅方法框架和核心流程。目前已有20人学习浏览可作为配电网可靠性评估方向入门或方法对比的实用参考资料。借助文中给出的评估目标确定、随机变量建模、抽样仿真与指标统计等完整流程读者能够理解蒙特卡洛法在电力系统中的应用方式并为后续编写或改进评估程序提供理论支撑。1. 蒙特卡洛法实现配电网可靠性评估为什么不是把故障率代公式那么简单配电网可靠性评估是个典型的小概率大影响问题一条馈线一年一般就发生几次故障而恰恰是那几次故障决定了用户的停电感知。很多人听说“基于蒙特卡洛法实现配电网可靠性评估”以为把故障率代入公式求期望即可等到动手才发现难点全在故障事件序列、修复时长和联络开关转带这些时序环节上。蒙特卡洛法其实是在做一件事把配电网里每个元件的随机停运过程大量重复抽样统计出SAIFI、SAIDI等可靠性指标。它不挑拓扑复杂度放射状、环网、含分布式电源的网络都能用适合配网规划运维人员做方案对比也适合刚接手可靠性仿真任务的工程师。2. 可靠性指标、元件停运模型与拓扑影响仿真前先立住这三块地基很多仿真代码写不下去不是卡在语法而是卡在“不知道算什么”和“不知道影响谁”。这一章先把指标、元件模型、拓扑关系三块地基铺好后面代码才接得住。2.1 SAIFI、SAIDI、CAIDI与ENS指标口径先统一配电网可靠性指标的核心只有几个但口径差异很大。最常用的五个如下指标中文名计算口径单位SAIFI系统平均停电频率用户停电总次数 / 用户总数次/(用户·年)SAIDI系统平均停电持续时间用户停电总时长 / 用户总数小时/(用户·年)CAIDI用户平均停电持续时间用户停电总时长 / 停电总次数小时/次ASAI平均供电可用率(8760 - SAIDI) / 8760无量纲ENS期望缺供电量各负载点停电电量之和kWh/年SAIDI分母是“用户总数”CAIDI分母是“停电用户总次数”数值上满足CAIDI SAIDI / SAIFI。这个关系可以用来做代码自检如果聚合算出来的三个指标不满足这个等式那多半是停电次数或停电时长的统计逻辑有错。另一个必须提前定的事是“瞬时停电”算不算进指标。自动化开关动作后重合成功、十几秒就恢复送电这类事件在不少统计口径里不计入SAIFI但部分评估方法会单列。在做蒙特卡洛仿真前先把要采用的口径写进代码注释否则后面换个人读代码指标含义就变了。2.2 元件两状态模型故障率、修复时间与事件抽样配电网里的馈线段、配电变压器、断路器、隔离开关可靠性建模时基本都简化成两状态正常、故障。元件由正常转为故障的速率由故障率λ决定单位为次/年由故障转为正常的速率由平均修复时间μ决定单位为小时。整个过程看成两个独立抽样的叠加。在序贯蒙特卡洛里真正用的是“下一次故障间隔”的抽样。两状态模型下元件正常运行时长服从指数分布抽样公式为T -ln(U) / λU是(0,1)区间均匀随机数λ是年故障率。修复时长同理以μ为均值做指数抽样也可以把μ/8760换算成年保持时间轴单位一致。指数分布的好处是“无记忆性”用起来简单缺点是没法刻画设备老化。手头若有设备投运年限和往年故障统计改用威布尔分布拟合更贴近实际但参数估计成本高一般工程评估用指数分布就够了。解析可靠性方法通常直接用λ和μ求期望值而蒙特卡洛法把这些参数变成分布每次抽样得到的具体时间点都不同。多跑几千次后统计均值会收敛到解析结果。这个特性决定了蒙特卡洛法在复杂拓扑和时序恢复策略下更有优势也为后续验证代码正确性提供了对照基准。2.3 上游故障与分支故障怎么区分拓扑影响矩阵配电网多为放射状故障影响范围有一条铁律主干线某处故障影响的是该处下游的负荷分支线故障影响的只有该分支末端馈线出口或母线故障整条馈线全部停电。恢复方式也得区分能通过联络开关转带的负荷停电时间是“隔离切换”不能转带的末端负荷停电时间是“故障元件修复”。这里最关键的工程决策是“元件-负载点影响矩阵”。矩阵行是负载点列是元件第i行第j列的值表示元件j故障时负载点i停多久。取值常见为三种0表示不受影响1表示经历切换时间即可恢复2表示要等故障修复。影响矩阵不是手写的而是从网络拓扑中“元件所在层级”和“负载点所在层级”自动生成这样一改网架矩阵自动变不会被硬编码绕进去。联络开关能不能转带除了拓扑上有通路还要看联络线载流量和对侧变压器剩余容量。典型错误是只按拓扑连通性判断可转带导致仿真里一切故障都能切负荷SAIDI乐观到失真。实际项目里我会在生成影响矩阵后再跑一遍转带校验把容量不够的负载点强制置为不可转带。3. 用Matlab实现序贯蒙特卡洛仿真故障事件生成与指标聚合的完整代码这一章直接给代码。Matlab实现这套评估我习惯拆成五个模块元件事件生成、影响矩阵构建、负载点状态累积、指标聚合、主脚本。模块按“数据→仿真→输出”解耦改网络拓扑时不需要动主流程。3.1 序贯蒙特卡洛与非序贯蒙特卡洛为什么配电网选序贯蒙特卡洛分两大流派。非序贯法也叫状态抽样法每次抽样确定每个元件处于正常还是故障把所有元件状态组成一个系统状态然后评估影响。它不关心时间顺序也没法精细刻画“隔离故障后先恢复上游、再转带下游”的时序动作适合输电网层面快速粗算。序贯蒙特卡洛沿时间轴推进每个元件按指数分布生成故障与修复事件序列合并成系统事件表后逐个事件更新负载点状态。配电网恢复策略本质上是时序动作联络开关的投切次序直接影响停电时长所以配电网可靠性评估我基本只用序贯法。代价是计算量偏大但代码写成纯向量化加并行后1000年仿真在普通台式机上也就几分钟到十几分钟。3.2 生成元件故障事件序列指数分布抽样与累积下面这段代码生成单个元件一整年的故障-修复事件列表是整个仿真的时间轴基础。function events genComponentEvents(lambda, mttr, nYears) % 生成单个元件的故障事件序列 % lambda: 故障率次/年 % mttr: 平均修复时间小时 % nYears: 仿真年数 rate 1 / lambda; % 平均无故障工作时间(年) meanRepair mttr / 8760; % 平均修复时长(年) nMax ceil(nYears * lambda * 3) 100; ttf exprnd(rate, nMax, 1); % 正常运行持续时长 ttr exprnd(meanRepair, nMax, 1); % 故障修复时长 failMoment cumsum(ttf ttr); % 每次故障起始时刻 events []; for k 1:nMax if failMoment(k) nYears break; end events [events; failMoment(k), min(ttr(k), nYears - failMoment(k))]; end end逻辑说明exprnd(rate, nMax, 1)生成的是均值为rate的指数分布随机数不是概率密度rate 1/lambda是把故障率换成平均无故障时间这个“取倒数”是初学者的第一大坑。cumsum(ttf ttr)把“正常运行→故障修复”当成一个周期不断累加得到的就是每次故障发生的绝对时刻。循环里检查事件起点是否超过仿真总时长防止越界。参数说明lambda如果是0.1次/年rate就是10年平均每10年一次故障mttr取5小时换算成年约0.00057年。nMax取lambda * 3 100是经验值保证预分配的随机序列足够覆盖仿真区间又不会浪费太多内存。事件矩阵第一列是故障开始时刻第二列是持续时长单位都是年后续所有时间运算统一用年为单位。3.3 元件-负载点影响矩阵拓扑关系是怎么进代码的拿到每个元件的事件表后还得知道它故障时哪些负载点遭殃。影响矩阵从拓扑层级自动生成function impactMatrix buildImpactMatrix(branchLevel, loadLevel, switchable) % branchLevel: 元件所在层级1为主干首段 % loadLevel: 负载点所在层级 % switchable: 负载点可否通过联络开关转带 nBranch length(branchLevel); nLoad length(loadLevel); impactMatrix zeros(nLoad, nBranch); for i 1:nLoad for j 1:nBranch if branchLevel(j) loadLevel(i) if switchable(i) impactMatrix(i, j) 1; % 只经历隔离和切换时间 else impactMatrix(i, j) 2; % 需要等故障元件修复 end elseif branchLevel(j) loadLevel(i) impactMatrix(i, j) 2; % 供电路径元件按修复时间计 end end end end逻辑说明放射状网里“元件层级小于负载点层级”表示元件位于负载点上游。此时若负载点可转带故障隔离后就能恢复供电计入切换时间若不可转带只能等故障元件修复。元件层级和负载点层级相等时说明该元件就是负载点的直接供电路径停运时长按修复处理。参数说明switchable在简单模型里是0/1向量实际工程从网架结构导出联络关系后还要结合线路载流量和变压器剩余容量做校验容量不足的负载点要手动或自动置0。层级编号记住一个原则离电源点越近层级越小方向错了整个影响矩阵的上下游关系就反了结果会完全失真。3.4 指标聚合主脚本从事件表到SAIFI/SAIDI主脚本把各模块串起来。核心函数如下function [SAIFI, SAIDI, CAIDI, ASAI] aggregateMetrics(eventsCell, impactMatrix, customers, switchTime) nLoad length(customers); nBranch length(eventsCell); freqPerLoad zeros(nLoad, 1); durPerLoad zeros(nLoad, 1); for j 1:nBranch ev eventsCell{j}; if isempty(ev), continue; end for e 1:size(ev, 1) affected find(impactMatrix(:, j) 0); for i affected. freqPerLoad(i) freqPerLoad(i) 1; if impactMatrix(i, j) 1 durPerLoad(i) durPerLoad(i) switchTime(i) / 8760; else durPerLoad(i) durPerLoad(i) ev(e, 2); end end end end totalCustomers sum(customers); SAIFI sum(freqPerLoad .* customers) / totalCustomers; SAIDI sum(durPerLoad .* customers) / totalCustomers * 8760; CAIDI SAIDI / SAIFI; ASAI (8760 - SAIDI) / 8760; end逻辑说明freqPerLoad和durPerLoad按负载点累计停电次数与停电时长。影响矩阵值为1时累加switchTime换算成年的值值为2时累加事件表中的修复时长。SAIDI最后乘以8760是因为内部时长以年为单位而对外输出指标的习惯单位是小时。CAIDI SAIDI / SAIFI是对前面指标关系的利用也可以当成自检项。参数说明switchTime是每个负载点对应的联络开关操作时间一般0.5到2小时具体看调度流程和现场自动化水平。customers是各个负载点下的用户数注意这里用的是“户数”口径不是变压器容量。若拿不到分台区户数按容量折算要写进报告备注否则SAIFI和SAIDI会跟统计年报对不上。4. 参数怎么给才靠谱故障率、修复时间与仿真年数的工程化取值代码能跑通只算一半。参数给得对不对直接决定结果有没有参考价值。这一章给常用参数范围和收敛判定方法。4.1 元件参数参考表与单位换算元件类型故障率参考范围平均修复时间备注10kV架空线路0.05~0.2 次/(km·年)4~8 h裸导线偏高绝缘导线偏低10kV电缆线路0.02~0.06 次/(km·年)8~12 h故障定位和电缆头制作耗时配电变压器0.005~0.02 次/台·年6~10 h严重时直接更换断路器/负荷开关0.002~0.01 次/台·年2~4 h主要是拒动、误动联络开关操作时间无故障率含义0.5~2 h/次调度下令加现场操作这些参数不是拍脑袋来源是历年运检统计和可靠性月报。新线路没历史数据时取同区域同类型线路的平均值。最容易翻车的是单位线路故障率必须乘线路长度某条10kV架空线单段报0.06次/年那是整条线长度归一后的结果拿它当每公里故障率填进去一个3公里的馈线段就会差出50倍的故障概率。我见过不少初版仿真结果SAIFI低得离谱最后定位到是“每百公里年故障率”直接填到了“每公里年故障率”里。单位换算这种事代码里最好统一写成lambdaPerKm * lengthKm不要把已经乘好长度的数字再当参数传进去。4.2 仿真年数与收敛判定200年起步1000年出数蒙特卡洛的结果误差随仿真年数的平方根下降。要把相对误差从20%压到10%仿真量要乘4倍。所以仿真年数不值得一上来就拉满更高效的做法是分级第一步用200年跑通全流程确认指标量级正常顺便检查有没有NaN或明显的累积错误。第二步看累计均值曲线把每年的SAIDI输出后做cumsum再除以年份序号得到累计均值序列。如果曲线尾部还在明显爬升或下坠说明事件样本不足加到1000年如果曲线已经平缓保持1000年做正式结果。第三步用5个不同随机种子各跑1000年取均值和标准误比单独跑5000年更有价值因为它同时给出置信区间。快速判定收敛的代码cumMean cumsum(annualSAIDI) ./ (1:nYears); tailMean mean(annualSAIDI(end-499:end)); headMean mean(annualSAIDI(1:500)); isConverged abs(tailMean - headMean) / abs(headMean) 0.02;逻辑说明annualSAIDI是每年一个指标的向量。头部500年均值和尾部500年均值相对偏差小于2%就认为分布稳定。这个标准是经验值正式报告里可以放宽到5%但代码逻辑不变。注意这个检查只盯着“均值稳不稳”不保证“分布的尾部稳不稳”对配电网来说长尾部分往往是看电压越限和极端事件的所以需要另外看频数直方图不能只看收敛判据这一个数字。4.3 参数敏感性分析改哪个参数边际收益最高同一次仿真多跑几组参数能直接回答“是降故障率划算还是加速抢修划算”。常见做法是以基准参数为起点每次只动一个参数比如线路故障率降20%、修复时间降20%、切换时间降50%然后看SAIDI变化多少。参数改动对SAIDI的影响工程对应措施线路故障率降低20%按比例下降线性明显架空线绝缘化、通道清理平均修复时间降低20%对不可转带负荷段影响大抢修驻点、备品备件切换时间从2h降到0.5h对可转带负荷段影响大配电自动化、开关遥控新增一条联络线末端负荷受益显著网架结构优化敏感性分析的价值在于投资排序。某公司曾做过类似分析发现切换时间砍掉一半比故障率降两成带来的SAIDI改善还大于是把投资重点从线路改造转向配电自动化。这类结论光靠堆高仿真精度得不出来必须配合参数扫掠。做扫掠时每个参数组合都要固定随机种子否则参数间差异会被蒙特卡洛噪声淹没白跑。5. 配电网可靠性评估的五个常见坑与排查思路蒙特卡洛可靠性评估本身不复杂我调模型多年遇到的问题大多不在算法而在建模假设。下面五条是从实际调试经验里沉淀下来的高频踩坑点按“现象→原因→解决”展开。5.1 修复时间与切换时间混用SAIDI系统性失真现象仿真出来的SAIDI跟实际统计值差出三四倍要么过大要么过小而且无论怎么调故障率都拉不回来。原因模型把所有故障都按“完整修复时间”计则通过联络开关转带的负荷被多算了好几小时反过来把所有故障都按“切换时间”计则等修复才能送电的末端负荷被严重少算。两者混在一起时结果基本不可用。解决拓扑分层时明确三类负载点——故障元件上游隔离后立即恢复、可转带下游切换后恢复、不可转带下游等修复。影响矩阵中分别用0、1、2标记。修好后一定要复查转带后联络线路过载导致拉路限电的部分要额外计一段停电时间这层约束不加结果就偏乐观。5.2 随机数种子不固定两次运行结果对不上现象同一套网络和参数跑两次SAIFI差出10%改一行无关代码再跑又变了根本没法判断参数调整是否有效。原因Matlab默认随机流每次启动都不同代码里只要用了rand、randn或exprnd结果天然不可复现。这不是算法问题是实验设计问题。解决主脚本开头先用固定种子做冒烟测试正式仿真把多个种子写成数组每个批次的种子写进日志。最简单的习惯是rng(2024);逻辑说明固定一个种子能让排错阶段的每一次运行结果完全一致做到“改参数只看参数影响”。正式出数时再放开到多个种子取平均两个阶段分开处理不要从头到尾只用一个种子。5.3 用户数口径不一致SAIFI和SAIDI失真现象某个负载点下的用户数填的是变压器台数或容量最后SAIFI偏小SAIDI偏大跟营销系统的户数口径对不上。原因可靠性指标里的“用户”是计量户数不是变压器台数。一个大工业用户按容量折算可能是几十户但实际就是一个计量户一个居民台区可能一台变压器带几百户。混用后指标完全失去可比性。解决代码里把customers户数和loadPower负荷功率分成两个字段SAIFI/SAIDI用前者ENS用后者。拿不到分台区户数时按容量折算可以但一定要在报告里写清“用户数按容量比例折算”否则数据使用者会误解量级。5.4 只按拓扑连通性判断可转带SAIDI过度乐观现象加了联络开关后仿真结果显示SAIDI大幅改善各路方案都靠新增联络线取胜但实际运行中合上联络开关就过载跳闸。原因拓扑有通路不等于可转带。联络线路的载流量、对侧主变剩余容量、末端电压偏差共同决定能转带多少负荷。这些约束没进模型仿真就会把每条联络线都当成无限容量。解决影响矩阵生成前做一次转带可行域校验。简单做法是遍历每个可转带负载点累加转带路径上的负荷总量超过线路载流量或主变N-1校核就置为不可转带更精确的做法是调用一次潮流校验。校验粒度要细到“某条联络开关支路”不能整个网络给一个统一开关。5.5 相邻两次事件被重复计数停电频次虚高现象某个负载点一年统计出30多次停电明显多于实际抢修记录。仔细看事件表发现两次元件故障时间只差几分钟负载点一直在停电却被记成两次独立停电。原因元件故障时间相近时影响矩阵按“每起事件独立计数”累加。比如主线段故障抢修到一半分支线又故障两条故障对同一个负载点造成的停电时段重叠但频率被算成两次。双回线路、同塔双回尤其容易触发。解决把负载点状态改成“状态机”而不是简单累加。实现方法是先把所有事件按开始时间排序合并区间重叠的停电时段合并成一段合并后再计数。Matlab里可以直接用事件起始时间排序后检查区间交叉也可以用bufferduration思路维护一个当前停电结束时间的变量新事件只有在其开始时间晚于当前结束时间时才计一次新停运。6. 让结果快速收敛方差缩减、并行加速与结果验证的三个抓手蒙特卡洛最怕方差大。仿真年数加码只是一条路这一章给更聪明的做法以及验证结果能不能信的办法。6.1 方差缩减用对偶变量法快速排错对偶变量法在不增加样本量的前提下降低方差。做法是对同一个U同时生成两个负相关的随机数-ln(U)/λ和-ln(1-U)/λ。两个事件序列在统计意义上等价但协方差为负配对取平均后方差变小。用对偶变量法配合100年仿真能快速检验模型有没有低级错误相当于先用低成本跑通逻辑再上大量仿真。注意正式出报告时对偶变量只做辅助校核主力结果还是靠独立随机种子。6.2 多种子并行parfor跑不同随机种子多个随机种子之间完全独立这是天然适合并行的场景。Matlab里用parfor代替for循环即可parpool local 4; parfor k 1:5 rng(seeds(k)); [SAIFI(k), SAIDI(k)] simulateOneRun(sysData, nYears); end meanSAIFI mean(SAIFI); stdSAIFI std(SAIFI) / sqrt(5);逻辑说明每个worker处理一个随机种子互不干扰。std(SAIFI)/sqrt(5)是均值的标准误用它画误差棒能直观展示仿真的统计不确定性。注意parfor体内的函数要能独立读取全部拓扑数据不要依赖工作区里的动态变量否则容易退化成串行或报错。6.3 结果验证的三个抓手先对拍再对照最后做极端测试第一个抓手是解析对拍。把网络缩到“一台变压器带一个负载点”的简单系统用解析公式算期望停电次数和期望停电时长再和仿真结果对比误差超过1%就说明随机数生成或事件累积逻辑有bug。第二个抓手是历史数据对照。拿某个已运行馈线的真实可靠性年报把当年的故障率和修复时间填进模型看SAIFI和SAIDI是否落在历史值±20%区间内。对不上就先查参数再查拓扑。第三个抓手是极端场景测试。把所有元件故障率翻倍SAIFI理论上应近似翻倍修复时间不变时SAIDI也应近似翻倍把联络开关全部设为不可用SAIDI必须显著增大。这种不依赖精确数据的逻辑测试能快速暴露结构性错误。我自己早期做这块时最深的教训是先花大量时间抠故障率参数精度结果影响矩阵的层级关系是反的整套仿真成了黑匣子怎么看怎么合理跟真实数据一比就露馅。后来养成“先对拍、再对照、最后极端测试”的习惯返工率明显下降。希望这篇基于蒙特卡洛法实现配电网可靠性评估的实战笔记能帮到你。本文还有配套的精品资源点击获取