简介:可靠性评估是配电网规划与运行的关键环节。随着分布式光伏、储能等电源大规模接入,传统辐射状网络的故障影响分析不再适用,需要结合时序模拟等方法量化DG对供电可用率的影响。序贯蒙特卡洛模拟通过元件故障抽样与时序负荷/出力建模,能够细致刻画孤岛运行、负荷削减等动态过程,计算SAIDI、SAIFI等指标。该技术可支撑并网方案比选、储能容量配置及故障恢复策略优化,在新能源渗透率不断提高的背景下具有重要工程价值。本文基于一个含分布式电源接入的配电网可靠性评估项目,解析建模细节、仿真流程与常见陷阱。 拿到“含分布式电源接入的配电网可靠性评估.zip”这个压缩包时,我第一反应不是解压,而是先想清楚这个题目背后到底要解决什么问题。这几年分布式光伏、储能和风电大量接入中低压配电网,电网规划、运行方式论证、并网方案比选里都绕不开可靠性评估这件事。但说实话,真正能把一条馈线在接入DG之后的可靠度算明白,不是随便调个商业软件点两下就行的。这篇博文我把这个zip背后的工程思路、建模细节、仿真流程和实际调试中踩过的坑摊开讲清楚,希望对正在做配电网评估课题、毕业设计或并网论证的朋友有实际帮助。
1. 项目解压之后先看什么:整体结构与应用场景
一个压缩包的核心价值不在代码多少行,而在它的组织方式能不能让你快速建立“输入—计算—输出”的完整闭环。这个项目我按典型工程仿真项目的组织方式拆解,适合直接参考复现。
1.1 压缩包里的核心内容分布
一般这种可靠性评估项目,代码大概率会分为几个固定模块:数据输入、元件建模、时序模拟、指标统计、结果输出。这个zip也不例外,解压后大致能看到这样的目录结构:
project/ ├── data/ # 网络拓扑、负荷曲线、DG出力数据 ├── src/ # 核心仿真代码 │ ├── load_model.py # 负荷时序模型 │ ├── dg_model.py # 分布式电源出力模型 │ ├── fault_sampling.py # 故障事件抽样 │ ├── island_operation.py # 孤岛运行与负荷削减 │ └── reliability_metrics.py # 可靠性指标计算 ├── docs/ # 计算说明、参数来源 ├── results/ # 仿真结果与图表 └── main.py # 主流程入口这个结构看起来简单,但它是经过多个实际项目打磨出来的。data目录存放原始参数,src里每个模型单独成文件,main.py只负责编排流程,这样的好处是当你需要更换测试系统、调整DG容量或修改孤岛策略时,不需要满世界找代码改,只改对应模块就行。
1.2 这个项目要解决什么问题
配电网可靠性评估的核心,说直白点就是回答一个问题:在一年里的某条馈线上,用户平均会停多少次电、停多长时间、损失多少电量。传统配电网是单侧电源辐射状结构,线路或者变压器出故障,下游用户就只能等修复,逻辑很清楚。
加了分布式电源之后,情况就变了。光伏、储能可以在故障时形成孤岛,给一部分负荷继续供电,但这部分“自愈能力”能发挥多大作用,和DG接入位置、容量、控制方式、天气状况都有关系。这个zip里评估的不是“DG装了就一定更可靠”这个结论,而是量化到底降了多少停电时间、提升了多少供电可用率,同时算清楚哪些场景下DG帮不上忙甚至可能带来负面影响。
这个项目最典型的使用场景有三类:一是配电网规划阶段比较不同DG接入方案;二是光伏储能并网前做运行影响评估;三是研究生课题里做可靠性分析的基础框架。不管哪类场景,最终交付物往往是一组可靠性指标,再加几张对比曲线,用来支撑方案决策。
2. 可靠性评估的核心逻辑:为什么分布式电源让问题变复杂
要理解这个项目里的代码在算什么,得先把传统可靠性评估的底子理清楚,再来看加了DG之后到底动了哪几个环节。
2.1 传统配电网可靠性评估的基本逻辑
传统辐射状配电网的可靠性评估,思路可以浓缩成“故障—隔离—修复”三步。某条线路发生故障,断路器或熔断器动作,故障点上游的负荷通过重合闸快速恢复,下游负荷则需要等故障隔离和修复完成后才能复电。
评估时通常用解析法,也就是对每一个可能故障的元件,列出它影响哪些负荷点、预计修复多久,然后按照元件故障率和修复时间,加权累加得到系统指标。常用的指标包括:
| 指标 | 全称 | 含义 | 单位 |
|---|---|---|---|
| SAIFI | 系统平均停电频率指标 | 每个用户每年平均停电次数 | 次/(户·年) |
| SAIDI | 系统平均停电持续时间指标 | 每个用户每年平均停电小时数 | 小时/(户·年) |
| CAIDI | 用户平均停电持续时间 | 每次停电平均持续多久 | 小时/次 |
| ASAI | 供电可用率 | 一年内供电时间占比 | % |
| ENS | 期望缺供电量 | 一年内损失的供电量 | kWh/年 |
解析法对传统配电网够用,因为故障影响范围是确定的:一台变压器故障,它的低压侧用户全部停电;一条馈线故障,后面所有负荷点都停。但加了DG之后,这种确定性被打破了。
2.2 DG接入改变了什么
分布式电源接入后,最本质的变化是故障后的供电路径不再单一。如果馈线某段故障,而下游区域内有光伏和储能,且容量能满足本地负荷,系统可以通过分段开关动作形成孤岛运行,下游用户就不用等整条馈线修复,停电时间大幅缩短。
但这里面有大量不确定性。光伏出力受光照、云层影响,一天之内波动很大;风电更不用说了,来风才有电;储能虽然可控,但容量有限,只能支撑一段时间。所以孤岛能不能成立,取决于三个条件:故障瞬间DG总出力是否大于孤岛内负荷、储能剩余电量能扛多久、孤岛切换过程中有没有出现大的频率电压波动。
还有一个容易忽略的点:DG本身也会故障,而且接入点的保护配置如果不合理,双向潮流还可能引起保护误动。所以完整的可靠性评估不能只把DG当“免费电源”,还要给它建模故障率、修复时间,考虑DG退出运行的状态。
2.3 评估方法选型:为什么优先选序贯蒙特卡洛
既然加了这么多不确定性,解析法的难度就上来了。FMEA(故障模式影响分析)这类方法在处理孤岛运行、出力时序变化时,要么做很粗的近似,要么状态枚举爆炸,算到后面连公式都复杂到没法维护。
这个项目选择的是序贯蒙特卡洛时序模拟法,我完全认同这个选型。序贯蒙特卡洛的核心思路是模拟系统在时间轴上的运行状态:给每个元件按故障率抽样出故障时刻,按修复时间抽样出修复时刻,然后逐小时推进,模拟DG出力、负荷变化、故障处理过程,最后把整年的用户停电次数和停电时间统计出来。
对比起来,非序贯蒙特卡洛是随机抽一个系统状态来判断是否停电,没法体现时序上的因果关系,比如储能孤岛支撑能力高度依赖故障发生时刻的SOC,这在非序贯方法里很难准确表达。序贯法牺牲了部分计算效率,但换来了逻辑上的清晰和工程上的可信度。
3. 关键建模细节与参数设置(实操重点)
这部分是整个项目能不能算出靠谱结果的核心,也是我认为zip里最值得逐行研究的地方。建模越贴近实际,结果越有说服力,但也不能一味追求细节把计算量搞到不可承受。
3.1 分布式电源出力模型
光伏和风电的出力建模,是这个项目里第一个容易被低估的部分。很多人直接用一个固定容量乘以一个随机系数,这样算出来的可靠性指标偏差很大,因为光伏出力和负荷午高峰的匹配关系、极端天气下的连续低出力,都会直接影响孤岛成功率。
光伏出力比较实用的建模方法是:先准备一条8760小时的辐照度时序数据,再通过转换关系得到有功出力。辐照度数据可以用典型气象年的实际数据,精度要求不高的时候也可以用Beta分布按小时抽样。功率转换公式用工程上常见的形式:
# 光伏出力简化模型 def pv_power(g, g_stc=1000, p_stc=400, k=0.004, t_cell=25, t_amb=25): # g: 当前辐照度 W/m2 # g_stc: 标准测试条件辐照度 # p_stc: 光伏额定功率 kW # k: 功率温度系数 # t_cell: 电池板温度,简单计算时可取 t_amb + 25 if g <= 0: return 0 temp_factor = 1 - k * (t_cell - 25) return p_stc * (g / g_stc) * temp_factor风电的出力建模则用风速的威布尔分布抽样,再通过风机功率曲线转换。功率曲线一般是一个分段函数:切入风速以下出力为0,额定风速以上限功率,中间段近似线性或按厂家曲线插值。
储能模型是这个项目里相对关键的一块。储能虽然本身不产生能量,但它能把 DG 的间歇出力“削峰填谷”,对孤岛支撑能力提升非常明显。储能建模需要设置容量、最大充放电功率、荷电状态上下限,还要定义控制策略。我见过最简单的做法是:孤岛形成后优先用光伏,光伏不够就储能放电,储能放完再切负荷。这种做法在项目初期完全够用,后续再细化控制逻辑。
3.2 故障与修复过程建模
元件故障建模说白了就是给每个设备定两个数:故障率λ和平均修复时间r。故障率一般用“次/年”表示,修复时间用“小时/次”表示。线路有时候还用“次/(km·年)”配合线路长度折算。
时序蒙特卡洛的抽样方法是:对每个元件,按指数分布抽样下一次故障发生时间TTF,按修复时间分布抽样修复时长TTR:
import random def sample_ttf(lam): # lam: 故障率(次/年) # 返回距离下一次故障的时间(小时) u = random.uniform(0, 1) return -math.log(1 - u) / lam * 8760 def sample_ttr(r_mean): # r_mean: 平均修复时间(小时) u = random.uniform(0, 1) return -r_mean * math.log(1 - u)然后取所有元件里TTF最小的那个作为下一个故障事件,推进时钟,处理完故障后重新抽样该元件的下一次故障时间。这个“最小堆”的思路,是时序蒙特卡洛的标准做法,能大幅提升模拟效率。
故障处理过程要建模的环节包括:故障定位、隔离、上游恢复、下游检修、孤岛形成判断。隔离操作一般假设是固定的,比如0.5小时,孤岛形成也有一段时间,常见取1小时。这些时间参数对结果影响很大,后面算例里我会专门说明。
3.3 负荷削减策略
故障期间如果孤岛内DG出力不够,或者储能耗尽,就需要切负荷。负荷削减策略的建模原则是:先保重要负荷,再保一般负荷。工程上通常按负荷等级排列优先级,仿真里就是按顺序切除次要负荷,直到功率平衡:
def load_shedding(loads, available_power): # loads: 孤岛内负荷列表,每个元素为 (priority, power_kw) # available_power: 当前可用功率 # 返回需要切除的负荷列表 # 按优先级从低到高排序(数字越大等级越高) sorted_loads = sorted(loads, key=lambda x: x[0]) remaining = available_power shed = [] for priority, power in sorted_loads: if remaining < power: shed.append((priority, power - remaining)) remaining = 0 break else: remaining -= power return shed这里的重点是统计口径,每次切负荷到底算不算一次“停电事件”、算到哪个用户头上,代码里必须清晰记录。实际项目里这里也是错误高发区,后面问题排查部分会展开。
3.4 仿真主流程与参数收敛判断
仿真主流程简单描述就是:初始化系统状态,抽样各元件初始故障时间,进入小时级循环,每个小时检查是否有故障发生,若有则进入故障处理子流程,若无则正常统计运行状态。循环到预设模拟年限后,汇总指标。
这里有个关键问题:模拟多少年结果才可信?答案是看收敛性。工程上常用方差系数β来衡量,一般要求小于0.05,追求精度时取0.02。方差系数的定义是待估指标标准差与均值的比值。实测下来,对于一个中等规模的馈线(几十个负荷点),模拟10000到50000年才能稳定收敛,听起来很夸张,但因为故障是小概率事件,只有足够长的模拟年限才能覆盖足够的故障样本数。
缩短计算时间有常见的几招:用方差缩减技术(比如重要抽样、控制变量),或者把故障率低的元件单独处理,还可以用并行计算把不同随机种子下的模拟分到多核上跑。实际项目里我一般先跑2000年看趋势,再用方差系数决定是否加长。
4. 算例复现:从一个简化测试馈线看结果
这一节我基于项目实际算例,把仿真流程跑一遍,梳理结果分析和参数敏感性。测试系统采用参考IEEE RBTS标准测试系统改造的一条馈线,拓扑结构是典型的主干线加分支配电变压器形式,主干线设置了分段开关,馈线末端有联络开关可转带负荷。
4.1 测试系统与接入方案
算例用的馈线主干线全长约10公里,共40个负荷点,总峰值负荷约4.2MW。分布式电源接入方案为:在馈线中段和末段分别接入1台400kW光伏,在中段配置1套500kWh/250kW储能。这个配置的渗透率大约20%,符合当前分布式光伏台区常见比例。
| 参数类型 | 具体参数 | 数值 |
|---|---|---|
| 线路 | 故障率 | 0.06次/(km·年) |
| 线路 | 平均修复时间 | 5小时/次 |
| 配变 | 故障率 | 0.015次/年 |
| 配变 | 平均修复时间 | 200小时/次 |
| 开关 | 隔离操作时间 | 0.5小时 |
| DG | 孤岛切换时间 | 1小时 |
| 储能 | 容量 | 500kWh |
| 储能 | 最大充放电功率 | 250kW |
| 模拟 | 基准模拟年限 | 20000年 |
先说明一个常识:变压器修复时间200小时看起来很长,但对应的是“更换或修复故障变压器”的全过程,实际如果只是跳闸重合可能几分钟就恢复了。这里200小时对应的是必须等检修队到场、更换设备的严重故障场景。
4.2 运行结果与灵敏度分析
基础场景下的指标对比如下:
| 指标 | 无DG接入 | 有DG接入(光伏+储能) | 变化幅度 |
|---|---|---|---|
| SAIFI(次/(户·年)) | 1.53 | 1.37 | 下降约10.5% |
| SAIDI(小时/(户·年)) | 7.82 | 5.06 | 下降约35.3% |
| ASAI(%) | 99.91 | 99.94 | 提升约0.03% |
| ENS(MWh/年) | 28.6 | 18.9 | 下降约33.9% |
从结果能看出几个有意思的特征。SAIFI下降没有SAIDI下降明显,说明DG并没有显著减少停电次数,而是主要缩短了停电持续时间。逻辑上也好解释:孤岛运行不能让故障不发生,但可以在故障修复期间保住一部分负荷,相当于把“长时间停电”降级为“短时停电”或者“不停电”。
为了验证哪个因素影响最大,我做了三组单变量敏感性分析。第一组只把光伏容量从0增大到1000kW,SAIDI从7.82小时逐步降到约5.5小时,但超过600kW后边际效益明显递减。原因是馈线后段负荷有限,光伏容量再大,孤岛期间多余的电也送不出去,没有额外收益。
第二组把储能容量从0提升到1000kWh,同样观察SAIDI。储能容量从0到300kWh时SAIDI下降很快,但超过500kWh之后效果增速放缓,这说明对本案例的孤岛负荷规模和典型故障时长来说,500kWh已经能把大部分故障场景扛过去,再加大容量纯属浪费投资。
第三组调整孤岛切换时间,从0.25小时变化到2小时。这个参数对SAIDI的影响比我预想的更大,切换时间从1小时缩短到0.25小时,SAIDI进一步下降近20%,因为切换期间孤岛内负荷是停运的,切换时间越长,折算到全年指标上越吃亏。
4.3 收敛性与计算耗时控制
用序贯蒙特卡洛模拟20000年,单核跑大概需要几分钟到十几分钟,取决于负荷点数量和代码优化程度。我实际跑的时候用随机数种子控制,并行跑了8个5000年的分支再汇总,耗时控制在2分钟以内,效果很好。
收敛性判断我推荐盯两个量:SAIDI和ENS的方差系数。这两个指标稳定性较差,往往要到比较长的模拟年限才平稳。一个快速判断方法是:跑完一个批次后,把累计指标按每1000年做一段曲线,如果曲线尾部震荡幅度小于5%,基本就可以停下来了。
5. 常见问题与避坑实录
这部分写的是我拿到类似项目代码后,实际调试过程中真实遇到的高频问题。每个问题都对应着一个具体的坑,有人是数据口径错了,有人是逻辑条件写反了,希望能帮读者少走弯路。
5.1 新手最容易踩的五个坑
第一个坑是时间轴不对齐。负荷数据是8760小时逐时曲线,光伏辐照度数据也是8760小时,但两条数据的开始日期对不上,直接导致孤岛判断时“半夜还有光伏出力”这种离谱结果。排查方法很简单:画一条96小时或者一整年的曲线,把负荷和光伏叠在一起看,一眼就能发现对齐问题。
第二个坑是随机数种子没固定。蒙特卡洛模拟本身就是基于随机抽样,如果每次跑之前不固定随机种子,同样的参数两次结果波动幅度可能超过10%,这样就说不清楚指标变化到底是方案差异还是随机波动。所有实际项目都应该在开头固定随机种子,输出结果时标注种子编号,方便复现。
第三个坑是孤岛成功判断过于乐观。有些代码只判断DG容量大于负荷就认为孤岛成立,忽略了储能SOC不足、电压频率失稳、保护配合失败这些现实因素。工程上更稳妥的做法是给孤岛成功率乘一个0.9到0.95的系数,或者建立更细的时序校验逻辑。
第四个坑是遗漏DG设备本身的故障模型。如果把分布式电源当作永远不会坏的理想电源,结果是高估可靠性的,故障场景里就可能出现“DG不发电但系统以为它在发电”的统计偏差。光伏逆变器、储能变流器的故障率虽然不高,但在长时间模拟里积累起来影响不小。
第五个坑是指标统计口径错误。SAIFI和SAIDI的分母是一年内的平均用户数,分子是停电用户数与停电次数的乘积。有些代码把同一故障下的多段停电重复统计,导致SAIFI虚高。更隐蔽的情况是故障上游用户很快恢复供电,这部分用户的短暂停电到底算不算一次事件,算的话统计时长就是隔离操作时间,不算的话就要在代码里区分逻辑,两种口径都可以,但必须前后一致。
5.2 我个人的几条经验
这个项目做完之后,有几条经验我觉得值得分享给正在做类似评估的人。
第一,先跑简单算例再上复杂拓扑。我第一次做类似项目时,一上来就想把整个园区几十个节点一次建完,结果调试了大半个月还在查数据。后来改成先用一个5节点的小系统把所有逻辑跑通,验证代码正确性,再逐步扩展到实际规模,效率反而高了很多。可靠性评估核心逻辑其实就那几个模块,小系统跑通了,大系统只是数据量问题。
第二,敏感性分析是报告里最有价值的部分。单给一组可靠性指标,决策者可能看不出什么,但当把光伏容量、储能容量、切换时间对SAIDI和ENS的影响曲线放出来,方案的边际收益和合理配置区间一目了然。这也是这个项目里我认为最值得参考的分析思路。
第三,原始数据记录一定要完整。仿真程序的特性决定了每次运行结果都可能有差异,如果不记录随机种子、参数版本、数据文件编号,三天后你根本说不清某个结果是怎么跑出来的。我在项目里专门建了一个results/run_log.csv,每跑一次就追加一行参数说明,省去很多返工时间。
本文还有配套的精品资源,点击获取