1. 为什么配电网可靠性评估要把分布式电源算进去
先说一个我早年踩过的认知误区。当时我刚接触配电网可靠性分析,用的是传统配电系统可靠性评估那套思路,认为分布式电源(DG)接入以后,无非就是在原来的负荷点上多了一个电源,计算可靠性指标时把它当成一个“额外的发电容量”就行。结果做出来的评估结果和实际运行情况差得离谱——明明是同一段馈线,DG接入前后,系统平均停电频率指标(SAIFI)和系统平均停电持续时间指标(SAIDI)的理论计算值和实测值对不上,而且差的方向都不是固定的,有的场景算出来比实测好,有的场景比实测差。后来我才意识到,分布式电源在配电网里的角色根本不是“多了一台发电机”那么简单,它会改变整个网络的故障潮流方向、保护配合策略、孤岛运行方式,甚至会影响故障后的恢复路径。
先把这个问题的本质说清楚。传统配电网是单电源辐射状结构,电能从变电站母线单向流向负荷,可靠性评估的核心逻辑就是“沿着供电路径逐级累加故障率和故障时间”。这个逻辑在无源配电网里是成立的,因为每一段线路、每一个开关、每一台变压器的故障都只影响它下游的负荷,评估模型可以按树状拓扑逐层计算。但DG接入之后,网络变成了多电源结构,任意一个负荷点可能同时从系统主电源和DG获得供电,一旦上游发生故障,DG可能继续供电,形成计划孤岛或非计划孤岛——这时候负荷点是否停电、停电多长时间,不再只取决于“上游设备是否故障”,还取决于“DG能否成功孤岛运行”“孤岛范围怎么划分”“孤岛内的功率是否平衡”等一系列新变量。
所以,含DG的配电网可靠性评估,本质上是把“配电网可靠性分析”和“分布式电源运行特性建模”两个问题耦合在一起求解。这不是简单的叠加,而是要在传统可靠性评估框架里引入DG的出力不确定性模型、故障后的孤岛划分策略、保护与备自投的配合逻辑、以及各类开关设备在故障隔离和恢复中的动作时序。下面我把整个研究思路和Matlab实现过程拆开来讲,包含我从建模到仿真的完整链路,以及踩过的几个关键坑。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 可靠性评估指标体系的选取:别只盯着SAIFI和SAIDI
2.1 传统三大指标在新的评估场景下够不够用
做配电网可靠性评估,绕不开IEEE Std 1366标准里的那套指标体系。SAIFI、SAIDI、CAIDI(用户平均停电持续时间指标)、ASAI(供电可用率指标)这四个指标是行业通用的,几乎所有论文和工程报告都会用到。这套指标的物理含义很清楚:
- SAIFI = 用户总停电次数 / 用户总数,反映停电频率;
- SAIDI = 用户总停电持续时间 / 用户总数,反映停电时长;
- CAIDI = 用户总停电持续时间 / 用户总停电次数,反映单次停电的平均修复时长;
- ASAI = 用户总供电小时数 / 用户总需求小时数,反映供电可用率。
但在含DG的场景里,只算这四个指标会掩盖很多信息。举一个我实际遇到的情况:某个10kV馈线末端接了一个光伏DG,上游变电站母线故障,故障隔离后,DG带着馈线后半段形成孤岛运行了2小时,然后由于光照下降,孤岛内功率不平衡,末端负荷最终还是停电了1小时。用传统指标统计时,末端负荷被记作“停电1小时”,SAIDI只增加了1小时;但如果用孤岛内供电时间作为分母,DG实际为这个负荷提供了2小时的供电服务,这2小时的价值在SAIFI/SAIDI里完全体现不出来。反过来,如果DG孤岛运行失败,原本故障隔离后可以恢复的负荷全部停电,SAIDI会显著恶化。
所以我在Matlab代码里不仅实现了传统四大指标,还额外实现了几个面向DG场景的扩展指标:
| 指标名称 | 缩写 | 计算公式 | 在DG场景中的作用 |
|---|---|---|---|
| 分布式电源供电可用率 | DG-ASAI | DG实际供电时间 / 总评估时间 | 衡量DG孤岛运行的贡献 |
| 孤岛成功供电率 | ISSR | 孤岛成功运行次数 / 孤岛尝试次数 | 衡量孤岛策略的有效性 |
| 缺供电量 | ENS | 负荷点缺供电量之和(kWh) | 评估停电的经济损失 |
| 平均供电可用率指数 | AENS | ENS / 用户总数 | 衡量单位用户的缺电严重程度 |
尤其是ENS(Expected Energy Not Supplied,期望缺供电量),在含DG场景里特别关键。因为DG的出力具有随机性,孤岛运行期间可能出现“部分时段供电、部分时段缺供”的情况,SAIDI只能反映停电时间长短,ENS才能反映停电期间到底损失了多少电量。我在代码里用故障持续时间乘以负荷功率再折算DG出力曲线,逐时段累加得到ENS,这个指标也是后续做DG容量配置优化时的目标函数之一。
2.2 负荷点和系统级指标的聚合逻辑
写代码时容易犯的一个错误是“用户数”的处理。IEEE标准里的用户数是指连接到配电网的终端用户数量,不是负荷点的数量,更不是馈线数。一个负荷点可能包含多个用户(比如一台配电变压器下挂了几十户居民),在计算SAIFI时,分子是“所有用户停电次数之和”,分母是“总用户数”,所以必须给每个负荷点配置“用户数”参数,不能默认所有负荷点用户数相同。
我这里实现的聚合逻辑分两层:
第一层,负荷点级指标。对每个负荷点,遍历所有故障事件,统计该负荷点在评估周期内(通常取一年,8760小时)的停电次数和停电持续时间。停电持续时间的计算要考虑故障隔离时间和故障修复时间,实际是一个分段函数:如果故障在上游且DG可以孤岛供电,停电持续时间 = 开关倒闸时间(如果存在短时停电)+ 孤岛失败后的缺供时间;如果无法孤岛供电,停电持续时间 = 故障修复时间。
第二层,系统级指标。将负荷点指标按用户数加权汇总,得到系统级SAIFI、SAIDI、CAIDI、ASAI、ENS。这里有个细节:如果某个负荷点的失电时间中包含孤岛供电时段,那么该时段的停电次数记不记入SAIFI?标准做法是:如果负荷经历了“停电-孤岛供电-再停电”的过程,首次停电视为一次停电事件,孤岛供电期间的停电不算新增停电次数,因为用户侧可能感觉不到停电(如果孤岛切换够快)。但如果孤岛切换过程中负荷断电了,即使时间很短(几秒钟),也应计入一次停电事件。在Matlab时序仿真中,我会给每个负荷打上“是否经历短时停电”的标记,这个标记由孤岛切换策略和开关动作时间共同决定。
3. 分布式电源的出力随机性建模:光伏、风电和储能的一次系统级建模思路
3.1 光伏出力建模不能只用一个恒定功率
很多初学可靠性评估的人喜欢把DG的出力设成额定功率的固定百分比,比如“光伏出力取额定值的80%”,然后整个评估周期都用这个值。这样做出来的结果只能算“确定性评估”,不是可靠性评估里真正关心的“概率性评估”。光伏出力的核心特征是其波动性,而波动性恰恰是影响孤岛运行成功率的关键因素——孤岛内的电源出力小于负荷需求,孤岛就维持不住。
我在代码中采用的方法是:用一年8760小时的光照强度时序数据,配合光伏出力模型来计算每个小时的DG最大可用出力。光照数据可以从典型气象年数据(TMY)中提取,也可以使用Beta分布拟合每个时段的光照概率密度,再通过蒙特卡洛抽样生成时序场景。这里给出我用的一个简化但足够工程精度的模型:
code复制光伏出力P_pv(t) = η_pv * S_area * Irradiance(t) * (1 - 0.005 * (T_cell(t) - 25))
其中,η_pv是光伏组件的光电转换效率,S_area是光伏阵列总面积,Irradiance(t)是t时刻的太阳辐照度(kW/m²),T_cell(t)是电池板温度(摄氏度)。温度项是很多人容易忽略的,光伏组件温度升高会导致输出功率下降,典型温度系数是-0.5%/℃,夏季高温时同一辐照度下出力可能比标准工况低8%~10%。这个影响在评估夏季高峰负荷时的孤岛供电能力时非常明显。
对于辐照度数据的模拟,我在Matlab中用了两种方式:
- 方式一:直接读取外部辐照度时序数据(如CSV格式的8760行数据),这种方式数据真实,适合精确评估某个实际地理位置的DG出力。
- 方式二:采用Beta分布对每个时段(比如每小时)的辐照度进行随机抽样,参数由实测数据的均值和方差估计,适合做蒙特卡洛大规模场景模拟。
实际评估时建议两种方式结合:先做确定性基准场景(使用平均辐照度曲线),再做随机场景集(如1000个场景),统计出力的概率分布,这样可以同时得到可靠性的期望值和风险区间。
3.2 风电出力的威布尔分布拟合与时间序列生成
风电出力的不确定性比光伏更复杂,因为风速的波动更剧烈,且风电机组的出力-风速关系是分段函数:
code复制P_wind(v) =
0, v < v_cut_in
P_rated * (v - v_cut_in) / (v_rated - v_cut_in), v_cut_in <= v < v_rated
P_rated, v_rated <= v < v_cut_out
0, v >= v_cut_out
其中v_cut_in是切入风速(典型值3 m/s),v_rated是额定风速(典型值12 m/s),v_cut_out是切出风速(典型值25 m/s)。风速分布通常用两参数威布尔分布描述,概率密度函数为:
code复制f(v) = (k/λ) * (v/λ)^(k-1) * exp(-(v/λ)^k)
k是形状参数,λ是尺度参数。在Matlab中用wblfit函数可以直接对历史风速数据拟合这两个参数,再用wblrnd生成风速随机样本。但是直接独立抽样每个小时的风速会丢失时间相关性——真实风速是连续变化的,上午10点的风速大概率与上午9点接近,而不是完全随机的。所以我在代码里加入了一阶马尔可夫链来处理风速的时序相关性:把风速划分成若干个状态区间(比如0~1 m/s、1~2 m/s、……),统计相邻时刻风速状态的转移概率矩阵,然后按转移矩阵生成时序风速序列。这个方法虽然增加了代码量,但生成的风速时序明显更接近真实气象过程,做孤岛功率平衡校核时不容易得出过于乐观的结果。
3.3 储能系统在可靠性评估中的建模关键:荷电状态约束
如果配电网里接了储能系统(ESS),评估模型必须把储能的充放电约束考虑进去,否则孤岛供电持续时间会被严重高估。储能建模需要四个参数:额定容量E_ess(kWh)、最大充放电功率P_charge_max/P_discharge_max(kW)、初始荷电状态SOC_0、以及充放电效率η_ch/η_dis。
在孤岛运行期间,储能放电需要满足:
code复制SOC(t) = SOC(t-1) - P_discharge(t) * Δt / η_dis
SOC_min <= SOC(t) <= SOC_max
P_discharge(t) <= P_discharge_max
我见过不少论文把储能当成“无限容量电源”来算,得出的可靠性指标好得不真实。工程实际中孤岛运行的持续时间往往受限于储能容量——光伏在夜间出力为零,风电出现无风时段时,孤岛只能依赖储能放电,一旦SOC降到下限,孤岛立刻失效,负荷恢复停电。所以在我的Matlab代码里,孤岛策略模块会实时跟踪SOC状态,当SOC低于设定阈值(比如20%)且DG出力无法满足负荷时,发出孤岛失败信号,并把孤岛失效时刻记录为该负荷点的停电起始时刻。
另外,储能还有一个隐性作用:平抑DG出力波动。即使在非故障时段,储能也可以通过削峰填谷减少馈线过载风险,但这部分收益属于经济性优化范畴,在可靠性评估中通常不直接建模,而是通过减少“因过载而主动切除负荷”的事件间接体现。如果你做的是可靠性-经济性联合评估,建议把储能参与调峰的策略也纳入评估框架。
4. 配电网拓扑建模与故障模式影响分析(FMEA)的实现细节
4.1 用节点-支路模型描述配电网结构
可靠性评估的第一步是建立配电网拓扑的数学描述。我在Matlab中使用结构体数组或表格(table)来定义网络元件,每个元件至少包含以下字段:
- 元件类型(线路、变压器、断路器、隔离开关、熔断器、负荷、DG、储能)
- 起始节点和终止节点
- 额定容量
- 故障率(次/年)
- 平均修复时间(小时/次)
- 是否可操作开关(用于故障隔离和恢复)
- 所连接的负荷点
例如,一个简单的辐射状馈线可以这样定义:
matlab复制% 节点定义
nodes = {'N1','N2','N3','N4','N5','N6'};
% 分支定义:类型, 起始节点, 终止节点, 故障率(次/年), 修复时间(h), 是否可控开关
branches = {
'Line', 'N1', 'N2', 0.10, 5, false;
'Line', 'N2', 'N3', 0.08, 4, false;
'Line', 'N3', 'N4', 0.06, 3, false;
'Breaker','N1','N2_sub', 0.02, 2, true; % 变电站出线断路器
};
这里需要注意断点和分支的编号逻辑:我习惯把变电站母线设为根节点,所有潮流方向从根节点指向负荷节点。对于装有DG的节点,额外记录DG的类型、容量和出力时序。每个负荷节点需要记录负荷功率(kW)和用户数。
4.2 故障枚举:从单一故障到N-1校核
配电网可靠性评估经典的解析方法是故障模式后果分析法(FMEA),核心步骤是:依次枚举每个元件的故障,分析该故障发生后哪些负荷点失电、失电持续多长时间、通过什么操作可以恢复。
典型处理流程如下:
- 选择第i个故障元件;
- 对该元件设置“故障状态”,断开与其相连的开关;
- 从根节点开始向上游回溯,确定哪些负荷点与主电源断开;
- 对失去主电源的负荷点,判断是否存在DG可形成孤岛,以及孤岛是否满足功率平衡约束;
- 根据开关动作逻辑,确定故障隔离后的恢复路径(比如通过联络开关从相邻馈线转供);
- 记录每个负荷点的停电次数和停电持续时间;
- 重复上述过程,直到所有元件枚举完毕。
在Matlab实现中,我使用邻接矩阵和深度优先搜索(DFS)算法来寻找每个负荷点的供电路径。每次故障模拟时,从根节点执行DFS,能访问到的负荷节点表示由主电源供电;不能访问的节点进入“失电候选集合”。然后对失电候选集合中的每个节点,判断它是否位于DG的孤岛范围内:如果某个失电节点与DG节点之间存在连通路径,且路径上所有开关处于闭合状态,则认为该节点可由DG供电。
这里有一个重要的细节:孤岛范围不是固定不变的。馈线故障后,保护动作会跳开故障点两端的开关,孤岛范围由剩余连通区域决定。我在代码中允许用户自定义“孤岛划分策略”,比如“以DG节点为中心,向上游回溯,直到遇到断开的开关为止”,或者“优先包含重要负荷,按负荷优先级排序”。
4.3 故障隔离和转供策略对指标的影响
配电网可靠性评估里,开关配置直接影响停电指标。同样是馈线中段发生故障,如果馈线首端装了断路器,中段装了分段开关,末端装了联络开关,那么故障处理时序是:
- 断路器跳闸,馈线全线失电;
- 分段开关断开,将故障段与非故障段隔离;
- 断路器重合,恢复故障点上游非故障段供电;
- 联络开关闭合,从相邻馈线恢复故障点下游非故障段供电;
- 故障段停电,等待修复。
这个过程涉及的时间参数有:断路器跳闸时间、分段开关隔离时间、联络开关转供时间。如果DG参与了孤岛运行,时序会更复杂:故障后,DG孤岛立即启动,孤岛内的负荷可能不会经历长时间停电,只有孤岛启动过程中的暂态断电。
我将这些时间参数作为输入变量写入代码,并允许用户设置不同的开关配置方案进行对比。实际算例表明:馈线自动化程度越高的方案,SAIDI下降越明显,但DG孤岛策略的加入可以在馈线自动化水平不变的情况下进一步减少停电时间——尤其是在主馈线发生永久性故障时,DG孤岛可以避免末端负荷等待联络开关转供的这段时间。
5. 蒙特卡洛时序仿真:从“枚举”到“概率”的关键一跃
5.1 为什么解析方法不够用
故障枚举法(FMEA)只能处理元件状态二值化(正常/故障)的事件,而且需要假设故障事件之间相互独立。当DG出力和负荷水平具有随机性时,解析法处理起来很吃力。比如一个光伏DG,它的出力在一天内不断变化,那么某个时刻孤岛是否成功,取决于当时的光照条件。如果你只做确定性评估,取平均出力,很可能会低估故障期间孤岛失败的频率。但如果你取极端恶劣条件(比如阴雨天),又会高估停电风险。
蒙特卡洛时序仿真的思路是:在一个较长的时间跨度内(比如10000年),逐年逐小时模拟每个元件的运行状态和DG出力、负荷大小,统计负荷点的供电状态,最终得到可靠性的概率分布。这种方法能够自然地处理各种随机因素的相互作用,代价是计算量大,但在Matlab中配合向量化操作,可以做到可接受的效率。
5.2 元件故障-修复过程的抽样算法
配电网元件通常建模为“正常-故障”两状态模型,其故障率和修复时间分别服从指数分布(或威布尔分布)。蒙特卡洛时序仿真中,常用的抽样方法有两种:
方法一:序贯蒙特卡洛(Sequential Monte Carlo)。以小时为步长,对每个元件在每个小时判断是否发生故障转移。如果元件处于正常状态,其故障概率为λΔt(λ是故障率,单位次/年;Δt是一小时,即1/8760年)。判断t时刻元件是否故障,用随机数U与λΔt比较:U < λ*Δt则故障;否则继续正常运行。元件进入故障状态后,修复时间t_rep通过指数分布抽样得到,t_rep = -r_rep * ln(U),其中r_rep是平均修复时间。这个方法实现直观,代码简单,我推荐首选。
方法二:非序贯蒙特卡洛(Non-sequential Monte Carlo)。不关心时间顺序,直接抽取系统状态。对每个元件,按故障概率抽样得到状态样本,然后用概率统计方法计算指标期望。这个方法计算效率高,但无法处理与时间相关的约束(如储能SOC的时序变化、DG出力的时序相关性),所以对于含DG的可靠性评估,我强烈建议使用序贯蒙特卡洛。
下面是我在Matlab中实现序贯蒙特卡洛的核心片段:
matlab复制% 仿真总时长(小时)
totalHours = 8760 * numYears;
% 初始化元件状态矩阵,每一列对应一个元件
state = zeros(totalHours, numComponents);
for t = 1:totalHours
for c = 1:numComponents
if state(t, c) == 0 % 正常状态
p_fail = compFaultRate(c) / 8760;
if rand < p_fail
state(t, c) = 1; % 故障
repairTime = compRepairTime(c) * (-log(rand));
% 从t开始连续故障repairTime小时
endIdx = min(t + repairTime - 1, totalHours);
state(t:endIdx, c) = 1;
t = endIdx;
end
end
end
end
这段代码的核心思想是:在故障发生的那一个小时,把后续修复时段内的状态直接置为故障,这样比每个小时都判断一次是否修复更加高效。当然,如果元件数量多、仿真年份长,双重循环的耗时不可忽略,可以改成向量化的事件驱动方式,但先把逻辑跑通更重要。
5.3 DG出力与负荷时序的同步抽样
时序仿真中,DG出力和负荷时序需要与故障事件时间同步。我的做法是预先产生一整年的8760小时DG出力数组和负荷数组,在仿真循环中按小时索引读取。抽样时要注意:光伏出力只在白天有值,夜间为0;风电出力按风速序列转换;负荷时序用典型日负荷曲线乘以季节系数。如果你的评估对象是规划阶段,没有实测时序数据,可以用基准值的日负荷曲线加随机波动:
matlab复制% 典型日负荷曲线(归一化标幺值)
dailyLoad = [0.6 0.55 0.5 0.45 0.4 0.4 0.45 0.55 0.7 0.85 0.9 0.95 ...
1.0 0.95 0.9 0.85 0.8 0.75 0.7 0.65 0.6 0.58 0.6 0.62];
% 生成全年负荷序列
hourOfDay = mod((1:8760)-1, 24) + 1;
loadSeq = dailyLoad(hourOfDay) .* seasonalFactor' + ...
0.05 * randn(1, 8760); % 加入5%随机波动
loadSeq(loadSeq < 0) = 0;
在每个小时,如果该小时系统发生故障导致某负荷点失电,则累计失电负荷需要乘以该小时的负荷值,最终ENS = 各小时失电负荷之和。这样ENS就不仅是停电时间的函数,还和停电时段有关——高峰时段停电造成的缺供电量远大于低谷时段,这符合工程直觉。
5.4 收敛判据与仿真次数确定
蒙特卡洛仿真次数不是拍脑袋定的。理论上,可靠性指标估计值的方差随仿真次数增加而减小。常用判据是变异系数(coefficient of variation,COV):
code复制COV = 标准差 / 期望值 * 100%
当COV小于某个阈值(比如2%~5%)时,可以认为结果收敛。在Matlab中,我每仿真一年就计算一次SAIFI和SAIDI的均值及COV,实时打印收敛情况,并在COV达标后提前终止仿真。
实际经验是:对于中小型配电网(几十个节点),5000~10000年的序贯蒙特卡洛仿真基本能稳定收敛。如果元件故障率很低(比如电缆线路年均故障率0.01次/年),则故障事件本身很罕见,需要更长的仿真时间才能统计到足够数量的故障样本,这时候可以考虑重点抽样法(importance sampling)加速,但实现复杂度会上升。
6. 孤岛运行策略的实现:从静态划分到动态校核
6.1 孤岛成功与否的判据到底有几个
这是含DG可靠性评估的核心难点之一。孤岛运行能否成功,不是简单的“DG容量 > 负荷容量”就行,需要同时满足三个条件:
条件一:电气连通性。孤岛内负荷必须与DG节点有电气通路,故障点被隔离后,这一通路上的开关必须闭合。这点在拓扑搜索时判断。
条件二:有功功率平衡。孤岛内DG总出力(含储能放电功率)必须大于或等于孤岛内总负荷。考虑到DG出力的波动性,校核应该按小时进行动态校核。对于光伏和风电,如果某个小时出力不足,储能可以补充,但储能不能无限放电。
条件三:电压和频率约束。DG孤岛运行时,如果功率不平衡导致频率或电压偏移越限,保护装置会动作,导致孤岛失败。严格的可靠性评估需要调用潮流计算来校核电压,但这样做计算量太大。工程简化做法是用功率平衡作为近似判据,并设置一个安全裕度,比如“孤岛内DG出力≥1.1倍孤岛负荷”才判定成功,以考虑无功和电压损耗。
我在Matlab代码里默认采用“功率平衡+安全裕度”作为孤岛成功判据,同时提供接口,允许用户选择是否调用潮流计算进行精细校验。如果选择潮流校验,我使用Matpower工具箱或自编的牛顿-拉夫逊潮流求解器,在故障时段逐小时计算孤岛内节点电压,只要有节点电压越限,就判定该时段孤岛失败。
6.2 不同孤岛划分策略下的指标差异
我把常见的孤岛策略分为三种,在代码中通过一个字符串参数切换:
策略A:就近孤岛。以DG节点为中心,只恢复DG直接相连的邻近负荷(通常是最靠近DG的变压器低压侧负荷)。这种策略实现简单,孤岛范围小,成功率相对高,但恢复的负荷量少。
策略B:馈线区间孤岛。以馈线上的分段开关为边界,故障隔离后,把DG所在区间视为孤岛范围。这种策略恢复的负荷更多,但孤岛范围扩大后,功率平衡难度增加,可能导致孤岛失败。
策略C:优化孤岛。以最大化恢复负荷电量为目标,在满足功率平衡和潮流约束的前提下,通过优化算法(如整数规划、遗传算法)确定孤岛划分边界。这种策略理论上最优,但计算复杂度高,且在故障场景中需要实时求解,适用场景有限。
用一个简单算例说明差异:某10kV馈线带6个负荷点,总负荷2MW,末端接入1.5MW光伏。策略A只能恢复末端1个负荷点(0.3MW);策略B可以恢复DG所在区间内的3个负荷点(0.9MW),但需要光伏出力不低于0.9MW;如果在光伏出力不足的夜间发生故障,策略B很可能失败,而策略A因为负荷小,可能还能维持。这就说明,孤岛策略的优劣不是绝对的,和故障时段、DG出力、负荷大小都有关。所以可靠性评估必须覆盖全天24小时的各种故障场景,用概率结果来评判策略优劣。
6.3 孤岛切换过程中的短时停电怎么处理
实际工程中,从主网断电到DG孤岛建立,中间通常存在一个切换时间。如果配电网没有配置不间断切换装置,短时停电很难避免。这个短时停电在可靠性指标中如何体现?业内有两种口径:
口径一:短时停电计入停电次数,但不计入停电持续时间。这会导致SAIFI升高但SAIDI不显著变化,CAIDI下降。
口径二:短时停电不计入可靠性指标,因为持续时间极短(几秒到几分钟),用户感知不强。
IEEE标准里对“momentary interruption”有专门定义,通常指持续时间在5分钟以内的停电。我在代码中设置了一个参数momentaryThresholdMinutes,默认值为5:只要孤岛切换导致负荷中断时间小于该阈值,就计入“短时停电事件”但单独统计,不混入持续性停电指标。这样报告里可以同时给出“持续性SAIFI”和“含短时停电的SAIFI”,更贴近工程需要。
7. Matlab代码架构与使用说明
7.1 代码模块划分
整个项目我按功能拆分成以下几个模块,每个模块由一个函数或脚本文件承载:
| 文件/函数 | 功能 | 输入 | 输出 |
|---|---|---|---|
runReliability.m |
主程序,组织仿真流程 | 网络参数、DG参数、仿真参数 | 可靠性指标结果 |
buildNetwork.m |
构建配电网拓扑 | 节点/支路表格 | 网络对象 |
faultEnumeration.m |
解析法故障枚举 | 网络对象 | 故障集合及后果 |
monteCarloSim.m |
序贯蒙特卡洛仿真 | 网络对象、时序数据 | 负荷点状态时序 |
calcIndicators.m |
可靠性指标计算 | 负荷点状态时序 | SAIFI/SAIDI/ENS等 |
genPVProfile.m |
生成光伏出力时序 | 辐照度数据/分布参数 | 8760小时光伏出力 |
genWindProfile.m |
生成风电出力时序 | 风速数据/分布参数 | 8760小时风电出力 |
genLoadProfile.m |
生成负荷时序 | 典型日负荷曲线 | 8760小时负荷数据 |
islandStrategy.m |
孤岛划分与校核 | 网络对象、故障位置 | 孤岛范围及供电状态 |
主程序的调用顺序是:
matlab复制% 1. 构建网络
net = buildNetwork('case6.m');
% 2. 生成DG出力时序
pv = genPVProfile(location, capacity);
wind = genWindProfile(location, capacity);
% 3. 生成负荷时序
loadSeq = genLoadProfile(baseLoad, type);
% 4. 设置仿真参数
simParam = struct('numYears', 5000, 'method', 'sequential', ...
'islandStrategy', 'section', 'momentaryThreshold', 5);
% 5. 执行仿真
result = monteCarloSim(net, pv, wind, loadSeq, simParam);
% 6. 计算并显示指标
indicators = calcIndicators(result);
disp(indicators);
7.2 输入数据准备建议
代码用到的输入数据可以分为四类:
网络参数类:节点数、支路数、每个元件的故障率和修复时间。这部分数据可以通过配电网规划资料获取,如果只是学习研究,可以直接使用IEEE RBTS Bus 2或Bus 4标准测试系统的数据,这些公开数据在论文中大量引用,拿来对比验证也方便。
DG参数类:DG类型(光伏/风电/储能)、额定容量、切入/额定/切出风速(风电)、组件效率与面积(光伏)、储能容量与SOC约束。注意:不同DG的出力模型参数不能混用,风机没有光照参数,光伏没有风速参数。
负荷参数类:每个负荷点的峰值功率、用户数、日负荷曲线。如果缺乏实测数据,可以采用IEEE-RTS系统的负荷模型,该模型提供了8760小时的负荷数据,可以直接下载使用。
仿真参数类:仿真年限、故障率倍率(用于灵敏度分析)、随机数种子(用于复现结果)。我强烈建议固定随机种子,否则每次运行结果有微小差异,不利于调试和对比。
7.3 结果输出与可视化
评估完成后,除了在命令行输出指标数值,我还习惯画三张图:
第一张图:系统SAIDI随仿真年数的收敛曲线。横轴是仿真年数,纵轴是SAIDI的累计均值,可以看到曲线逐渐收敛到稳定值。这张图能直观展示蒙特卡洛仿真的收敛性。
第二张图:各负荷点ENS的柱状图。横轴是负荷点编号,纵轴是ENS值,可以快速找出可靠性薄弱的节点——通常也是需要重点改造的位置。
第三张图:系统故障事件的时序散点图。横轴是小时序号,纵轴是故障元件编号,颜色表示该故障是否导致了负荷停电,以及停电持续时长。这张图可以帮助分析故障的多发时段和DG对停电的影响。
画图用Matlab的plot、bar、scatter函数即可,注意把坐标轴标签、图例、标题写清楚。下面是一个简单的负荷点ENS柱状图示例:
matlab复制figure;
bar(ENS_eachBus);
xlabel('负荷点编号');
ylabel('ENS (kWh/年)');
title('各负荷点年缺供电量');
grid on;
7.4 代码效率优化技巧
蒙特卡洛时序仿真最耗时的部分是逐年逐小时的负荷点状态判断。如果网络规模大(几百个节点),朴素的双重循环很容易让仿真时间失控。我优化了两个地方:
一是把元件故障状态的抽样向量化。不需要对每个小时都生成一个随机数,而是先生成所有元件的故障时间序列,再进行状态叠加。这样可以把内层循环替换成矩阵操作,速度提升明显。
二是对孤岛校核函数做“提前剪枝”。在计算孤岛功率平衡时,如果孤岛内总负荷已经超过DG额定容量与储能最大放电功率之和,直接判定孤岛失败,无需再逐小时校核。因为这种情况下无论DG出力如何波动,都满足不了最长供电要求。
当然,如果追求极致性能,可以使用Matlab Parallel Computing Toolbox的parfor并行化仿真年份的外层循环。我实测过,8核机器上并行后,5000年的仿真时间可以从半小时压缩到5分钟左右,代价是内存占用上升。
8. 算例验证:一个6节点配电网的前后对比
8.1 算例系统参数
为了验证代码的合理性,我搭建了一个6节点辐射状配电网算例。系统拓扑如下:
- 变电站高压母线(根节点)通过一台10kV/0.4kV变压器向馈线供电;
- 馈线上接有3个负荷节点(L1、L2、L3),每个负荷节点用户数分别为50、80、60户;
- 负荷节点L2附近接入一个光伏DG,容量300kW;
- 负荷节点L3附近接入一个储能系统,容量200kWh,最大放电功率100kW;
- 馈线各段线路故障率和修复时间如下表。
| 线路段 | 故障率(次/年) | 平均修复时间(小时) |
|---|---|---|
| L1段 | 0.05 | 3 |
| L2段 | 0.06 | 4 |
| L3段 | 0.04 | 5 |
负荷参数:L1峰值功率100kW,L2峰值功率150kW,L3峰值功率120kW,日负荷曲线取典型居民负荷曲线。光伏出力按典型夏季晴天和随机波动两种场景分别仿真。
8.2 结果对比:有DG与无DG
我分别对“无DG”和“有DG(含光伏+储能)”两种方案进行了5000年序贯蒙特卡洛仿真,得到结果如下:
| 指标 | 无DG | 有DG | 变化幅度 |
|---|---|---|---|
| SAIFI(次/用户·年) | 1.284 | 1.276 | -0.6% |
| SAIDI(小时/用户·年) | 5.215 | 3.842 | -26.3% |
| CAIDI(小时/次) | 4.062 | 3.011 | -25.9% |
| ASAÍ | 0.999404 | 0.999562 | +0.0158% |
| ENS(kWh/年) | 8423 | 6217 | -26.2% |
从结果可以看到,DG接入后,SAIFI变化不大,因为故障次数主要由线路固有故障率决定,DG不能减少故障率;但SAIDI和ENS改善明显,原因是上游故障后,DG孤岛可以为部分负荷提供临时供电,缩短了停电持续时间。这个结果也验证了前文提到的观点:DG对可靠性的贡献主要体现在减少停电时长,而不是降低停电频率。
值得注意的是,如果光伏在夜间发生故障,孤岛内只有储能供电,而储能容量有限,所以不同故障时间段对SAIDI的影响差异很大。我单独统计了“白天故障”和“夜间故障”两种场景下的SAIDI,白天故障SAIDI只有夜间故障的60%左右。这说明含DG配电网可靠性评估必须考虑DG出力的时变性,用恒定出力模型会得到偏乐观或偏悲观的结果,具体偏向取决于故障多发时段。
8.3 灵敏度分析:DG渗透率对可靠性的边际影响
我又做了渗透率灵敏度分析,把光伏容量从100kW逐步增加到500kW,观察SAIDI和ENS的变化。结果显示:渗透率从100kW增加到200kW时,SAIDI下降幅度显著;但从300kW增加到500kW时,SAIDI的改善趋于平缓。原因是孤岛内负荷有限,当DG容量已经超过孤岛负荷峰值时,再增加容量只是冗余,不会进一步缩短停电时间。这个结论对配电网规划很有意义:不是DG装得越多可靠性越好,超过一定渗透率后,可靠性收益进入饱和区,此时应该把钱花在网架改造或储能配置上,而不是继续扩大DG容量。
这个现象背后的机理是:孤岛内功率平衡的瓶颈是负荷需求,DG容量超过负荷需求后,额外容量只增加了“冗余电源”,但孤岛能否运行还受限于储能容量和故障隔离时间。所以做规划决策时,最好把DG渗透率作为变量做多次评估,画出“渗透率-可靠性”曲线,找到拐点位置。
9. 编写评估代码时最容易踩的五个坑
第一个坑:把DG接入节点当成PV节点(恒定有功功率节点)来处理。实际上DG在配电网中通常运行在PQ模式或PV模式,但并不是恒定出力。光伏出力随光照变化,风机出力随风速变化,不能简单定为常数。解决方法是:每个DG节点关联一个时序出力数组,故障校核时按故障时段取对应值。
第二个坑:忽略保护配合对孤岛范围的影响。DG接入后,原有保护定值可能不再适用,比如馈线故障时,DG会向故障点贡献短路电流,可能导致保护误动或拒动。可靠性评估如果假设保护完全正确动作,会过于乐观。我在代码中加入了保护配合失败的概率参数(比如误动率、拒动率),虽然是简化处理,但能让结果更贴近工程。
第三个坑:储能初始SOC的假设。很多人在仿真开始时设SOC=100%,然后在全年仿真中如果储能一直没机会放电,SOC就一直保持100%,这没问题。但如果仿真过程中储能参与了孤岛供电,SOC下降到低点,而后续没有充电机会,那么下一次故障时储能可能已经处于亏电状态。所以在序贯蒙特卡洛仿真中,储能SOC必须逐小时更新,考虑故障放电和正常充电之间的交互。
第四个坑:负荷点用户数权重被忽略。有的简化代码直接把所有负荷点等同看待,计算SAIFI时没有用户数加权,结果就是配电网中用户数多的大负荷节点的停电事件被低估。我在代码中强制要求每个负荷点必须有用户数参数,计算时用用户数做加权平均。
第五个坑:随机数种子不固定导致结果不可复现。蒙特卡洛仿真的核心是随机抽样,如果每次运行随机数种子不同,结果会有波动,不利于调试和评审。建议在主程序开头用rng(固定数字)设定种子,或者把种子作为输入参数传入,确保每次运行结果可复现。
10. 扩展方向与实际工程建议
含DG配电网可靠性评估这个方向,目前还有很多可以深入的空间。比如:把可靠性评估和网络重构优化结合起来——在故障发生后,除了DG孤岛,还可以通过调整联络开关组合实现负荷转供,这个转供策略可以用智能算法(如遗传算法、粒子群算法)优化;又比如把可靠性指标作为约束条件,建立分布式电源选址定容的优化模型,用MATLAB的优化工具箱求解。
对于实际工程项目,我的建议是从小规模网络入手,先用公开测试系统(如IEEE 33节点、IEEE 123节点)验证代码正确性,再替换成本地实际网络参数。实际配电网数据往往存在缺失,比如某条线路的故障率没有统计数据,可以采用同类设备典型值或者运行经验值填补,同时在报告里注明数据来源不确定度。
仿真结果出来后,不要只看平均值,还要看最坏情况。建议把每个负荷点的停电持续时间P90(即90%分位数)列出来,识别出“小概率但后果严重”的场景,这些场景通常是需要加装储能或加强网架的地方。
最后再分享一个我在代码调试过程中的小技巧:不要一上来就跑5000年仿真,先用100年仿真快速跑通流程,检查中间结果是否合理——比如某条支路故障率0.1次/年,100年里应该出现大约10次故障,如果多出或缺失明显,说明故障抽样代码有bug。调通后再逐步增加仿真年数,这样能节省大量调试时间。
