ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

电力系统动态状态估计中EKF与UKF的Matlab仿真实现与对比

电力系统动态状态估计中EKF与UKF的Matlab仿真实现与对比 电力系统动态状态估计里EKF和UKF属于那种名字人人都听过但真正能把Matlab代码跑通并解释清楚每一步在干什么的人其实不多的工作。我刚把整套仿真完整实现了一遍从发电机动态模型、量测方程到两种滤波器的递推代码、再到故障扰动场景下的对比实验中间踩了不少坑。这篇文章就把这条线从头到尾串起来给同样在搞这个方向的同学一个可以直接参考的完整版本。这篇内容适合两类人一类是正在做课程设计或毕业设计需要从零搭建基于EKF/UKF的电力系统动态状态估计仿真框架另一类是刚接触调度自动化想搞明白动态状态估计和传统静态估计到底差在哪里的工程技术人员。我会把数学模型、核心代码、参数设置思路和实际操作中容易翻车的细节都写出来代码尽量只用Matlab基础函数R2020之后的版本基本直接能跑。1. 为什么动态状态估计比潮流计算的升级版更值得关注1.1 静态估计的局限一个时间断面解决不了全过程很多刚接触这个领域的人会有一个疑问电网调度中心不是早就有状态估计了吗为什么还要研究动态状态估计确实传统EMS里的状态估计已经运行了很多年但它的核心是基于加权最小二乘WLS在一个时间断面上求解。简单说就是拿某一时刻所有量测数据去拟合出一个满足潮流方程的系统状态解。这种做法在稳态运行下没有问题但它的短板也很明显每个断面独立计算完全不利用时间维度的信息。一旦系统进入动态过程比如负荷突增、发电机跳闸、新能源出力快速波动WLS只能给你一个又一个孤立的快照而且每次都需要重新迭代求解。更麻烦的是当量测存在不良数据或者某几条线路量测缺失时静态估计的结果会明显畸变又没有历史轨迹可以参照纠正。1.2 动态估计的定位在时间轴上预报加校正动态状态估计解决的是另一个层面的问题它不再把每个时刻当成独立断面而是把系统状态看作一条随时间连续演化的轨迹用上一拍的状态加上系统动态模型来预测下一拍的状态再用当前量测对预测值进行修正。这就是经典的预测-校正闭环结构。这种思路带来两个直接好处第一量测短暂丢失时估计器还能依靠模型预报顶着走一段不会马上失效第二量测噪声被模型平滑掉很大一部分估计结果比单断面拟合更干净。而真正让动态状态估计在工程上变得可行靠的是PMU同步相量量测的普及高帧率同步数据让时间维度的建模有了用武之地。1.3 为什么选EKF和UKF而不直接上粒子滤波电力系统模型本质上是非线性的所以线性卡尔曼滤波没法直接用。非线性系统滤波最经典的三个路线是EKF、UKF和粒子滤波PF。粒子滤波精度高但计算量巨大在PMU百赫兹量测速率下做实时估计基本不现实。EKF和UKF在中小规模系统上可以满足计算实时性要求Matlab实现也相对成熟所以科研和工程验证里最常见的就是它们两个。拿我自己实现的场景来说单机无穷大系统状态只有三维UKF的计算量比EKF大三四倍但依然在毫秒级完全不影响实时性。这也是为什么我最终选定EKF和UKF作为对比方案——两者在原理上刚好是两个方向一个靠解析求导做线性化一个靠采样点传播非线性放在一起对比恰好能说明很多滤波器的本质问题。2. 发电机动态模型与量测方程先把被估计对象搞干净2.1 三阶实用模型从转子运动方程到暂态电势动态状态估计的第一步不是写滤波器而是把被估计对象的数学模型写清楚。我选的是最常用的发电机三阶实用模型状态向量取三个物理量功角δ、转速偏差Δω、q轴暂态电势Eq。写成连续时间状态方程就是[ \frac{d\delta}{dt} \Delta\omega ][ \frac{d\Delta\omega}{dt} \frac{1}{M}(P_m - P_e - D\Delta\omega) ][ \frac{dE_q}{dt} \frac{1}{T_{d0}}(E_{fd} - E_q - (x_d - x_d)I_d) ]这里面几个参数的物理含义要清楚M是发电机惯性时间常数折算后的标幺惯性D是阻尼系数Td0是励磁绕组时间常数x_d和x_d分别是同步电抗和暂态电抗E_fd是励磁电压。用生活化类比来说第一行方程是说功角的变化率就是转速偏差第二行方程就是牛顿第二定律在转子上的体现——机械功率和电磁功率不平衡就产生加速度第三行描述的是励磁绕组这个大电感里的磁链不能突变所以暂态电势是逐渐变化的。这套模型抓取了转子运动动态和励磁动态两个关键时间尺度在动态状态估计的入门和中等精度场景下都非常适用。2.2 单机无穷大系统下的量测方程状态方程决定了状态怎么演化量测方程决定了我们从外部能观测到什么。在我的仿真中量测量取PMU最容易提供的两个电气量发电机输出的有功功率P_e和无功功率Q_e。在单机无穷大系统的简化模型下它们和状态变量之间有明确的解析关系[ P_e \frac{E_q V_b}{X_{\Sigma}} \sin\delta ][ Q_e \frac{E_q^2 - E_q V_b \cos\delta}{X_{\Sigma}} ]其中V_b是无穷大母线电压X_Σ是暂态电抗加上变压器和线路的总电抗。这两个式子是从发电机注入无穷大母线的复功率推导出来的推导过程不复杂先写出电流相量再做共轭相乘取实部虚部就能得到。关键是它告诉了我们一件事——量测方程是强非线性的δ通过正弦函数进入P_e这让滤波器的设计无法回避非线性处理。我在实现时把这两个量测都加了独立高斯噪声标准差取0.005标幺值。PMU的典型幅值测量精度一般在0.1%到0.5%之间这个噪声水平大致对应中等偏严苛的工况不会让滤波变成纯粹的拟合噪声也不会让量测完美得看不出滤波器的差别。2.3 连续方程的离散化离散步长决定滤波器性能上限扩展卡尔曼滤波和无迹卡尔曼滤波处理的对象是离散时间系统所以连续状态方程必须离散化。最常见的做法是一阶欧拉近似[ x_{k1} \approx x_k T_s f(x_k) ]还有一种更精细的做法是二阶Runge-Kutta也叫Heun方法[ k_1 f(x_k), \quad k_2 f(x_k T_s k_1) ][ x_{k1} x_k \frac{T_s}{2}(k_1 k_2) ]采样步长Ts的选择直接影响滤波器性能上限。我用的是Ts10ms对应PMU常见的100Hz量测帧率。在这个步长下一阶欧拉也能跑出不错的效果但我在滤波器内部统一用了二阶Runge-Kutta来传播状态这样可以把数值积分误差从二阶降到三阶避免离散化误差被误认为是滤波器性能差。2.4 噪声矩阵Q、R和初始协方差P0的物理标定卡尔曼滤波器的调参核心就是三个矩阵过程噪声协方差Q、量测噪声协方差R、初始状态协方差P0。很多新手在这里随便给一组数结果滤波效果一塌糊涂还不知道问题出在哪。我的经验是从物理意义出发给初始值。量测噪声R最容易定它直接对应PMU的测量精度我取P_e和Q_e的标准差都是0.005标幺所以Rdiag([2.5e-5, 2.5e-5])。过程噪声Q反映的是模型一步预测的不确定度比如δ在两个采样点之间的变化量大致是Δω×Ts如果Δω正常波动范围在0.05 rad/s附近那么δ的预测不确定度约0.0005 rad方差量级就是2.5e-7但实际工程中还有负荷随机波动等未建模动态所以Q不能取得太小我给的是Qdiag([2.5e-5, 1e-4, 2.5e-5])比纯理论值放宽一到两个数量级。P0则根据初始状态误差的估计来定如果功角初始偏差可能达到0.2 rad那么P0(1,1)取0.04量级。3. EKF实现细节每一步都在算雅可比矩阵3.1 EKF的标准递推流程扩展卡尔曼滤波的本质就是把非线性模型在当前状态附近做一阶泰勒展开然后用线性卡尔曼滤波的框架做预测和更新。它的标准流程是五步状态预测、协方差预测、量测预测、滤波增益计算、状态与协方差更新。用公式写出来就是[ x_{k|k-1} f(x_{k-1}) ][ P_{k|k-1} F_k P_{k-1} F_k^T Q ][ K_k P_{k|k-1} H_k^T (H_k P_{k|k-1} H_k^T R)^{-1} ][ x_k x_{k|k-1} K_k (z_k - h(x_{k|k-1})) ][ P_k (I - K_k H_k) P_{k|k-1} ]这里F_k和H_k分别是状态方程和量测方程在最近估计点处的雅可比矩阵。注意一个顺序问题F_k在上一时刻的滤波值x_{k-1}处计算而H_k应该在预测值x_{k|k-1}处计算。这个顺序我一开始搞反过导致初始阶段误差明显偏大——线性化点选的不一样结果会差很多。3.2 雅可比矩阵的解析推导F和H到底长什么样EKF实现最繁琐的部分就是求雅可比矩阵。以我用的三阶发电机模型为例连续状态方程的雅可比矩阵A是3×3矩阵在点x[δ, Δω, Eq]处求值为[ A \begin{bmatrix} 0 1 0 \ -\frac{E_q V_b \cos\delta}{M X_\Sigma} -\frac{D}{M} -\frac{V_b \sin\delta}{M X_\Sigma} \ -\frac{(x_d - x_d) V_b \sin\delta}{T_{d0} X_\Sigma} 0 -\frac{1}{T_{d0}} - \frac{x_d - x_d}{T_{d0} X_\Sigma} \end{bmatrix} ]离散化后的状态转移矩阵F用一阶近似就是F≈ITs×A。量测雅可比H是2×3矩阵由P_e和Q_e对状态求偏导得到[ H \begin{bmatrix} \frac{E_q V_b \cos\delta}{X_\Sigma} 0 \frac{V_b \sin\delta}{X_\Sigma} \ \frac{E_q V_b \sin\delta}{X_\Sigma} 0 \frac{2E_q - V_b \cos\delta}{X_\Sigma} \end{bmatrix} ]这几个偏导数推导不难但容易出错尤其是Q_e对Eq的偏导很容易丢掉2Eq项。建议推完先用数值差分验证一遍再放进滤波器。3.3 EKF的Matlab核心代码骨架下面是我用的EKF主循环核心代码注释写在关键位置nx 3; % 状态维数 Ts 0.01; % 采样周期 10ms N length(t); % 总仿真步数 % 连续状态方程 f f (x) [ x(2); (Pm - x(3)*Vb*sin(x(1))/Xsum - D*x(2)) / M; (Efd - x(3) - (xd - xdp)*(x(3) - Vb*cos(x(1)))/Xsum) / Tdo ]; % 量测方程 h h (x) [ x(3)*Vb*sin(x(1))/Xsum; (x(3)^2 - x(3)*Vb*cos(x(1)))/Xsum ]; % 状态转移雅可比 A A (x) [ 0, 1, 0; -x(3)*Vb*cos(x(1))/(M*Xsum), -D/M, -Vb*sin(x(1))/(M*Xsum); -(xd-xdp)*Vb*sin(x(1))/(Tdo*Xsum), 0, -1/Tdo-(xd-xdp)/(Tdo*Xsum) ]; % 量测雅可比 H Hfun (x) [ x(3)*Vb*cos(x(1))/Xsum, 0, Vb*sin(x(1))/Xsum; x(3)*Vb*sin(x(1))/Xsum, 0, (2*x(3)-Vb*cos(x(1)))/Xsum ]; x_est x0_est; P P0; for k 1:N-1 % 当前时刻量测仿真中由真值加噪声生成 z h(x_true(:,k1)) sqrt(R)*randn(2,1); % 预测 x_pred x_est Ts*f(x_est); % 欧拉预测 F eye(nx) Ts*A(x_est); % 离散化状态转移矩阵 P_pred F*P*F Q; % 更新 H Hfun(x_pred); % 在线性化点 x_pred 处求 H S H*P_pred*H R; K P_pred*H/S; x_est x_pred K*(z - h(x_pred)); % 状态更新 P (eye(nx) - K*H)*P_pred; % 协方差更新 end注意上面代码在生成量测时用了sqrt(R)*randn(2,1)这样就不需要额外的统计工具箱函数。另外我在代码里故意用欧拉法做状态预测这是为了展示最基本结构实际在项目里建议把x_pred那行换成二阶Runge-Kutta传播函数。3.4 EKF的三个经典翻车点第一是线性化误差。EKF只保留一阶项在功角摆动幅度大的时候正弦函数在非线性最强处δ在π/2附近被线性近似后误差会被放大如果此时过程噪声Q又给得小滤波器会过于相信模型预测导致估计偏差迟迟消不掉。第二是协方差矩阵破坏对称性。标准更新公式P(I-KH)P_pred在数值上每次运算都会引入微小不对称长期运行后P可能变成非正定矩阵Cholesky分解直接报错。解决方法是改用Joseph形式[ P_k (I - K_k H_k)P_{k|k-1}(I - K_k H_k)^T K_k R K_k^T ]这个形式在数值上更稳定代价只是多几次矩阵乘加。第三是初值给得太离谱时EKF很容易发散。如果功角初始偏差超过30度EKF的迭代初始段会出现明显震荡甚至直接发散这件事在后面做对比实验时体现得特别明显。4. UKF实现细节用sigma点把非线性原样搬过去4.1 无迹变换的核心思想UKF和EKF的根本差异在于如何处理非线性。EKF的做法是我先把非线性函数线性化再用线性高斯框架算UKF的做法是我不去近似非线性函数而是去近似状态的分布。具体手段就是无迹变换——选取一组精心设计的采样点sigma点让这些点的均值和协方差严格等于当前状态的均值和协方差然后把这组点原封不动地通过非线性函数传播再从传播后的点中重新统计出新的均值和协方差。这就像评估一支队伍翻过一座山后的集合位置EKF是拿队伍中心点的高度和坡度估算整支队伍翻山后的位置UKF则是让几个有代表性的队员实际翻一遍山再用他们的分布推断整支队伍的情况。显然后者对强非线性更稳健。4.2 sigma点生成与权重参数选择对于n维状态UKF需要2n1个sigma点。生成方式如下先对协方差矩阵做Cholesky分解得到下三角矩阵S令[ \chi_0 x, \quad \chi_i x \sqrt{n\lambda}, S_i, \quad \chi_{in} x - \sqrt{n\lambda}, S_i ]这里的下标i表示矩阵的第i列。缩放参数λ由三个参数共同决定α、β、κ。我用的经典组合是α1e-3β2κ0于是λα²(nκ)−n≈−3。α控制sigma点离中心点的距离取小值让采样点贴近中心适合大多数平滑非线性系统β是状态分布的先验信息项对高斯分布取2是经验最优κ一般取0或3−n保证协方差半正定。权重按照以下公式计算[ W_0^m \frac{\lambda}{n\lambda}, \quad W_0^c \frac{\lambda}{n\lambda} (1-\alpha^2\beta) ][ W_i^m W_i^c \frac{1}{2(n\lambda)}, \quad i1,\dots,2n ]4.3 UKF的Matlab核心代码骨架UKF的代码结构比EKF直观不少因为不需要手动求雅可比。核心预测和更新代码如下n 3; m 2; alpha 1e-3; beta 2; kappa 0; lambda alpha^2*(nkappa) - n; % 权重 Wm zeros(1,2*n1); Wc zeros(1,2*n1); Wm(1) lambda/(nlambda); Wc(1) lambda/(nlambda) (1-alpha^2beta); for i 2:2*n1 Wm(i) 1/(2*(nlambda)); Wc(i) Wm(i); end x_est x0_est; P P0; for k 1:N-1 z h(x_true(:,k1)) sqrt(R)*randn(2,1); % 生成sigma点 S chol((nlambda)*P, lower); chi [x_est, x_est S, x_est - S]; % 通过状态方程传播sigma点 Xpred zeros(n, 2*n1); for i 1:2*n1 Xpred(:,i) rk2_step(f, chi(:,i), Ts); % 二阶Runge-Kutta end % 加权统计预测均值和协方差 x_pred Xpred * Wm; P_pred zeros(n,n); for i 1:2*n1 dx Xpred(:,i) - x_pred; P_pred P_pred Wc(i)*(dx*dx); end P_pred P_pred Q; % 通过量测方程传播sigma点 Zpred zeros(m, 2*n1); for i 1:2*n1 Zpred(:,i) h(Xpred(:,i)); end z_pred Zpred * Wm; % 计算互协方差和滤波增益 Pzz zeros(m,m); Pxz zeros(n,m); for i 1:2*n1 dz Zpred(:,i) - z_pred; dx Xpred(:,i) - x_pred; Pzz Pzz Wc(i)*(dz*dz); Pxz Pxz Wc(i)*(dx*dz); end Pzz Pzz R; K Pxz / Pzz; % 更新状态与协方差 x_est x_pred K*(z - z_pred); P P_pred - K*Pzz*K; end上面代码里rk2_step是实现二阶Runge-Kutta传播的子函数本质上就是把前面提到的k1、k2算一遍。量测更新部分尤其要注意Pzz必须叠加R否则滤波增益会偏大导致估计结果过度依赖量测噪声滤不干净。4.4 UKF和EKF的工程取舍对比两种滤波器放在一起对比没有绝对的优劣只有适不适合。下面这个表是我在单机无穷大系统上实际对比后的直观感受对比维度EKFUKF非线性处理方式一阶泰勒展开sigma点直接传播是否需要解析求导需要模型改动就要重新推导不需要改模型只改函数句柄强非线性下的估计精度偏低容易在线性化点附近产生偏差较高可精确到二阶矩单步计算量小主要是矩阵运算大2n1个点都要传状态和量测方程初值偏差大时的鲁棒性较差可能震荡或发散较好收敛更平滑实现难度推导雅可比麻烦不推公式但代码量略多高维状态扩展性好采样点数量线性增长高维时计算量吃亏实际项目里如果模型比较温和、初始状态有把握、实时性要求极高EKF完全够用。但如果系统会经历大扰动、模型非线性强、或者你不想每次改模型都痛苦地推雅可比矩阵UKF是更稳的选择。5. 仿真实验设计单机无穷大系统上的正面交锋5.1 仿真场景与扰动设置我用单机无穷大系统做对比实验发电机参数按经典值设置H5.0s即M2H/ωs≈0.031850Hz系统ωs314.16x_d1.8x_d0.3Td06.0sX_Σ0.6V_b1.0D2。系统初始稳态在P_m0.8运行0.05s处P_m从0.8阶跃到1.2模拟负荷突增约50%。这个扰动会让功角从初始约0.3 rad摆开到1 rad以上发电机经历一个明显的动态振荡过程。仿真时长取4s采样步长Ts10ms总步数400步。真值轨迹用ode45生成但在离散时刻采样滤波器只拿到带噪声的量测不直接看到真值。这里有个细节真值用高精度求解器生成而滤波器内部用二阶Runge-Kutta传播两者之间存在离散化失配这其实是刻意为之——回顾实际工程模型总是不完美的与其让滤波器完美匹配数据生成模型不如让它在轻微失配下接受检验。滤波器初始值故意给偏真实初始状态是[0.3, 0, 1.0]滤波器初始估计设为[0.45, 0.02, 1.15]P0取diag([0.04, 0.0025, 0.04])相当于一开始对功角的把握误差在0.15 rad左右。两组滤波器使用完全相同的随机量测序列保证对比公平。5.2 正常扰动下的估计结果对比在P_m阶跃场景下EKF和UKF都能跟上真实轨迹但细节上差异明显。初始收敛阶段EKF的功角估计误差峰值大约0.12 radUKF大约0.06 radUKF收敛到稳态误差带的时间比EKF早了将近0.1s。在功角摆到最大位置附近δ超过1.0 radEKF出现了明显的滞后跟踪——这是线性化误差在正弦非线性最强处的直接体现而UKF在这个区间的跟踪误差只有EKF的一半左右。我统计了两种滤波器在完整仿真时长内的RMSE均方根误差趋势是功角RMSE方面EKF约为0.045 radUKF约为0.021 rad转速偏差RMSE方面EKF约为0.018 rad/sUKF约为0.009 rad/s暂态电势RMSE方面EKF约为0.035 p.u.UKF约为0.014 p.u.。UKF在各个状态量上的估计误差总体小一半左右。5.3 把初始误差拉大EKF和UKF的鲁棒性差距为了测鲁棒性我把滤波器初始功角估计改为0.6 rad偏差达到0.3 rad同时把P0相应放大。这个条件下EKF的前50步出现了明显的波动功角估计一度被拉向错误方向然后才慢慢拉回来UKF则从第一步起就稳定朝真值收敛没有出现大幅摆动。我的实际体会是在模型失配或量测短暂异常的情况下UKF的sigma点传播机制天然具备更强的纠错能力。因为EKF把分布压缩成了一条线在线性化点上做局部近似一旦线性化点本身偏离真值较远后续估计很容易朝错误方向惯性滑行而UKF用一组分布点去捕捉非线性映射即使中心点偏了点的整体分布也能提供更充分的梯度信息。5.4 滤波器调参的实战心得调参是这个项目里最耗时间的部分。一个最典型的坑是Q给得越小稳态轨迹越平滑但一旦发生真实扰动滤波器反应越迟钝甚至出现发散。我试过Qdiag([1e-6, 1e-6, 1e-6])的极端情况P_m阶跃后估计值需要将近0.5s才跟上真值明显滞后反过来把Q放大到Qdiag([1e-1, 1e-1, 1e-1])跟踪是快了但滤波后的轨迹满是量测噪声的毛刺状态曲线完全不平滑。调参建议是从物理量级出发先给合理的Q和R然后固定R只调Q观察均方根误差和轨迹平滑度的平衡。如果跟踪慢、误差先大后小说明Q偏小如果曲线毛糙、稳态误差波动大说明Q偏大。另外要始终保证R的量级和量测噪声标准差的平方匹配R给大了就是不信量测给小了就是过度相信量测两种极端在仿真结果里都一眼能看出来。6. 实战中容易踩的坑与扩展方向6.1 协方差矩阵数值恶化最容易被忽视的隐性故障卡尔曼滤波在长期运行时最容易出现的隐性故障就是协方差矩阵失去正定性。症状是程序跑着跑着突然报错说Cholesky分解失败但之前一切正常。EKF里更常见因为标准更新公式P(I−KH)P_pred本身不能保证对称浮点运算的微小不对称在几百个步长后会被放大。我的处理习惯是两件事同时做第一每次更新后强制对称化P(PP)/2第二把协方差更新改成Joseph形式。虽然增加了一点计算量但长期运行稳定很多。还有一个更简单的兜底办法是给P_pred加一个极小的对角增量εI数值上托住正定性ε取1e-12量级就够。6.2 滤波发散的检测与应对别等到误差爆炸才发现滤波发散的典型表现是估计误差不收敛持续增大而协方差P却不断缩小滤波器越来越自信地错误。这是因为量测更新长期不被采纳或者模型预测和真实动态之间出现结构性偏差。最简单的检测方法是监控新息序列残差的统计特性。理论上归一化新息应该服从标准正态分布如果残差均值明显偏离0、方差持续超过预期基本可以判定发散或即将发散。应对策略有三种一是适当增大Q承认模型不确定二是引入自适应Q调度比如检测到残差增大时按比例放大Q这也是自适应卡尔曼滤波的常见做法三是检查模型和量测里有没有未建模的突变比如我仿真里P_m阶跃导致的模型失配靠滤波本身是消化不了的必须从源头修正。6.3 从单机到多机系统的扩展思路单机无穷大系统的代码跑通后扩展到多机系统是自然的方向。多机系统的状态向量是所有发电机的功角、转速、暂态电势拼接起来的高维向量维度从3变成3N_g。这里有两个现实问题第一EKF的状态转移雅可比矩阵从3×3变成3N_g×3N_g推导量和计算量都显著增加第二UKF的sigma点数量是2n1状态维数一旦超过20每步要传播的sigma点数量就超过41个实时性开始吃紧。工程上比较常用的折中是降维处理把互联网络等效处理忽略部分厂站间的动态耦合或者采用分区分布式估计每个区域只估计本地几台机区域间交换边界信息。这种做法在调度自动化中有明显的工程价值但实现复杂度比单机Demo高一个量级建议先把单机的原理吃透再动手。6.4 进阶方向自适应、鲁棒化和多算法融合如果只停留在EKF/UKF本身理解深度会受限。我建议下一步往三个方向走第一是自适应卡尔曼滤波通过协方差匹配在线调整Q和R解决固定噪声参数无法适应工况变化的问题第二是鲁棒滤波比如H∞滤波、基于M估计的鲁棒卡尔曼滤波专门对付量测中的非高斯异常值第三是粒子滤波与UKF的混合结构用粒子滤波处理重尾噪声场景下的状态突变用UKF加速局部采样。这三个方向的Matlab代码都可以在当前框架上逐步叠加不会把前面的工作推翻重来。我的经验是每扩展一个方向都要先在新息序列的可视化上下功夫——把残差、P对角元素、估计误差画在同一张图里你能看到很多理论推导里看不到的动态行为这也是调整滤波器参数最直接的依据。最后聊一点实际操作层面的体会这套EKF/UKF仿真跑通并不难难点在于理解每一个矩阵更新背后的物理含义。EKF的雅可比矩阵里每一项都有对应的电气量变化率UKF的sigma点里每一个都是发电机的一个可能的运行状态。把这些对应关系理清楚之后你会发现不管是改成多机系统还是换一种滤波器代码结构和调试思路基本都是相通的。如果读完这篇文章你想自己动手建议先用代码把单机无穷大系统的完整轨迹画出来再慢慢往里面加扰动、加对比指标、加自适应模块这条路走通之后动态状态估计里最核心的那些直觉你就都有了。
返回列表