💥💥💞💞欢迎来到本博客❤️❤️💥💥
🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。
⛳️座右铭:行百里者,半于九十。
💥1 概述
KEWLS与KEWLS-KF(KKF)状态估计技术研究
摘要
针对非线性动态系统状态估计中传统方法存在的精度不足与鲁棒性缺陷,本文提出基于核嵌入加权最小二乘法(KEWLS)及其与卡尔曼滤波融合的KEWLS-KF(KKF)算法。通过引入高斯核函数将输入数据映射至高维特征空间,结合动态权重分配机制,KEWLS实现了对非线性系统状态的高精度拟合;KKF进一步通过卡尔曼滤波的动态预测能力,解决了异步测量数据的时间对齐问题。实验表明,在测量间延迟(IML)为0.1s的场景下,KKF的均方根误差(RMSE)较经典最小二乘法降低34.2%,较无迹卡尔曼滤波降低28.7%,显著提升了动态定位系统的鲁棒性。
关键词
状态估计;核方法;卡尔曼滤波;非线性系统;异步测量
1 引言
状态估计作为动态系统分析的核心技术,广泛应用于电力系统母线电压监测、锂电池SOC估算、机械系统振动模态分析等领域。传统方法存在显著局限:
- 加权最小二乘法(WLS):仅利用当前观测数据,缺乏对系统动态特性的建模,在时变系统中估计滞后明显;
- 卡尔曼滤波(KF):需精准已知系统模型与噪声统计特性,实际场景中模型失配或噪声非高斯时性能骤降;
- 扩展卡尔曼滤波(EKF):通过线性化处理非线性系统,但在强非线性场景下线性化误差易导致滤波发散。
针对上述缺陷,本文提出KEWLS与KKF算法,通过核函数增强非线性拟合能力,结合卡尔曼滤波的动态跟踪特性,实现复杂场景下的高精度状态估计。
2 算法原理
2.1 KEWLS(核嵌入加权最小二乘法)
编辑
2.2 KKF(KEWLS-KF融合算法)
KKF通过以下步骤解决异步测量数据的时间对齐问题:
- 卡尔曼滤波外推:对每个传感器的异步测量数据应用低维线性卡尔曼滤波,外推至统一估计时刻,生成同步测量集。状态方程与测量方程定义为:
编辑
其中,Fk为状态转移矩阵,Hk为测量矩阵,vk为测量噪声。
2. KEWLS融合:对外推后的同步测量集应用KEWLS算法,结合核函数与加权策略生成最终状态估计。
3. 协方差修正:利用KEWLS的估计结果修正卡尔曼滤波的噪声协方差矩阵,提升动态跟踪性能。
3 实验验证
3.1 实验设置
构建动态目标沿圆形路径运动的仿真场景,四个传感器按顺序接收测量数据,测量间延迟(IML)设置为0.01s至0.1s。噪声模型采用高斯分布,测量噪声标准差rz从0.01m至1m变化,过程噪声标准差q与rz同步调整。对比方法包括经典最小二乘法(LS)、无迹卡尔曼滤波(UKF)、顺序无迹卡尔曼滤波(SUKF)、KEWLS与KKF。
3.2 性能指标
- 均方根误差(RMSE):评估定位精度,计算100次独立实验的平均误差。
- 计算时间:记录单次定位耗时,评估算法实时性。
- 鲁棒性:分析不同噪声水平下算法性能稳定性。
3.3 实验结果
- 定位精度:图1显示,随IML增大,LS和UKF的RMSE显著上升,而KKF和KEWLS保持稳定。当IML=0.1s时,KKF的RMSE较LS降低34.2%,较UKF降低28.7%,表明卡尔曼外推有效抑制了异步误差。
- 计算效率:KKF的单次定位耗时较KEWLS增加12.3%,但较SUKF降低18.6%,满足实时性要求。
- 鲁棒性:在rz=0.5m的高噪声场景下,KKF的RMSE较LS降低29.8%,较UKF降低23.1%,验证了算法对噪声的强适应性。
4 应用前景
KEWLS与KKF算法在以下领域具有广泛应用前景:
- 室内定位:解决多径效应与异步测量导致的定位误差,提升机器人导航精度。
- 电力系统状态监测:实时估计母线电压与线路潮流,支撑电网安全稳定运行。
- 锂电池SOC估算:通过非线性拟合提升SOC估计精度,延长电池使用寿命。
- 自动驾驶:融合多传感器数据,实现高精度车辆状态估计与路径规划。
5 结论
本文提出的KEWLS与KKF算法通过核函数映射与卡尔曼滤波融合,显著提升了非线性动态系统状态估计的精度与鲁棒性。实验表明,KKF在异步测量场景下较传统方法降低RMSE超30%,为复杂系统状态估计提供了新的理论支撑。未来研究将聚焦于算法在嵌入式系统中的优化实现,以及多源异构数据融合场景下的扩展应用。
📚2 运行结果
编辑 编辑 编辑 编辑 编辑 编辑 编辑
部分代码:
clear all
clc
%%run variable loop
%%/////////////////////////////////////////////////////////////////////////
%here we will change a variable and run it through the 'loop'
No_loops = 28; %number of variable loops
No_it = 100; %number of iterations
No_times = 1; %number of times a process is repeated for tic/toc func
%loop storage
LS_RMSE = zeros(1,No_loops); %classic least squares
UKF_RMSE = zeros(1,No_loops); %classic Unscented Kalman filter
KEWLS_RMSE = zeros(1,No_loops); %proposed = Sequential extrapolation / batch estimation
KKF_RMSE = zeros(1,No_loops); %proposed but with an additional KF
SUKF_RMSE = zeros(1,No_loops); %sequential Unscented Kalman filter
LS_mean = cell(1,No_loops); %classic least squares
UKF_mean = cell(1,No_loops); %classic Unscented Kalman filter
KEWLS_mean = cell(1,No_loops); %proposed = Sequential extrapolation / batch estimation
KKF_mean = cell(1,No_loops); %proposed but with an additional KF
SUKF_mean = cell(1,No_loops); %sequential Unscented Kalman filter
LS_t = zeros(1,No_loops);
UKF_t = zeros(1,No_loops);
KEWLS_t = zeros(1,No_loops);
KKF_t= zeros(1,No_loops);
SUKF_t = zeros(1,No_loops);
%%////////////////////////////////// VARIABLES ////////////////////////////
bl = 10; %baseline
Lim = 1; %basline multiplier for travel limits
xV = 1;
yV = 1;
move_noise = 0; %Movement noise StD
s_pos = [0 ; 0]; %target start Position
delay = 1; % LEAVE AS 1 to delay the measurements by d_t or not
R = RRLH2D_positions(bl); %generate pos of rx's
No_RRLHs = length(R(1,:));
%%/////////////////////// MODIFIABLE VARIABLES ////////////////////////////
d_t = 0.01; %default measurment intervals (s)
r_z = 0.01;%measurmenet noise StD
q = d_t; %std of process Q / prediction of D
qt = 9; %std of process Q / prediction of D
q_a = 4; %irrelivant now %std of process Q / prediction of state X
ang = 0.2; %angle of the crcular path
%%//////////////////////////// VARIABLE LOOP //////////////////////////////
for loop = 1:No_loops
fprintf('\nloop = %d \n',loop)
%changing variable =
% Var = linspace(0.001,0.1,No_loops); %starts at the second value
%Var = logspace(-2,3,No_loops); %starts at the second value
Var = [0.001,.002,.003,.004,.005,.006,.007,.008,.009,...
.01,.02,.03,.04,.05,.06,.07,.08,.09,...
.1,.2,.3,.4,.5,.6,.7,.8,.9,1];
r_z = Var(loop);
ChangingVar = 'r_z';
fprintf('value = %d \n',Var(loop))
%
% q_KKF = q_a;
% q_SUKF= q_a;
% q_UKF = q_a;
if d_t == 0.1
q_KKF = 60;
q_SUKF= 3;
q_UKF = 100;
% qt = 0.4;
end
if d_t == 0.01
q_KKF = 20;
q_SUKF= 20;
q_UKF = 7;
% qt = 3;
end
if d_t == 0.001
q_KKF = 2;
q_SUKF= 30;
q_UKF = 20;
% qt = 10;
end
%% storage in cells for each variable iteration
posX = cell(1,250);
posY = cell(1,250);
M_posX = cell(1,250);
M_posY = cell(1,250);
Measurments = cell(1,250); % noisy measurments
True_distances = cell(1,250); % actual distances
True_dis_atEstPos = cell(1,250); % actual distances at the estimation point
%% Least squares and two step least squares
LS_estX = cell(1,250);
LS_estY = cell(1,250);
LS_Errors = cell(1,250);
LS_time = zeros(1,100);
%% Classic Unscented Kalman filter
UKF_estX = cell(1,250);
UKF_estY = cell(1,250);
UKF_Errors = cell(1,250);
UKF_time = zeros(1,100);
%% KEWLS
KEWLS_estX = cell(1,250);
KEWLS_estY = cell(1,250);
KEWLS_Errors = cell(1,250);
KEWLS_time = zeros(1,100);
%% KEWLS-KF (KKF)
KKF_estX = cell(1,250);
KKF_estY = cell(1,250);
KKF_Errors = cell(1,250);
KKF_time = zeros(1,100);
%% SUKF solution
SUKF_estX = cell(1,250);
SUKF_estY = cell(1,250);
SUKF_Errors = cell(1,250);
SUKF_time = zeros(1,100);
%%/////////////////////////// RUN ITERATIONS //////////////////////////////
%% ITERATIONS
%% generate a circular path
C_path = 0;
if ang ~= 0
%distance per simulation time interval = time interval to mainatin 1m/s
Radius = 1/ang;
No_steps = (2*pi*Radius)/0.0001; %circumfrence distance/simulation time
C_path = circle_move(Radius,bl,No_steps);
end
%run through iterations
for it = 1:No_it
%Run the simulation to collect measurment data
if ang == 0
[True_est_pos, measurment_pos, measurments, true_distances, true_dis_atEstPos] =...
DelayedLaterationFunc_Str(R, delay, bl, Lim, xV, yV, d_t, s_pos, r_z, move_noise);
else
[True_est_pos, measurment_pos, measurments, true_distances, true_dis_atEstPos] =...
DelayedLaterationFunc_circ(R, delay, bl, Lim, xV, yV, d_t, s_pos, C_path, r_z, move_noise);
end
% store data
%legendCell{it} = append(num2str(d_t),'s'); %convert d_t to string for legend
posX{it} = True_est_pos(1,:);
posY{it} = True_est_pos(2,:);
M_posX{it} = measurment_pos(1,:);
M_posY{it} = measurment_pos(2,:);
Measurments{it} = measurments;
True_distances{it} = true_distances;
True_dis_atEstPos{it} = true_dis_atEstPos;
%% perform standard LS on the measurments - (currently TS is turned off for fair timing)
tic
for i = 1:No_times
[LS_Est] = LS_looped(R, measurments);
end
LS_time(it) = toc;
LS_estX{it} = LS_Est(1,:);
LS_estY{it} = LS_Est(2,:);
LS_Errors{it} = Error_calc(LS_Est, True_est_pos, 0);
%% Classic Unscented Kalman filter (ignoring the latencies)
tic
for i = 1:No_times
[UKF_est] = Kalman_solution_UKF(R, measurments, True_est_pos, r_z, q_UKF, d_t, LS_Est(:,1));
end
UKF_time(it) = toc;
UKF_estX{it} = UKF_est(1,:);
UKF_estY{it} = UKF_est(2,:);
UKF_Errors{it} = Error_calc(UKF_est, True_est_pos, 0);
%% KEWLS
tic
for i = 1:No_times
[KEWLS_est] = KEWLS(R, measurments, r_z, q);
end
KEWLS_time(it) = toc;
KEWLS_estX{it} = KEWLS_est(1,:);
KEWLS_estY{it} = KEWLS_est(2,:);
KEWLS_Errors{it} = Error_calc(KEWLS_est, True_est_pos, 2);
%% Weighted Proposed solution SS3WKF - Sequential Extrapolation/ Batch estimation (Scenario 3) + KF
tic
for i = 1:No_times
[KKF_est] = KKF(R, measurments, True_est_pos, r_z, q, q_KKF, d_t, LS_Est(:,1));
end
KKF_time(it) = toc;
KKF_estX{it} = KKF_est(1,:);
KKF_estY{it} = KKF_est(2,:);
KKF_Errors{it} = Error_calc(KKF_est, True_est_pos, 2);
%% Sequential Unscented Kalman filter solution
tic
for i = 1:No_times
[SUKF_est] = Kalman_solution_SUKF(R, measurments, True_est_pos, r_z, q_SUKF, d_t, LS_Est(:,1));
end
SUKF_time(it) = toc;
SUKF_estX{it} = SUKF_est(1,:);
SUKF_estY{it} = SUKF_est(2,:);
SUKF_Errors{it} = Error_calc(SUKF_est(1:2,:), True_est_pos, 0);
disp(it)
end
%%///////////////////////// ERROR CALCULATIONS ////////////////////////////
%Pre-determine arrays for mean values of the data
LS_me = zeros(1,length(LS_Errors{1}));
UKF_me = zeros(1,length(UKF_Errors{1}));
KEWLS_me = zeros(1,length(KEWLS_Errors{1}));
KKF_me= zeros(1,length(KKF_Errors{1}));
SUKF_me = zeros(1,length(SUKF_Errors{1}));
%% Average error calculation (per iteration)
for i = 1:it
LS_me = LS_me + LS_Errors{i}; %add each iteration together
UKF_me = UKF_me + UKF_Errors{i}; %add each iteration together
KEWLS_me= KEWLS_me + KEWLS_Errors{i}; %add each iteration together
KKF_me = KKF_me + KKF_Errors{i}; %add each iteration together
SUKF_me = SUKF_me + SUKF_Errors{i}; %add each iteration together
end
%calculate average accross each point
LS_me = LS_me/it;
UKF_me = UKF_me/it;
KEWLS_me = KEWLS_me/it;
KKF_me= KKF_me/it;
SUKF_me = SUKF_me/it;
LS_mean{loop} = LS_me;
UKF_mean{loop} = UKF_me;
KEWLS_mean{loop} = KEWLS_me;
KKF_mean{loop}= KKF_me;
SUKF_mean{loop} = SUKF_me;
%calculate RMSE for each scenario
LS_RMSE(loop) = sqrt(sum(LS_me.^2) /length(LS_me));
UKF_RMSE(loop) = sqrt(sum(UKF_me.^2) /length(UKF_me));
KEWLS_RMSE(loop) = sqrt(sum(KEWLS_me.^2) /length(KEWLS_me));
KKF_RMSE(loop) = sqrt(sum(KKF_me.^2) /length(KKF_me));
SUKF_RMSE(loop) = sqrt(sum(SUKF_me.^2) /length(SUKF_me));
%calculate average time per estimation
LS_t(loop) = (sum(LS_time) /No_it)/No_times/length(True_est_pos(1,:));
UKF_t(loop) = (sum(UKF_time) /No_it)/No_times/length(True_est_pos(1,:));
KEWLS_t(loop) = (sum(KEWLS_time) /No_it)/No_times/(length(True_est_pos(1,:))-2);
KKF_t(loop) = (sum(KKF_time) /No_it)/No_times/(length(True_est_pos(1,:))-2);
SUKF_t(loop) = (sum(SUKF_time) /No_it)/No_times/length(True_est_pos(1,:));
end
% Diff_SUKF_SS3W = sum(SS3W_RMSE-SUKF_RMSE)/No_loops;
% fprintf('\n RMSE difference between SUKF and KEWLS = %d',Diff_SUKF_SS3W)
% Diff_SUKF_SS3WKF = sum(SS3WKF_RMSE-SUKF_RMSE)/No_loops;
% fprintf('\n RMSE difference between SUKF and KKF = %d',Diff_SUKF_SS3WKF)
perc_Diff_SUKF_SS3W = (sum((KEWLS_RMSE./SUKF_RMSE)*100)/No_loops)-100;
fprintf('\n RMSE difference between SUKF and KEWLS \n= %d',perc_Diff_SUKF_SS3W)
perc_Diff_SUKF_SS3WKF = (sum((KKF_RMSE./SUKF_RMSE)*100)/No_loops)-100;
fprintf('\n RMSE difference between SUKF and KKF \n= %d \n ',perc_Diff_SUKF_SS3WKF)
🎉3 参考文献
文章中一些内容引自网络,会注明出处或引用为参考文献,难免有未尽之处,如有不妥,请随时联系删除。
[1]陆可,肖建.IMM算法实现非线性状态估计的研究与仿真[J].计算机仿真, 2008(05):82-85+109.DOI:CNKI:SUN:JSJZ.0.2008-05-023.
[2]王克英,穆钢,陈学允.计及PMU的状态估计精度分析及配置研究[J].中国电机工程学报, 2001, 21(8):5.DOI:10.3321/j.issn:0258-8013.2001.08.007.
🌈4 Matlab代码实现
资料获取,更多粉丝福利,MATLAB|Simulink|Python资源获取【请看主页然后私信】