搞低压配电网故障监测的同行,应该都遇到过这种尴尬:系统里装了各种智能电表、馈线终端和集中器,数据在平台上堆了一大堆,但真到了单相接地这种故障,你很难说清楚网络里哪个节点电压掉得最狠、故障电流到底沿着哪条分支传出来的,更不敢保证监测方案给出的判断到底靠不靠谱。标题里这个项目,核心就是用加权最小二乘(WLS)状态估计器搭一套监测方案的验证框架,在一条径向低压测试馈线上模拟单相接地故障场景,再通过蒙特卡洛方法把测量误差的随机性摊开来反复评估,定量回答"这套监测方案在真实误差条件下,估计出来的系统状态到底准不准"。整套仿真在Matlab里实现,既能把状态估计算法从公式一路跑到结果,也能给实际低压台区的量测点设计做参考。适合做配电网故障监测、状态估计算法或者低压台区自动化改造的同行阅读。原理不深,重点是代码实现和试验设计里的那些细节。
1. 项目拆解:状态估计凭什么能参与低压故障监测
1.1 低压配电网的"盲区"困境
低压配电网,就是10kV变压器下面那一大摊380/220V网络。和输电网、高压配电网相比,它有几个非常不友好的特点。
首先是量测覆盖极其稀疏。输电网有完整的SCADA系统,主站、变电站、线路上的测点密度高,数据刷新快;低压台区呢,一个台区下面几十上百个用电节点,真正装上实时测控终端的没几个。智能电表覆盖率倒是上来了,但抄表周期通常以15分钟到小时计,故障瞬间的电气量基本拿不到。所谓监测,往往只能靠台区总表、少量分支监测装置和零星的末梢表计去推断整个台区的状态。
其次是网络参数和模型困难。低压馈线供电半径短、支路多,线路阻抗小但R/X比值很高(低压电缆R/X可以高达3~5,架空线稍低),负荷单相、两相混合接入,三相严重不平衡。模型上,单相潮流都未必算得准,三相四线制要考虑零序路径和接地阻抗,复杂程度比高压配电网高一个量级。
再就是故障特征。单相接地在低压系统里相当常见,但故障持续时间短,稳态特征不明显,加上低压网络拓扑变化频繁(用户临时接线、私拉乱接),监测方案很容易误判或漏判。
正因为这些"盲区"存在,才需要引入状态估计——量测不够,就用数学模型来补;模型不准,就用统计方法来兜底。这个项目的思路,就是先承认量测一定有误差,再用WLS状态估计器把现有的、有限的和含噪声的量测融合成一份完整、一致的运行状态断面,最后用蒙特卡洛把误差的随机性量化出来,看这个断面到底值不值得信。
1.2 WLS状态估计器:拿什么补盲区
加权最小二乘状态估计,英文缩写WLS,搞过电网调度的人应该不陌生,它在输电网已经有几十年工程应用史。核心思想可以这样理解:你手上有一堆量测值(电压、功率、电流),它们都带有误差;你还知道电网的拓扑和参数;那么你可以找到一个节点电压状态向量,让"按这个状态算出来的量测值"和"实际量测值"最接近,接近程度用误差平方和来度量,而且每个量测按精度分配权重。这个状态向量就是状态估计结果——完整的节点电压幅值和相角。
为什么选WLS而不用更复杂的鲁棒估计或卡尔曼滤波?我的看法是,这个项目要评估的是监测方案的基础性能,WLS理论成熟、实现简单、可解释性强,而且对量测误差的假设(零均值高斯噪声)和蒙特卡洛的验证逻辑正好匹配。你首先得知道"理想条件下的WLS能成什么样",再去评估更复杂的算法才有参照物。WLS的局限也很明确:它对坏数据敏感,对正态性假设依赖强。后面我会讲怎么在蒙特卡洛框架里处理这些问题。
1.3 为什么必须用蒙特卡洛来"验收"
这是整个项目设计里最关键的方法论选择。单次仿真没有意义:量测误差是随机的,这次量测偏大,下次可能偏小,单次状态估计的结果只能反映某一次误差样本下的情况,不能代表监测方案的稳定性能。打个比方,你测射击运动员的水平,不能只看他打一枪,要看几百发子弹的散布。蒙特卡洛方法就是"打几百枪":生成大量独立同分布的随机误差样本,对每组样本都跑一遍完整的量测生成和状态估计流程,然后把所有估计结果汇总起来,统计偏差、标准差、均方根误差等指标。
说到这,标题里的"WLS"和"蒙特卡洛"就串起来了:WLS是监测方案的核心算法,蒙特卡洛是评估这个算法在随机测量误差影响下性能的方法论。二者缺一不可。
2. 测试场景设计:径向低压馈线 + 单相接地
2.1 径向馈线建模:树状拓扑与线缆参数
先说为什么用径向(辐射状)馈线。低压台区的供电方式基本都是单电源树状结构:一台配电变压器低压侧引出几条主干线,主干线下接分支,分支再带若干用户节点,没有环网联络(至少正常运行方式下是这样)。径向结构的好处是潮流方向唯一、保护配合简单,但对状态估计来说,它有一个天然弱点:越往树枝深处走,量测越稀疏,可观测性越弱。用径向测试馈线做场景,正是为了考验监测方案在最常见也最难观测的网络形态下的表现。
建模具体怎么做?我在实际项目里用的是一条约45个节点的低压馈线,参数参照常见电缆和架空线:截面95~185mm²的电缆,电阻大约0.1~0.3Ω/km,电抗0.05~0.08Ω/km;架空线电阻略大,电抗略高。节点间距从几十米到三百米不等,模拟实际台区的供电半径。负荷用恒功率模型,有功在几个千瓦到几十千瓦之间,无功相应配比。Transformer建模相对简单,低压侧出线直接当电压源节点处理即可。
这里有个细节要提:低压线路的对地电纳非常小,除非专门研究电容电流或漏电保护,否则建模时直接忽略B,只保留串联阻抗R+jX,这样能减少很多计算负担,对故障稳态分析影响不大。
代码层面的网络数据格式,我习惯用Matlab矩阵定义:
% 支路数据: [母线i, 母线j, R(ohm), X(ohm)] branch = [ 2 3 0.1650 0.0088 3 4 0.2210 0.0120 4 5 0.1130 0.0065 ... ]; % 母线数据: [编号, 有功负荷(kW), 无功负荷(kvar)] bus = [ 1 0.0 0.0 2 18.5 6.2 3 12.0 3.8 ... ];有了支路和母线数据,就可以构建节点导纳矩阵Ybus。这一步是所有后续计算的基础,WLS迭代里每次计算量测函数和雅可比矩阵都要用到它。
2.2 单相接地故障的电气特征与监测难点
低压配电网大多是中性点直接接地系统(TN-C、TN-S或TN-C-S),在这种系统里发生单相接地,本质上是相线通过故障点阻抗(电弧、接地电阻、接触电阻等)和电源构成短路回路。典型特征:故障相电压明显跌落,故障相电流骤增,非故障相电压基本维持相电压水平,中性线或保护接地线上出现明显的剩余电流。
监测方案要想捕捉这个故障,基本有两种思路:一是装设剩余电流保护装置直接检测漏电流;二是利用分布在各节点的电压、功率量测,通过状态估计来判断电网运行状态是否偏离正常工况、偏离发生在哪个区域。标题里的项目属于后者,它要回答的问题是:在量测误差随机波动的条件下,WLS状态估计器在单相接地前后给出的状态断面,能不能清晰反映故障相的电压跌落?估计值和真值之间差多少?这个误差会不会大到把故障特征淹没掉?
故障建模不复杂,可以在指定节点k把故障相通过接地阻抗Zf接到参考地:
% 故障节点 k, 接地阻抗 Zf Ybus(k,k) = Ybus(k,k) + 1/Zf;Zf取值对结果影响很大。我用过0.01Ω(金属性短路)到5Ω(带接地电阻的弧光短路)。金属性短路电压跌落非常明显,好估计但意义不大;接地电阻大的时候,电压跌落只有百分之几,这时候再叠加上量测误差,就能真正考验WLS的极限性能了。建议做性能评估时至少覆盖低阻和高阻两类故障场景,否则结论会过于乐观。
2.3 性能评价指标怎么定才不踩坑
蒙特卡洛跑完之后,不能只看一两个指标就下结论。我常用的指标组合是这些:
| 指标 | 公式 | 评估重点 |
|---|---|---|
| 估计偏差(Bias) | mean(x̂ - x_true) | 是否存在系统性偏离 |
| 估计标准差(Std) | std(x̂) | 随机误差的波动幅度 |
| 均方根误差(RMSE) | sqrt(mean((x̂ - x_true).^2)) | 综合误差水平 |
| 95%置信区间覆盖率 | mean(x_true 落在 x̂ ± 1.96σ 内) | 误差建模是否可信 |
| 最大绝对误差 | max(abs(x̂ - x_true)) | 最坏情况 |
只看RMSE是不行的。RMSE小但Bias也小,说明估计准确;RMSE小但Bias很大,可能是系统性偏差,反映了模型失配(比如线路参数不准或量测方差设置错误);RMSE大可能是随机波动,也可能是个别坏数据拉高。置信区间覆盖率则用来检验你给量测设置的方差是否真实——覆盖率远低于95%,说明你低估了误差;远高于95%,说明你方差给大了,估计器"过于保守",在实际工程中等于浪费了量测资源。
我在实际评估中还加了一个指标:故障相电压跌落量的估计误差。因为监测方案最终判断依据是故障特征量(电压跌落幅度),只评估通用状态精度还不够,要直接看关键特征量的误差能不能满足监测阈值要求。如果电压跌落了10%,而估计误差就达到±5%,那这个监测方案基本不可用。
3. WLS状态估计的核心实现细节
3.1 量测模型与误差假设
状态估计的第一步是建立量测方程。取状态向量x为所有PQ节点的电压幅值和相角(参考节点相角置0),量测向量z包含节点电压幅值、支路有功无功、节点注入有功无功。量测方程统一写成:
z = h(x) + e
其中h(x)是由网络方程决定的量测函数,e为量测误差向量。常规假设e为零均值高斯分布,误差协方差矩阵R为对角阵,对角元素是各量测的方差σ²。这个假设是WLS的理论基础,也是蒙特卡洛生成误差样本的依据。
量测方差怎么定?根据表计精度等级和互感器精度。对于低压台区,三相多功能表计电压量测的相对误差大约在0.5%~1%,功率量测误差在1%~3%。我通常用电压幅值σ=0.008pu(0.8%)、功率量测σ=2%这些数量级。注意一个坑:低压系统基准值小,用标幺值表达误差时要算清楚。
需要特别提一下"伪量测"(virtual measurement or pseudo-measurement)。在低压配电网里,很多节点是中间接线点,没有负荷也没有电源,它们注入功率严格等于零。这类节点的P=Q=0可以作为精度极高的伪量测参与估计,σ可以给到1e-4甚至更小。伪量测的作用是缓解量测不足问题,提高可观测性,是低压状态估计工程中最重要的技巧之一。
3.2 高斯-牛顿迭代与雅可比矩阵处理
WLS的目标函数是加权残差平方和:
min J(x) = [z - h(x)]^T R^{-1} [z - h(x)]
对J求梯度并令其为零,得到非线性方程组。用高斯-牛顿法迭代线性化求解,第k步迭代公式是:
Δx_k = (H^T R^{-1} H)^{-1} H^T R^{-1} [z - h(x_k)]
x_{k+1} = x_k + Δx_k
其中H是h(x)关于x的雅可比矩阵,每个量测对应一行。
雅可比矩阵的行向量根据量测类型不同而不同,这里写几个关键的(极坐标形式,θij = θi - θj):
电压幅值量测:
h_i = V_i
对应雅可比行:相角部分为0,幅值部分第i个元素为1,其余为0。
支路有功量测:
h_ij = V_i² g_ij - V_i V_j (g_ij cosθij + b_ij sinθij)
对θi和θj偏导、对Vi和Vj偏导都有解析表达式。实际编程时我建议用数值差分验证解析公式,至少测一次,避免手推公式抄错。
G = H^T R^{-1} H 称为信息矩阵(增益矩阵)。迭代收敛判据我用两种:一是Δx的无穷范数小于阈值(默认1e-6 pu),二是残差平方和J的下降量小于阈值。最大迭代次数设50,超过就按不收敛处理。
一个我在实际中踩过坑的地方:低压网R/X比高,目标函数地形比输电网复杂,平启动(所有电压幅值1.0、相角0)在部分负荷重、分支深的馈线上可能振荡不收敛。解决方法是调初值:先跑一次普通潮流(前推回代法),用潮流结果作为WLS迭代初值。也可以在高斯-牛顿步上加阻尼因子,即x_{k+1} = x_k + α Δx_k,α从1.0开始,J不降就减半。实践证明这两个方法都很有效。
3.3 权重矩阵、可观测性与冗余度
权重矩阵R^{-1}的物理含义很清楚:精度高的量测权重大,估计时更"信任"它。但权重不是越大越好。如果某个量测的方差被严重低估(实际误差比设定大得多),它的权重过高会把估计结果强拉向这个错误量测,反而破坏全局精度。所以,量测方差必须尽量和实际表计统计特性一致,这也是蒙特卡洛评估的一个重要副产品——它能帮你发现方差设置不合理的问题。
可观测性条件:G矩阵非奇异。对秩亏系统,即使迭代格式能算,结果也是数值噪声。我一般在正式蒙特卡洛前做一次可观测性分析:计算rank(G),检查cond(G),如果条件数过大(超过1e8),说明量测配置有问题。
对低压径向馈线,我发现一个规律:分支末端节点必须有量测,否则末梢状态由上游量测"推算"出来,方差会随着支路深度累积放大。理想配置是每个叶节点至少有一个电压幅值量测或注入量测。主干线上的状态估计精度通常很好,问题几乎都出在分支深处。
4. Matlab代码实现全流程
4.1 工程代码的组织架构
完整的仿真代码不是一个脚本跑到底,我建议按模块划分,便于调试和复用。一个清晰的文件清单如下:
case_lv_radial.m 网络数据定义(母线、支路、变压器出口) build_ybus.m 生成节点导纳矩阵 lv_powerflow.m 前推回代潮流,用于生成真值断面 gen_measure.m 给定真值断面,按误差模型生成量测数据 meas_fun.m 计算量测函数h(x)和雅可比矩阵H wls_lv.m WLS状态估计主函数 fault_inject.m 单相接地故障注入(修改网络导纳) monte_carlo_main.m 蒙特卡洛主循环 metrics_calc.m 性能指标计算这个结构的好处是:真值潮流、量测生成、状态估计互相独立,想替换任何一部分(比如把WLS换成加权最小绝对值鲁棒估计)只动一个函数,不牵连其他模块。
4.2 网络建模与量测真值生成
在跑蒙特卡洛之前,首先要有一个"真值断面"。这个真值不是量测来的,而是通过故障后的网络模型算出来的基准潮流解。步骤是:定义网络 → 注入故障(修改Ybus) → 运行潮流 → 得到故障后节点电压真值x_true → 由x_true计算所有量测真值z_true。
这个"先算真值再生成量测"的顺序很关键。蒙特卡洛里每一轮的量测都是在z_true上加随机误差,而状态估计的目标是尽量还原x_true。如果真值本身不可靠,后续所有统计都没有意义。
故障注入的代码很简短:
function Ybus = fault_inject(Ybus, fault_bus, Zf) % 在指定节点经阻抗Zf接地,单相接地简化处理 Ybus(fault_bus, fault_bus) = Ybus(fault_bus, fault_bus) + 1/Zf; end这里用的是单相等效模型。如果要做三相不平衡场景,需要把Ybus扩展到三相序分量,矩阵维度会膨胀三倍,但思路一致。
量测真值生成和加噪的核心代码:
function z = gen_measure(x_true, type, idx, sigma, seed) % type: 'V'电压幅值; 'PF'/'QF'支路功率; 'PI'/'QI'节点注入功率 z_true = meas_fun(x_true, type, idx); % 计算量测真值 rng(seed); z = z_true + sigma .* randn(length(z_true), 1); end这里的sigma向量长度和量测配置对应,每个量测的方差按3.1节原则设置。
4.3 WLS主迭代函数实现
WLS状态估计器本身逻辑不复杂,核心是一个高斯-牛顿循环。实际代码可以这样写:
function [x_est, converged, iter] = wls_lv(x0, z, type, idx, Ybus, R) % x0: 初值; R: 量测误差协方差矩阵(对角阵) R_inv = inv(R); x = x0; converged = false; for iter = 1:50 [h, H] = meas_fun(x, type, idx, Ybus); r = z - h; G = H.' * R_inv * H; dx = G \ (H.' * R_inv * r); x = x + dx; if max(abs(dx)) < 1e-6 converged = true; break; end end x_est = x; end这里最需要注意的是meas_fun里的雅可比矩阵H计算量。对一个45节点、量测数量在60~80左右的系统,单次迭代的H维度并不大,Matlab矩阵运算完全吃得住。蒙特卡洛500轮、每轮几十次迭代,总共几万次矩阵运算,跑完也就十几秒到几分钟的级别,性能不成问题。
如果发现收敛慢,我建议在G \ 那一步改用Cholesky分解或QR分解,数值稳定性更好。Matlab的\运算符内部会自动选择,但显式使用chol(G)能让你获得对数值状况的清晰感知——条件数太差时chol会直接报警。
4.4 蒙特卡洛主循环
主循环是整个项目的心脏。固定随机数种子保证可复现性是第一原则:
rng(2024); % 固定种子 M = 500; % 蒙特卡洛样本数 % 预分配结果矩阵 bias = zeros(n_meas_comp, 1); stdv = zeros(n_meas_comp, 1); rmse = zeros(n_meas_comp, 1); err_all = zeros(M, n_state); for m = 1:M for conf = 1:n_meas_comp % 1. 生成当前误差样本下的量测 z_m = z_true(conf) + sigma(conf) .* randn(n_meas(conf), 1); % 2. 状态估计 x_m = wls_lv(x0, z_m, type, idx, Ybus, R); % 3. 记录误差 err_all(m, :) = x_m - x_true; end end % 统计 bias = mean(err_all, 1); stdv = std(err_all, 0, 1); rmse = sqrt(mean(err_all.^2, 1));统计量计算的代码没什么可讲的,但样本量M的选取是值得说一说的。500次听起来很多,但如果要看95%置信区间的覆盖率,500次带来的统计波动仍然不小。我的做法是:先跑100次快速看一下结果量级,然后递增到500和1000,对比几次的统计量有没有明显漂移。如果1000次和500次结果接近,就可以放心用500次;如果还在抖,再加样本。这个"收敛性检查"过程本身,就属于蒙特卡洛方法在实践中必须的一步。
4.5 结果统计与可视化
计算结果不要只看数字。我习惯把不同量测配置和不同故障阻抗下的性能指标汇总成表格,再画箱线图展示误差分布形态。
figure; subplot(1,2,1); boxplot(err_all(:, v_fault_phase)); ylabel('故障相电压估计误差 (pu)'); xlabel('量测配置编号'); subplot(1,2,2); histogram(err_all(:, v_fault_phase), 50); xlabel('故障相电压估计误差 (pu)'); ylabel('频次');箱线图能很好地暴露异常值——那些远离箱体的点,很可能对应某次蒙特卡洛里生成的极端误差样本,这会提醒你检查是否出现了数值不稳定的特殊情况,而不是简单归结为"方差偏大"。
5. 跑仿真过程中踩过的坑
5.1 G矩阵奇异:末端节点量测不足
我最开始跑这个仿真时,量测配置只包含台区总表和两条主干线上的分支监测装置,故障设置在第4分支的末端节点。结果WLS迭代到第三步就直接警告矩阵接近奇异。原因很明确:第4分支末端没有任何量测,该节点的状态完全不可观测,信息矩阵G出现秩亏。
排查思路:检查量测数量和位置,用rank(G)和cond(G)辅助判断。解决办法是给叶节点补一个电压幅值量测(模拟末端智能电表)。补上去之后cond从1e14降到1e5以内,估计结果立刻稳定。
5.2 迭代发散:初值选择不当
另一个典型问题是低压重负荷条件下,全平启动时WLS迭代相角反复振荡,J指标不降反升。这跟R/X比值高有关,目标函数存在较窄的"山谷",平启动点离最优解太远,高斯-牛顿步容易跨过谷底。
解决方式就是前面说的:先用前推回代法算一次潮流(这个算法对径向低压网收敛性极好),把潮流结果作为WLS初值。改完之后,几乎再也没有遇到发散。我后来把所有蒙特卡洛场景都统一采用"潮流辅助初值",虽然多一次潮流计算,但换来的是整体可靠性。
5.3 蒙特卡洛结果抖动:样本量不够
第一轮蒙特卡洛只用M=100,连续跑五次,每次RMSE的数字都不一样,偏差符号都会变。原因很简单:100次样本的统计噪声太大,尤其是故障相电压跌落量的估计误差,受少数极端样本影响显著。
经验值:至少M=500,客户级的性能报告最好用M=1000。加样本量之后,统计量随意性明显下降。
5.4 坏数据把估计结果拉偏
蒙特卡洛中如果模拟了偶发的大误差(比如某台表计瞬时坏数据),WLS估计结果会整体偏离真值,RMSE被显著拉高。这在真实监测方案里是最危险的情况。
处理的办法是加一道标准化残差检验(LNR检验):每次WLS收敛后计算残差r = z - h(x̂),以及残差的协方差矩阵Ω = R - H G^{-1} H^T,然后算标准化残差r_N^i = |r_i| / sqrt(Ω_ii),超过阈值(通常取3.0)的量测判为坏数据,剔除后重新估计。我在代码里加了这段逻辑后,带坏数据的场景RMSE下降了一个数量级。
5.5 量测方差设置不合理
蒙特卡洛的置信区间覆盖率总是不对——覆盖率只有70%左右,远低于95%。查了半天发现是电压量测σ设成了0.0008pu而不是0.008pu,实际误差比设定大了10倍,权重虚高,置信区间过窄。这类问题如果不用蒙特卡洛验证根本发现不了,也是为什么标题里强调"性能分析以蒙特卡洛方式进行"的关键意义。
| 现象 | 可能原因 | 排查思路 | 解决建议 |
|---|---|---|---|
| 迭代发散或振荡 | R/X比值高、初值差 | 观察J曲线、迭代轨迹 | 潮流辅助初值、加阻尼步长 |
| 矩阵奇异 | 末端量测缺失 | rank(G)、cond(G) | 补叶节点量测、添加伪量测 |
| 估计结果系统性偏斜 | 量测方差设置错误 | 检查σ与表计精度 | 校准方差 |
| 个别样本误差巨大 | 坏数据污染 | 标准化残差检验 | 剔除坏数据后重估 |
| 统计量抖动 | 蒙特卡洛样本不足 | 对比不同M下统计量 | M≥500 |
| 覆盖率异常 | 误差模型与真实不符 | 计算95%置信区间覆盖 | 调整误差分布假设 |
6. 一些可以继续琢磨的方向
这套框架跑通之后,我发现它特别适合作为"量测配置优化"的试验床。你可以在蒙特卡洛循环外面再套一层优化,目标是"用最少的量测点满足监测精度要求",约束是每个配置组合下的RMSE不超过阈值。我试过一次,把台区原来27个测点砍到14个,故障电压跌落估计误差仍然控制在0.015pu以内,这对实际工程降成本是很有说服力的数据。
另一个值得扩展的方向是故障选线与定位。本项目评估的是状态估计性能本身,但在工程上,用户其实关心的是"故障在哪条分支"。可以在WLS估计结果的基础上,综合故障相电压跌落幅值、相邻量测的残差分布做启发式判据,判断故障点所在区域。蒙特卡洛评估的结论——误差分布、置信区间,恰恰可以作为故障判据阈值的设置依据。
还有一点想提醒大家:低压台的负荷曲线波动很大,分布式光伏接入以后,潮流方向还会反转。你在这个模型里用的恒功率负荷和单相模型,只是为了把问题焦点集中在"测量误差影响下的WLS性能"上,如果要做真实现场部署,需要升级成三相四线模型并考虑负荷不确定性。到时候蒙特卡洛的随机源就不只是量测误差了,还包括负荷预测误差和光伏出力的随机性,思路一样,模型复杂度会上去不少。
如果把这段路程做一个总结,最核心的心得是:状态估计的性能验证,不能靠一两组数据说事,必须构建"真值断面 + 随机量测 + 统计评估"的完整闭环。而在这套闭环里,WLS给了你一个逻辑清晰的数学走线,径向馈线模型给了你一个看得见摸得着的测试场地,蒙特卡洛给了你把"随机"变成"统计"的方法武器。顺着这个路线走,你不仅能回答"监测方案准不准",还能回答"误差从哪来,怎么控,怎么配置才能达到要求"。这比单纯跑通一个算法有价值得多。