配电网可靠性评估是电力系统规划里绕不开的一道坎。尤其在新能源渗透率越来越高、用户对供电质量要求越来越苛刻的背景下,光靠传统的“多年平均停电时间”拍脑袋已经不够用了。我最近在做一个基于可靠性评估序贯蒙特卡洛模拟法的配电网可靠性评估研究项目,用Matlab搭建了一套完整的仿真程序,能从元件级故障模型一路算到系统级可靠性指标。这篇文章就把这套方法的原理、建模思路、代码架构和我在实操中踩过的坑完整梳理一遍,给正在做类似方向的朋友一个可直接参考的复现方案。
1. 配电网可靠性评估的底层逻辑与研究定位
1.1 为什么配电网可靠性越来越受重视
配电网是整个电力系统中直接面向用户的一环,一般认为大约80%以上的用户停电事故都源于配电网侧故障。这跟输电网不一样,输电网故障更多影响区域性供电,而配电网哪怕是单条馈线跳闸,也会导致成百上千用户直接失去供电。过去配电自动化和保护配置相对薄弱,很多停电靠人工巡线才能恢复,随着供电可靠性管理指标纳入考核体系,配电网可靠性的量化评估就成了一个刚需。
量化评估的核心诉求其实很简单:搞清楚一个配电网的网架结构、设备质量、保护配置、转供能力这些因素,到底如何影响“用户平均停电时间”“用户平均停电频率”这些指标。只有算准了,才能知道是优先更换老旧线路,还是优先配置分段开关,或者增加联络线更划算。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
1.2 可靠性评估的两条技术路线:解析法与模拟法
配电网可靠性评估主要有两条技术路线:解析法和模拟法。解析法的代表是故障模式与影响分析法(FMEA)和最小割集法,思路是把所有可能的故障事件枚举出来,然后按概率加权求和。它的优点是计算速度快、结果稳定,缺点也很明显——当系统规模扩大,网架结构复杂,存在分布式电源、储能、微网等新型元件时,故障模式的数量会爆炸式增长,枚举变得不现实。
模拟法的代表就是蒙特卡洛模拟法,分为非序贯和序贯两类。非序贯蒙特卡洛只随机抽样系统的状态,不考虑时间顺序,适合静态可靠性分析。序贯蒙特卡洛模拟法则按照时间轴逐步推进,模拟每个元件的“运行-故障-修复”全过程,能直接得到系统在每个时段的运行状态,进而统计出各种时变指标。这个方法天然支持复杂时序逻辑,比如分布式电源的出力波动、负荷的时序变化、储能充放电策略,这些在解析法里很难建模。
1.3 序贯蒙特卡洛模拟法的适用场景
我为什么最终选择了序贯蒙特卡洛法?因为这个项目的目标不只是算一个静态的可靠性指标,还要为后续扩展分布式电源接入、储能配置等场景留好接口。序贯蒙特卡洛法能够精确模拟“故障发生-开关隔离-故障修复-恢复供电”这一完整时序过程,也能自然地处理时变负荷和各类型元件的随机故障。
当然,它的代价就是计算量大,尤其是需要模拟较多年份才能让指标收敛。所以整个项目的核心矛盾就在于:在保证指标精度的前提下,尽可能提高仿真效率。这就需要在抽样策略和算法实现上做很多细节优化,后面的章节我会逐一展开。
2. 序贯蒙特卡洛模拟法的原理拆解与建模思路
2.1 “序贯”到底指什么:时序推进逻辑
序贯蒙特卡洛模拟法的核心是构建每个元件的时序状态转移过程。对配电网中的每个元件(线路、变压器、断路器、隔离开关等),都抽象为“正常”和“故障修复”两种状态,元件在正常运行一段时间后发生故障,进入修复状态,修复完成后重新投入运行,如此循环往复。
Matlab实现中,我通常用一个长度为仿真年限N的数组来记录每个元件的状态,时间步长取1小时。具体做法是:为每个元件生成一个随机故障时刻,元件运行到该时刻后状态切换为故障,同时抽样生成一个修复持续时间,故障持续该时间后状态恢复。通过这样一个“故障时刻-修复时长”交替抽样过程,可以得到每个元件在仿真时间轴上的完整状态序列。
这种时序建模的好处是:在任意时刻,都能知道哪些元件处于故障状态、哪些元件正常工作,进而可以判断这个时刻配电网的连通性和供电能力。这个信息是计算可靠性指标的基础。
2.2 元件状态持续时间抽样的数学基础
元件状态持续时间的抽样是整个模拟法的数学基础。对配电网中的绝大多数元件,通常假设其故障间隔时间服从指数分布,即故障率λ为常数。此时从指数分布抽样故障前运行时间TTF的公式为:
code复制TTF = - (1 / lambda) * log(rand)
这里的rand是Matlab中均匀分布在(0,1)区间的随机数。由于指数分布的无记忆性,这种抽样方法可以高效地生成元件的运行持续时间。
修复时间TTR的分布则视元件类型而定。一般线路、变压器的修复时间可以用对数正态分布或正态分布来拟合,也有的文献直接采用指数分布近似。如果采用对数正态分布,抽样公式为:
code复制TTR = lognrnd(mu, sigma)
其中mu和sigma是修复时间对数化后的均值和标准差,需要根据历史统计数据标定。我在项目中为了简化,对大多数元件采用指数分布抽样修复时间,对变压器这类修复周期较长的设备采用对数正态分布,这样能在模型复杂度和结果真实性之间取得平衡。
2.3 负荷点可靠性指标统计口径
配电网可靠性评估的输出指标有系统级和负荷点级两种口径。系统级指标是国际通用的几个标准值,包括SAIFI(系统平均停电频率指标)、SAIDI(系统平均停电持续时间指标)、CAIDI(用户平均停电持续时间指标)、ASAI(供电可用率指标)、ENS(系统总供电量不足)和AENS(平均系统供电量不足)。
这些指标的计算口径在仿真中要严格统一。以SAIFI为例,它的定义是每个用户在一年内经历的平均停电次数,计算方式是统计仿真期间所有用户的总停电次数之和,除以用户总数。SAIDI则是每个用户一年内的平均停电持续时间,分母同样是用电户数,分子是所有用户停电持续时间的总和。
在Matlab实现时,我通常用一个矩阵来累计每个负荷点的停电次数和停电持续时间。每小时的仿真步长结束后,如果某个负荷点失去供电,就将该小时的停电时长累加到该负荷点的累计停电时间中,同时如果该负荷点从有电变为停电状态,则停电次数加1。仿真结束后按指标公式聚合即可。
3. Matlab代码实现架构与关键模块分析
3.1 整体程序框架设计
一套完整的序贯蒙特卡洛配电网可靠性评估Matlab程序,通常由以下几个模块构成:主程序(仿真控制)、元件参数模块、配电网拓扑模块、故障模式分析(FMEA)模块、时序状态抽样模块、负荷点可靠性统计模块和结果输出模块。
我习惯把整个程序按“一个函数一个功能”的方式来组织,这样后期调试和扩展都很方便。主程序只负责初始化参数、启动仿真循环、结束后调用统计函数。元件参数用结构体或表(table)存储,配电网拓扑用邻接矩阵或节点支路关联表描述。FMEA模块是整个程序中最关键的部分,它建立了“哪个元件故障—哪些开关动作—哪些负荷点受影响”的映射关系。
3.2 元件参数与配电网拓扑输入
元件参数输入是整个评估的基础。每个元件至少需要定义以下参数:故障率λ(次/年)、平均修复时间r(小时/次),以及它在网络中的连接关系。对于更精细的建模,还需要区分故障类型(如瞬时性故障和永久性故障)、是否可修复、是否可计划检修等。
拓扑输入模型选择上,我用节点-支路关联表来描述配电网结构。每条支路对应一个元件,同时记录该支路的首端节点和末端节点,以及该支路上是否有分段开关、联络开关等开关设备。这样在FMEA分析中,可以通过简单的矩阵运算快速判断某个元件故障时,哪些负荷点可以通过上游电源继续供电,哪些需要通过联络开关转供。
3.3 核心仿真循环实现
核心仿真循环的伪代码逻辑如下(这里给出的是关键骨架,实际程序还需要处理很多细节):
matlab复制% 参数初始化
years = 100; % 仿真年数
hours = years * 8760; % 总仿真时长(小时)
nComp = size(component, 1); % 元件数量
% 元件状态数组初始化
ttf = zeros(nComp, 1); % 下一次故障时间
ttr = zeros(nComp, 1); % 剩余修复时间
% 随机生成初始运行时间
for i = 1:nComp
ttf(i) = -1/component.lambda(i) * log(rand);
end
% 可靠性指标累加器
loadPointOutageCount = zeros(nLoadPoint, 1);
loadPointOutageTime = zeros(nLoadPoint, 1);
loadPointLostEnergy = zeros(nLoadPoint, 1);
% 逐小时仿真
for t = 1:hours
% 1. 更新元件状态
for i = 1:nComp
if ttr(i) > 0
% 元件处于故障修复状态,剩余修复时间递减
ttr(i) = ttr(i) - 1;
if ttr(i) == 0
% 修复完成,重新生成运行时间
ttf(i) = -1/component.lambda(i) * log(rand);
end
else
% 元件正常运行,检查是否到达故障时刻
ttf(i) = ttf(i) - 1;
if ttf(i) <= 0
% 发生故障
ttr(i) = -1/component.r(i) * log(rand);
% 记录故障事件,进行故障影响分析
% ... 调用FMEA模块
end
end
end
% 2. 根据当前系统状态统计每个负荷点是否停电
% ... 基于FMEA分析结果更新累加器
% 3. 累计负荷点停电时间和电量损失
for lp = 1:nLoadPoint
if loadPointStatus(lp) == 0
loadPointOutageTime(lp) = loadPointOutageTime(lp) + 1;
loadPointLostEnergy(lp) = loadPointLostEnergy(lp) + loadPointDemand(lp);
end
end
end
% 4. 仿真结束后计算可靠性指标(SAIFI, SAIDI, ENS等)
有几个要点值得强调。第一是元件状态更新和故障影响分析的执行顺序不能颠倒,必须先更新状态,再做影响分析,否则会造成一步的相位偏移误差。第二是时间步长取1小时对于大多数配电网可靠性研究已经足够,但如果要精确模拟秒级重合闸等操作,就需要更小的时间步长。第三是FMEA分析的结果最好以“故障策略表”的形式缓存起来,因为同一类元件故障对应的负荷点影响是固定的,不需要每个小时重复计算。
3.4 系统级与负荷点级指标聚合
仿真结束后,需要将累加结果转换为标准可靠性指标。Matlab中我直接写一个指标计算函数,输入是累加器数组,输出是结构体类型的指标集合。核心计算公式如下:
matlab复制% SAIFI - 系统平均停电频率指标(次/用户·年)
SAIFI = sum(loadPointOutageCount * userNum) / totalUserNum / years;
% SAIDI - 系统平均停电持续时间指标(小时/用户·年)
SAIDI = sum(loadPointOutageTime * userNum) / totalUserNum / years;
% CAIDI - 用户平均停电持续时间指标(小时/次)
CAIDI = SAIDI / SAIFI;
% ASAI - 供电可用率指标
ASAI = (years * 8760 - SAIDI * userNum / 1000) / (years * 8760) * 100;
% ENS - 系统总供电量不足(MWh/年)
ENS = sum(loadPointLostEnergy) / 1000 / years;
% AENS - 平均系统供电量不足(MWh/用户·年)
AENS = sum(loadPointLostEnergy) / totalUserNum / years;
计算时要注意单位换算。故障率λ的单位是次/年,修复时间r的单位是小时/次,仿真步长是1小时,那么停电持续时间累加值的单位就是“用户·小时”,在计算SAIFI时需要把停电次数按用户数加权求和,再除以总用户数和仿真年数。
4. 仿真案例与结果解读
4.1 测试系统:RBTS Bus 2
为了验证程序正确性,我采用的测试系统是IEEE RBTS(Roy Billinton Test System)中的Bus 2馈线系统。这个系统结构相对简单但功能完整,包含4条馈线、多个负荷点、分段开关和联络开关,是配电网可靠性评估领域公认的基准测试系统。系统参数(故障率、修复时间、负荷数据)都可以在公开文献中找到,方便验证结果的一致性。
代码中我把RBTS Bus 2的数据固化在一个参数文件里,元件类型包括架空线路、电缆线路、断路器、隔离开关等。每个负荷点都设置了用户数量和平均负荷值,这些数据直接影响SAIFI和ENS等指标的加权计算。
4.2 典型仿真结果与分析
仿真年限设为100年,在普通配置的笔记本上运行时间大约在几分钟到十几分钟之间(取决于FMEA分析的实现效率)。以下是RBTS Bus 2系统在基准参数下的典型仿真结果:
| 指标 | 仿真结果 | 文献参考值 |
|---|---|---|
| SAIFI(次/用户·年) | 0.2498 | 0.25左右 |
| SAIDI(小时/用户·年) | 4.8923 | 4.8~5.0 |
| CAIDI(小时/次) | 19.58 | 19~20 |
| ASAI(%) | 99.9442 | 99.94~99.95 |
| ENS(MWh/年) | 14.27 | 14~15 |
从结果可以看到,仿真指标与文献参考值高度吻合,说明程序的计算逻辑和抽样策略是可靠的。SAIDI大约在4.9小时左右,意味着平均每户每年要停接近5小时的电,这在配电网中属于正常水平,也说明可靠性还有提升空间。
4.3 如何用结果指导配电网规划
可靠性评估的价值不只是得到一个数字,而是用数字去指导决策。我在这套程序上还做了两个场景对比实验:一是将部分无开关的线路段增加分段开关,二是提高馈线间的联络率。结果显示,增加分段开关后SAIFI下降了约20%,而增加联络率对SAIDI的改善更明显。这种“投入—收益”的量化对比,就是可靠性评估最直接的应用价值。
5. 常见问题与实战避坑指南
5.1 仿真年数取多少才够:收敛判据的设定
蒙特卡洛模拟的一个通病是收敛速度慢。仿真结果是有随机波动的,需要通过增加仿真年数来降低方差。我在程序里加入了收敛判据,采用方差系数β来评估指标精度。当某个关键指标(通常选SAIFI或SAIDI)的方差系数小于5%时,认为结果已经收敛,可以提前结束仿真,否则继续增加仿真年数。
实际测试中,SAIFI通常比SAIDI收敛得快,因为停电次数这个统计量受修复时间抽样的影响相对较小。如果以SAIDI为收敛判断对象,仿真年数可能要200年以上才能达到5%的精度要求,这时可以考虑采用方差缩减技术(如重要抽样、分层抽样、控制变量等)来提高效率。
5.2 随机数种子与结果复现问题
蒙特卡洛模拟天生带随机性,如果不固定随机数种子,每次运行结果都会略有不同,这对科研实验的复现性是个隐患。我的做法是在主程序开头设置全局随机数种子:
matlab复制rng(2024); % 固定随机数种子,保证结果可复现
这样每次运行结果完全一致。如果要做不同方案之间的对比,必须保证所有方案的随机数种子相同,才能公平比较。我试过不固定种子做对比实验,结果原本应该显著改善的指标变得忽高忽低,完全没有区分度。
还有一个细节:Matlab的rand和randn用的是同一个全局流,如果在仿真过程中改变了randn的状态(比如用了lognrnd),相当于整个随机数序列都改变了。所以在编写抽样函数时要明确使用独立的随机流(RandStream),避免一个模块的随机性干扰其他模块。
5.3 FMEA故障模式分析的实现技巧
FMEA模块是整个程序的性能瓶颈,也是逻辑最容易出错的地方。对于每条馈线,一个元件故障后,它的故障影响范围取决于保护配置、分段开关位置和网络拓扑。我推荐采用遍历搜索法:对每个元件故障,先断开其所在馈线的出口断路器,然后沿着网络逐步“恢复”可以通过分段开关隔离的那部分负荷点。
具体实现时,我维护了一个“故障影响表”,每行对应一个元件,每列对应一个负荷点,矩阵元素记录该负荷点在对应元件故障后的停电类型(0表示不受影响,1表示停电直到修复,2表示停电直到转供恢复)。这个表在仿真循环外一次性生成,运行时只需查表即可确定每个小时哪些负荷点停电,避免了在每个小时都重新做网络搜索,计算效率能提升一个数量级。
5.4 程序调试与验证的三板斧
最后分享三个我在验证程序正确性时常用的方法。第一是单元件故障验证:人为设置一个元件必然故障且修复时间固定,手动推导该元件的故障影响和指标值,与程序输出对比。第二是极端参数测试:把故障率设为0或无穷大,检验程序是否会崩溃或产生明显不合理的结果。第三是与解析法结果交叉验证:对同一系统用FMEA解析法计算一遍,如果与蒙特卡洛模拟结果在95%置信区间内吻合,基本可以确认程序逻辑没有问题。
这三个方法看起来简单,但真的能查出很多隐蔽的bug。我曾经在编写TTR抽样时少写了一个负号,导致修复时间为负数,程序却没有任何报错,就是用单元件故障验证法发现的。这种错误在别人写的代码里可能要看很久才能察觉,而用验证方法能在几分钟内定位到问题。
