做低压配电网监测仿真的朋友,一定遇到过这个尴尬:算法在单次算例里表现挺好,换个测量噪声样本就崩,最后审稿人或者导师来一句“你这个性能结论到底可不可信”。这个问题我前阵子做“基于WLS状态估计器的低压配电网单相接地监测方案性能分析”时感触特别深——方案本身不难,难的是把“测量误差的随机性质”这件事科学地处理掉,而这正是蒙特卡洛方法的主场。这篇文章我会从径向低压测试馈线的建模说起,把WLS状态估计器的原理、量测方程、权重设置、蒙特卡洛试验设计以及完整的Matlab实现思路全部拆开讲清楚,希望对正在做配电网状态估计、单相接地故障监测或者低压网络仿真评估的同行有点实际帮助。
需要说明的是,我下面聊的是个很常见的工程研究套路:在一个辐射状的(径向)低压测试馈线上搭建监测方案,用加权最小二乘(WLS)估计器去估计系统的运行状态,然后因为实际测量装置总带有随机误差,所以用蒙特卡洛方式重复大量随机试验来统计评估这个估计器的性能,最终判断监测方案是否稳定可靠。对刚入门分布式状态估计的研究生来说,这套流程应该能直接套用。
1. 低压配电网单相接地监测,为什么偏偏要上状态估计器
1.1 低压配电网监测和输电网监测的差异,到底有多大
输电网那边,PMU加上SCADA布点相对齐全,网络拓扑也相对清晰,状态估计已经是非常成熟的技术。但我们做低压配电网(LVDN)的时候,面对的完全是另一种处境:从配电变压器出来到用户表箱,线路短、分支多、三相不平衡严重,而且高压侧那套量测体系根本覆盖不到末端。很多低压台区只有变压器出口一个测量点,再往下几乎就是“盲区”。
更要命的是低压网络的电气特征。低压馈线的电阻和电抗比值(R/X)比中高压网络大得多,这意味着有功和无功的耦合关系特别强,不能用高压网络里常用的解耦简化策略。而且低压侧大量单相负荷、单相分支的存在,让三相电流天然不平衡,你拿对称分量法去套正序网络,往往会和实测对不上。
单相接地监测这个需求就更特殊了。低压系统的单相接地故障不像高压那么“猛烈”,故障电流受接地电阻、接触电阻、土壤回流路径等因素限制,有时候微弱到常规过流保护根本不会动作。可它又是低压电网里最常见、最容易引发电击和绝缘事故的故障类型。想靠几个离散的测量点直接判断“某个分支发生单相接地”基本不可能,工程上的思路其实是换个角度:先通过少量量测把整套系统的运行状态(各节点电压幅值和相角)尽可能准确地估计出来,再根据状态量的异常偏移、残差分布或者零序分量的变化来判断监测事件。状态估计器在这里不是简单地“算一个数”,而是把一个欠定、含噪的监测问题转化成统计意义上的最优化问题。
1.2 从“测得到”到“估得准”:WLS在这个场景里承担什么角色
你可能会有疑问:低压配电网直接装一堆传感器不就行了吗?现实是经济上不允许,而且很多地方根本没有合适的通信与安装条件。所谓监测方案,本质上是在“少量量测+高噪声”的条件下,用算法去补全看到的信息。WLS状态估计器就是一个典型的补全工具:给出系统的网络参数、拓扑结构、量测向量以及量测误差的统计特性,它输出一套最符合量测数据的系统状态。
把这个状态估计器嵌套进单相接地低压电网监测方案,逻辑是闭环的:正常运行时,各路量测能算出稳定的状态估计值;某个分支发生单相接地后,等效的零序阻抗变化、负荷侧的电压分布变化会反映到局部量测上,WLS估出的状态和真实状态之间虽然都存在误差,但在统计分布上会产生可识别的偏移。于是整个监测方案的性能好不好,就转化为“在随机量测误差干扰下,状态估计结果能不能可靠地区分正常工况和接地故障工况”。
这就是为什么标题里同时出现了“WLS状态估计器”“蒙特卡洛”“低压配电网”“单相接地”这几个概念:状态估计器是方案的核心算法,蒙特卡洛是验证方案性能的手段,而单相接地低压电网则是整个方法的落点场景。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 径向测试馈线里的WLS状态估计:数学模型与权重设置
2.1 WLS状态估计的数学框架:目标函数与迭代解
WLS的出发点是最小二乘思想:既然量测向量 z 和状态向量 x 之间存在非线性映射关系
z = h(x) + e
其中 e 是量测误差,那么我们就找一组状态 x,使得加权残差平方和最小。目标函数写成
J(x) = [z - h(x)]ᵀ · R⁻¹ · [z - h(x)]
这里的 R 是量测误差协方差矩阵。如果量测误差之间互不相关,R 就是一个对角阵,对角线上的元素就是每个量测的方差。权重矩阵 W = R⁻¹ 会把那些精度高、方差小的量测放在更重要的位置。
因为是非线性问题,WLS通常用高斯-牛顿法迭代求解。记 H 为量测函数 h(x) 对状态变量 x 的雅可比矩阵,每次迭代求解线性方程组
Δx = (Hᵀ W H)⁻¹ Hᵀ W [z - h(x)]
然后把状态更新为 x ← x + Δx,直到 Δx 的范数小于设定的收敛阈值。这个公式是几乎所有WLS状态估计程序的核心,后面Matlab实现部分也是围绕它展开的。
迭代格式里有一点值得仔细体会:信息矩阵 G = Hᵀ W H 是否病态,直接决定了迭代能不能收敛、收敛得快不快。低压径向网络由于线路阻抗小、R/X大,信息矩阵的条件数通常比高压网络更差,这也是为什么低压WLS的数值稳定性需要专门留意。
2.2 径向馈线建模与量测方程怎么列
径向馈线的拓扑很直观:从配电站或配变低压母线出发,一个节点只有唯一的父节点向下逐级供电,没有环路。这种拓扑对前推回代潮流非常友好,但对WLS状态估计而言,最重要的影响是雅可比矩阵的结构会呈现明显的稀疏树状分布。
状态变量一般选除参考节点外各节点的电压幅值 V 和相角 θ。在低压单相等效模型下,设有 N 个节点,参考节点在变压器出口,它的相角固定为0,那么状态向量 x 的维度是 2N - 1。如果做三相模型,则每个节点在三相上各有幅值和相角,状态维度会扩大到 3 × (2N - 1),实际写代码时只要把维度索引处理好,算法本身没有本质区别。
量测方程需要覆盖三类典型量测:
- 节点电压幅值量测:Vᵢ ≈ Vᵢ,true,这是最常见也是最直观的。
- 节点注入功率量测:Pᵢ、Qᵢ,需要按潮流方程计算与相邻节点电压的关系。
- 支路功率/电流幅值量测:这是径向馈线上最有价值的量测类型,因为单相接地导致负荷偏移时,靠近故障点的支路量测往往最先变化。
如果采用标幺值,支路功率量测方程可以写成如下形式
Pᵢⱼ = Vᵢ²g - VᵢVⱼ(g cosθᵢⱼ + b sinθᵢⱼ)
Qᵢⱼ = -Vᵢ²b - VᵢVⱼ(g sinθᵢⱼ - b cosθᵢⱼ)
其中 g、b 是支路串联导纳,θᵢⱼ = θᵢ - θⱼ。节点注入功率则是该节点所有相连支路功率之和。这段公式虽然看着繁,但写进Matlab前一定要把标幺值单位统一好,否则后续算雅可比矩阵和残差时会非常痛苦。
2.3 权重矩阵的构成原则和容易踩的坑
权重矩阵 W 在很多教材里一句话就带过了——“取量测误差方差的倒数”。但实际写代码的时候,噪声标准差的取值是个真正影响结果的决定性因素。我自己的习惯是先看量测装置的类型给个典型标准差范围:
| 量测类型 | 典型相对误差 | 说明 |
|---|---|---|
| 电压幅值量测(微型PMU / 电压传感器) | 0.1% ~ 0.5% | 精度通常较高 |
| 支路电流幅值量测 | 0.5% ~ 2% | 受电流互感器和采样影响较大 |
| 节点注入功率量测 | 1% ~ 3% | 低压侧功率计算误差往往偏大 |
| 零序/泄漏电流监测 | 2% ~ 5% | 故障监测场景常见,误差来源多 |
把这些误差换算到标幺值之后,再取平方倒数生成权重。这里有一个很多人会忽略的坑:不同量测类型的基准值不同。电压的标幺误差和功率的标幺误差不在一个数量级上,如果你直接把有名值误差代入计算,权重矩阵可能被电压量测完全主导,支路功率量测几乎不发挥作用,最终状态估计的精度反而下降。正确做法是全部统一到标幺值体系后再算权重。
另外一个我强烈建议的做法是:权重矩阵不要从头到尾固定不动,可以在迭代几次后根据残差做一次自适应标定。虽然在纯理论研究里固定权重是标准做法,但在低压监测场景中,接地故障瞬间部分量测会变得非常不可靠,适当降低异常量测的权重能让估计器更稳健。当然,如果你的目标只是做蒙特卡洛性能评估,固定权重会更方便统计对比。
3. 蒙特卡洛试验设计:噪声随机性下的性能评估逻辑
3.1 为什么单次仿真结果不值得作为性能结论
我记得第一次做仿真时,跑一个场景,WLS估计出来的电压曲线和真值几乎重合,误以为方案性能好到不行。后来换了另一组随机噪声,结果偏差一下子大了好几倍。这个现象背后的道理其实很直白:量测误差是随机变量,你单次给的是某个随机样本的实现,它可能落在误差很小的“幸运区”,也可能落在误差很大的“倒霉区”。单次仿真本质上只是抽样了一个样本,不能代表估计器的统计性能。
蒙特卡洛方法解决的就是这个问题。它不追求在一次仿真里得到精确结果,而是反复生成大量随机的量测噪声样本,对每个样本分别执行一次完整的WLS状态估计,然后汇总几百上千次试验的结果,用统计量来描述估计器的表现。你在论文或报告里写“状态估计器在1000次随机试验中电压误差均值XX、均方根误差XX”,这才是有统计意义的结论。
3.2 样本数、随机数种子与收敛判据
蒙特卡洛试验里最常被问到的问题是:到底跑多少次才够?这个没有绝对标准,但根据我的经验,低压配电网模型节点不算多、WLS迭代速度快,500次就能看到比较稳定的统计量,1000到2000次完全够用。你要是追求严谨,可以把样本数从200、500、1000、2000分别跑一遍,观察估计结果的均方根误差RMSE是否随样本数增加而趋于平稳,如果RMSE波动明显减小,就说明样本量基本满足要求。
随机数生成器的控制也是个容易忽略的细节。Matlab里先用 rng(2024) 类似的语句固定随机种子,可以保证每次运行代码得到完全相同的蒙特卡洛试验序列。这件事在调试阶段价值极高——你不会希望每次跑脚本都得到不同的结果,导致排查代码错误时无从对照。
收敛判据方面,WLS迭代常用状态修正量的无穷范数来判断,比如 norm(dx, Inf) < 1e-6。但蒙特卡洛循环里,要多加一个状态检验:某次试验如果迭代超过最大次数仍未收敛,不能直接把这个坏结果丢掉,而是要记录该次试验的迭代次数和收敛标志。统计阶段你可以选择报告“收敛率”,也可以把所有未收敛试验剔除后单独分析。千万不要默默把未收敛结果留在统计样本里,那会严重污染误差统计值。
3.3 针对监测方案的量化指标怎么选
既然标题强调的是“监测方案性能”,光报状态估计的电压误差是不够的,还得把状态估计误差和监测结论联系起来。我通常同时统计两类指标:
第一类是纯状态估计指标。主要包括状态量误差的均值、标准差和均方根误差。均值和标准差分别反映估计器的偏差和波动性,RMSE则把两者合并成一个综合指标。这些指标能展示WLS在低压径向馈线上对真实运行状态的还原程度。
第二类是监测性能指标。既然目标是单相接地监测,每一步蒙特卡洛试验都要在两种工况下分别执行:正常工况和发生单相接地工况。如果监测方案是通过状态估计残差或者某个检测统计量来判断故障,那么就要统计检测率和误报率。例如,设定一个门限后,故障工况下有多少比例被识别为故障,这就是检测率;正常工况下有多少比例被误判为故障,这就是误报率。WLS估计器本身不是检测器,但它输出的状态和残差是检测器的输入,所以状态估计误差的统计特性会直接传导到监测性能上。
实际操作中,我会把蒙特卡洛试验按“场景”组织:外层循环遍历不同故障位置、故障过渡电阻、负荷水平,内层循环针对每个场景做大量随机噪声试验。这样得到的结果是一张性能表,能清楚看出方案在哪些故障条件下表现稳定、在哪些条件下性能衰减。
4. Matlab仿真框架与关键代码拆解
4.1 输入数据结构和总体仿真流程设计
Matlab写这类仿真,代码组织比算法本身更重要。我习惯把工程拆成四个模块:网络数据模块负责定义馈线结构和线路参数;真值计算模块负责求取一组没有量测噪声的“理想状态”,并以此为基准生成量测真值;WLS求解模块实现核心迭代;蒙特卡洛统计模块负责批量试验和指标汇总。
网络数据模块用一个8节点单相等效径向馈线举例:节点1是配变出口,节点2到节点8是负荷节点,支路呈树状逐级向外延伸。线路阻抗和负荷参数写在一个结构体数组里。节点数和支路数一多,用硬编码数组容易出边界错误,所以我在代码里只用连边数组表示拓扑:
matlab复制% 网络拓扑:radial feeder,8个节点,7条支路
% branch(k,:) = [from_node, to_node, r_pu, x_pu]
branch = [
1 2 0.008 0.004
2 3 0.010 0.005
2 4 0.012 0.006
3 5 0.015 0.007
3 6 0.011 0.005
4 7 0.013 0.006
6 8 0.014 0.007
];
这部分看起来简单,但恰恰是最容易埋雷的地方。低压馈线支路很短,阻抗标幺值非常小,如果某个数位写错,信息矩阵很容易病态。我每次建模后都会先跑一次潮流,把节点电压范围和支路功率分布打印出来肉眼检查一遍,确认没有明显不合理的结果再继续。
4.2 WLS状态估计核心函数:迭代求解与雅可比
下面这个函数是整套代码的心脏。它接收量测向量、权重矩阵、网络数据和初值,输出状态估计结果、迭代次数和收敛标志。为了避免手动推导复杂雅可比矩阵时出错,我在这里采用中心差分法数值计算雅可比矩阵,这在节点规模不特别大的低压测试馈线上非常实用。
matlab复制function [x_est, iter, converged] = wls_solver(z, W, nbus, branch, x0)
n_state = 2 * nbus - 1; % 第1个节点为平衡节点,相角固定为0
x = x0(:);
max_iter = 30;
tol = 1e-6;
converged = false;
for iter = 1:max_iter
hx0 = compute_measurement(x, nbus, branch);
H = numerical_jacobian(x, nbus, branch);
r = z - hx0; % 量测残差
G = H.' * W * H; % 信息矩阵
G = (G + G.') / 2; % 强制对称,避免数值误差破坏矩阵结构
dx = G \ (H.' * W * r);
x = x + dx;
if norm(dx, Inf) < tol
converged = true;
break;
end
end
x_est = x;
end
function H = numerical_jacobian(x, nbus, branch)
n_state = length(x);
n_meas = length(compute_measurement(x, nbus, branch));
H = zeros(n_meas, n_state);
eps0 = 1e-6;
for j = 1:n_state
xp = x;
xm = x;
xp(j) = x(j) + eps0;
xm(j) = x(j) - eps0;
H(:, j) = (compute_measurement(xp, nbus, branch) - ...
compute_measurement(xm, nbus, branch)) / (2 * eps0);
end
end
有人可能觉得数值差分不如解析雅可比“高级”,但在配电网WLS原型验证阶段,它的优势是非常明显的:只要量测函数写对了,雅可比矩阵的正确性就有保证,不会因为在推导偏导数时漏掉某个链式法则项而浪费大量调试时间。等整套蒙特卡洛流程跑通后,如果确实需要提高计算效率,再换成解析雅可比或者利用Matlab的符号工具箱生成导数代码也不迟。
compute_measurement 函数内部就是前面提到的三类量测方程,这里不逐段贴全部代码,但我强烈建议在函数开头加注释说明输出向量的排列顺序。否则量测索引一旦对不上,后续蒙特卡洛循环里的统计指标会全部错位。我自己的教训是:所有量测向量按“电压量测、注入有功、注入无功、支路有功、支路无功”的顺序拼接,并对每个量测维护一个 meas_type 向量记录类型,后面做坏数据辨识时再按类型分组处理。
4.3 蒙特卡洛主循环与统计指标:误差均值、标准差的正确聚合方式
有了WLS求解函数,蒙特卡洛主循环的骨架并不复杂。关键是把每个试验的状态误差记录下来,而不是只记一个RMSE大字。下面给出一个可复用的循环框架:
matlab复制rng(2024); % 固定随机种子,保证结果可复现
N_mc = 1000; % 蒙特卡洛次数
err_mat = zeros(N_mc, n_state);
iter_rec = zeros(N_mc, 1);
conv_rec = false(N_mc, 1);
for mc = 1:N_mc
% 基于真实状态生成含噪量测
z_true = compute_measurement(x_true, nbus, branch);
z = z_true + sigma_vec .* randn(size(z_true));
% 调用WLS求解
x0 = x_init; % 可选的随机化初值方案
[x_est, iter_rec(mc), conv_rec(mc)] = wls_solver(z, W, nbus, branch, x0);
if conv_rec(mc)
err_mat(mc, :) = x_est.' - x_true.';
else
err_mat(mc, :) = NaN; % 未收敛试验单独标记
end
end
% 只统计收敛试验
converged_idx = conv_rec;
bias_est = mean(err_mat(converged_idx, :), 1, 'omitnan');
std_est = std(err_mat(converged_idx, :), 0, 1, 'omitnan');
rmse_est = sqrt(mean(err_mat(converged_idx, :).^2, 1, 'omitnan'));
conv_rate = sum(conv_rec) / N_mc;
这里有一个值得说清楚的点:误差统计是逐状态量进行的,所以最终得到的是每个节点电压幅值和相角的偏差、标准差和RMSE序列。如果你想输出一个总指标,可以对所有电压幅值节点的RMSE再求平均,但一定要在报告里注明统计口径。我见过把电压幅值和相角混在一起算综合RMSE的论文,数值上相角误差只要乘以一个基准值就能显得很大或者很小,特别容易误导读者。
故障工况的蒙特卡洛试验是另一套循环,但它和正常工况的差别只是真实状态和量测向量不同。实现时可以把正常和故障的两套试验封装为同一个统计函数,唯一改变的是生成 z_true 之前的网络工况参数。这样代码复用度高,也不容易出现两套逻辑不一致的问题。
5. 结果怎么读,以及那些绕不开的坑
5.1 一组典型径向低压馈线算例的统计表现
按照前面的8节点径向低压馈线,我做了一个正常工况下的蒙特卡洛试验序列。量测配置是:节点1电压幅值量测、节点4和节点7电压幅值量测、支路1-2和支路3-5的有功无功量测、节点2和节点6的注入有功量测。量测噪声按第2.3节表格的典型范围设定。
1000次试验收敛率为100%,电压幅值估计误差的均值在0.05%以内,RMSE大约0.12%,相角估计误差RMSE在0.02度左右。这个结果符合预期:低压径向馈线上电压量测精度高时,WLS能把节点电压还原得相当准。单相接地故障工况下,如果故障过渡电阻较小,状态偏移足够明显,检测统计量可以稳定区分故障与否;但过渡电阻升到几十欧姆以后,检测性能明显下降,误报率开始上升。这类趋势非常典型——不是所有单相接地故障都能被轻松监测到,蒙特卡洛分析的价值就在于让你量化出“在什么条件下还能信、在什么条件下不能信”。
5.2 迭代发散和矩阵病态:我实测中遇到最多的三类问题
跑WLS蒙特卡洛时最让人头疼的就是偶尔冒出的发散或NaN结果。根据我的经验,问题通常不是算法理论错了,而是出在下面三类细节上。
第一类是初值选得太差。低压网络非线性不算特别强,但如果初值偏离真实值太远,高斯-牛顿迭代可能跑到数值溢出。解决办法是先用平启动(所有节点电压幅值为1.0pu,相角为0)作为初值,这个方法简单而且对径向馈线非常有效。
第二类是权重矩阵数值差异过大。电压量测误差如果是0.1%,功率量测误差是2%,换算成权重后差距会达到几百倍,信息矩阵的条件数会变得非常大。此时迭代可能每一步都在正常下降,但求解线性方程组时数值误差已经污染了结果。如果遇到这种情况,可以先把信息矩阵做条件数检查,或者在对角元上叠加上一个小正则项(比如1e-8)再求解。
第三类是功率量测方程在高R/X低压网络里容易让雅可比矩阵在部分节点上出现近似的线性相关性。辐射网本身可观测性一般能满足,但如果某个末端节点只有一条支路和一个注入量测,信息矩阵在对应方向上会非常“软”,状态估计结果方差变大。此时最好的办法不是修改算法,而是增加一个电压幅值量测或者支路电流量测来增强局部可观测性。这也解释了为什么低压监测方案通常都会在末端关键节点布置电压传感器。
下面这个表是我调试过程中总结出的常见现象和处置手段,算是踩坑备忘录:
| 现象 | 可能原因 | 建议处理 |
|---|---|---|
| 个别蒙特卡洛试验不收敛 | 权重矩阵条件数过大 | 检查标幺值是否统一,加小正则项 |
| 估计误差始终偏大且均值不接近0 | 某个量测存在系统性偏差 | 检查量测真值计算是否正确,排查接线错误 |
| 电压RMS正常但相角RMS异常 | 参考节点索引错位 | 核对状态向量中θ和V的排列顺序 |
| 所有试验收敛但结果完全相同 | 随机噪声未生效 | 检查是否忘了加噪声项或固定了随机数 |
| 检测率极高但误报率同样极高 | 监测门限设置过低 | 用蒙特卡洛统计结果画ROC曲线重新选门限 |
5.3 故障场景的随机性也要纳入蒙特卡洛
我要补充一个很多人做监测方案评估时容易忽略的点:单相接地故障本身也有随机性,不能只把量测噪声随机化。故障发生位置、过渡电阻、故障初相角、负荷水平这些参数,在真实电网里每次发生都不尽相同。如果蒙特卡洛只随机化量测误差,得到的性能结论只是“在某个固定故障条件下的性能”,而不是“方案在实际运行中的整体性能”。
比较稳妥的做法是分两层随机化。第一层随机抽取故障场景参数,例如过渡电阻在对数均匀分布上抽取、故障节点按概率抽取、负荷水平在额定值上下浮动;第二层再针对每个场景进行量测噪声的蒙特卡洛试验。这样最后统计出来的检测率和误报率就带有了场景分布的加权含义。代价是计算量成倍上升,但对低压小网络来说,Matlab里跑几千次WLS通常也就几十秒,完全承担得起。
6. 从仿真代码到报告结论之间,我的一点实操体会
最后还想聊几句代码之外的体会。整套流程跑通以后,我最大的感受是:Matlab代码实现的难点不在于WLS迭代那几行,而在于工程细节的排列组合。量测向量顺序、标幺值换算、权重矩阵构造、随机数种子、未收敛试验处理,任何一个环节出错,最终统计出来的结论都可能是错的,而且这种错还特别隐蔽,因为均值、标准差看起来都有模有样,只有结果明显不合常理时才会暴露。
我自己的习惯是每跑一组新的蒙特卡洛试验前,先跑一次不加噪声的量测。如果WLS能从无噪量测中完美恢复真实状态,说明测量函数、雅可比矩阵初值都是通的;再加噪声,如果RMSE大致落在预期误差范围内,说明噪声注入和权重设置是对的;最后才做故障场景。这套从无噪到有噪、从正常到故障的递进式验证,帮我省下了大量排查低级错误的时间。
如果你计划在低压配电网单相接地监测方向继续深入,一个值得做的扩展是把WLS替换成鲁棒估计器或者卡尔曼滤波类方法,然后在同一套径向测试馈线和同一套蒙特卡洛框架下做对比。因为整个试验框架是通用的,换算法只是换一个求解核心函数,统计对比会非常方便。蒙特卡洛这套东西一旦搭好,后续所有基于量测噪声的性能评估都能直接复用,这也是我把它从具体项目里抽出来写成这篇文章的原因。
