【状态估计】 KEWLS和 KEWLS-KF (KKF) 研究(Matlab代码实现)

简介: 【状态估计】 KEWLS和 KEWLS-KF (KKF) 研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥

🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。

⛳️座右铭:行百里者,半于九十。

💥1 概述

KEWLS与KEWLS-KF(KKF)状态估计技术研究

摘要

针对非线性动态系统状态估计中传统方法存在的精度不足与鲁棒性缺陷,本文提出基于核嵌入加权最小二乘法(KEWLS)及其与卡尔曼滤波融合的KEWLS-KF(KKF)算法。通过引入高斯核函数将输入数据映射至高维特征空间,结合动态权重分配机制,KEWLS实现了对非线性系统状态的高精度拟合;KKF进一步通过卡尔曼滤波的动态预测能力,解决了异步测量数据的时间对齐问题。实验表明,在测量间延迟(IML)为0.1s的场景下,KKF的均方根误差(RMSE)较经典最小二乘法降低34.2%,较无迹卡尔曼滤波降低28.7%,显著提升了动态定位系统的鲁棒性。

关键词

状态估计;核方法;卡尔曼滤波;非线性系统;异步测量

1 引言

状态估计作为动态系统分析的核心技术,广泛应用于电力系统母线电压监测、锂电池SOC估算、机械系统振动模态分析等领域。传统方法存在显著局限:

  1. 加权最小二乘法(WLS):仅利用当前观测数据,缺乏对系统动态特性的建模,在时变系统中估计滞后明显;
  2. 卡尔曼滤波(KF):需精准已知系统模型与噪声统计特性,实际场景中模型失配或噪声非高斯时性能骤降;
  3. 扩展卡尔曼滤波(EKF):通过线性化处理非线性系统,但在强非线性场景下线性化误差易导致滤波发散。

针对上述缺陷,本文提出KEWLS与KKF算法,通过核函数增强非线性拟合能力,结合卡尔曼滤波的动态跟踪特性,实现复杂场景下的高精度状态估计。

2 算法原理

2.1 KEWLS(核嵌入加权最小二乘法)

image.gif 编辑

2.2 KKF(KEWLS-KF融合算法)

KKF通过以下步骤解决异步测量数据的时间对齐问题:

  1. 卡尔曼滤波外推:对每个传感器的异步测量数据应用低维线性卡尔曼滤波,外推至统一估计时刻,生成同步测量集。状态方程与测量方程定义为:

image.gif 编辑

其中,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 性能指标

  1. 均方根误差(RMSE):评估定位精度,计算100次独立实验的平均误差。
  2. 计算时间:记录单次定位耗时,评估算法实时性。
  3. 鲁棒性:分析不同噪声水平下算法性能稳定性。

3.3 实验结果

  1. 定位精度:图1显示,随IML增大,LS和UKF的RMSE显著上升,而KKF和KEWLS保持稳定。当IML=0.1s时,KKF的RMSE较LS降低34.2%,较UKF降低28.7%,表明卡尔曼外推有效抑制了异步误差。
  2. 计算效率:KKF的单次定位耗时较KEWLS增加12.3%,但较SUKF降低18.6%,满足实时性要求。
  3. 鲁棒性:在rz=0.5m的高噪声场景下,KKF的RMSE较LS降低29.8%,较UKF降低23.1%,验证了算法对噪声的强适应性。

4 应用前景

KEWLS与KKF算法在以下领域具有广泛应用前景:

  1. 室内定位:解决多径效应与异步测量导致的定位误差,提升机器人导航精度。
  2. 电力系统状态监测:实时估计母线电压与线路潮流,支撑电网安全稳定运行。
  3. 锂电池SOC估算:通过非线性拟合提升SOC估计精度,延长电池使用寿命。
  4. 自动驾驶:融合多传感器数据,实现高精度车辆状态估计与路径规划。

5 结论

本文提出的KEWLS与KKF算法通过核函数映射与卡尔曼滤波融合,显著提升了非线性动态系统状态估计的精度与鲁棒性。实验表明,KKF在异步测量场景下较传统方法降低RMSE超30%,为复杂系统状态估计提供了新的理论支撑。未来研究将聚焦于算法在嵌入式系统中的优化实现,以及多源异构数据融合场景下的扩展应用。

📚2 运行结果

image.gif 编辑 image.gif 编辑 image.gif 编辑 image.gif 编辑 image.gif 编辑 image.gif 编辑 image.gif 编辑

部分代码:

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资源获取【请看主页然后私信】

相关文章
|
4月前
|
传感器 并行计算 算法
基于卡尔曼滤波的锂离子电池剩余电量估算
基于卡尔曼滤波的锂离子电池剩余电量(SOC)估算的方案,结合等效电路模型与自适应优化策略
|
2月前
|
运维 算法 数据可视化
【SVR-SVDD】基于支持向量-SVDD 进行异常检测研究(Matlab代码实现)
【SVR-SVDD】基于支持向量-SVDD 进行异常检测研究(Matlab代码实现)
|
1月前
|
传感器 数据采集 算法
四旋翼飞行器UAV_MPC模型预测轨迹跟踪控制研究(Matlab代码实现)
四旋翼飞行器UAV_MPC模型预测轨迹跟踪控制研究(Matlab代码实现)
166 10
|
4月前
|
机器学习/深度学习 算法 PyTorch
【Pytorch】基于LSTM-KAN、BiLSTM-KAN、GRU-KAN、TCN-KAN、Transformer-KAN(各种KAN修改一行代码搞定)的共享单车租赁预测研究(数据可换)Python
【Pytorch】基于LSTM-KAN、BiLSTM-KAN、GRU-KAN、TCN-KAN、Transformer-KAN(各种KAN修改一行代码搞定)的共享单车租赁预测研究(数据可换)Python
189 0
|
2月前
|
机器学习/深度学习 算法 安全
【最优潮流】二阶锥松弛在配电网最优潮流计算中的应用(Matlab代码实现)
【最优潮流】二阶锥松弛在配电网最优潮流计算中的应用(Matlab代码实现)
128 1
|
2月前
|
算法 调度 数据中心
【EI复现】考虑灵活性的数据中心微网两阶段鲁棒规划方法(Matlab代码实现)
【EI复现】考虑灵活性的数据中心微网两阶段鲁棒规划方法(Matlab代码实现)
109 5
|
2月前
|
机器学习/深度学习 传感器 人工智能
【轴承故障检测】滚动轴承中进行基于振动的故障诊断研究(Matlab代码实现)
【轴承故障检测】滚动轴承中进行基于振动的故障诊断研究(Matlab代码实现)
321 1
|
2月前
|
算法 新能源 Python
单相光伏并网逆变器:光伏发电+MPPT+扰动观察法+spwm仿真(参看文献+仿真模型+算法介绍)
单相光伏并网逆变器:光伏发电+MPPT+扰动观察法+spwm仿真(参看文献+仿真模型+算法介绍)
188 0
|
2月前
|
Web App开发 算法 新能源
基于双层优化的大规模电动汽车充放电时空调度策略研究(Matlab代码实现)
基于双层优化的大规模电动汽车充放电时空调度策略研究(Matlab代码实现)
112 1
|
2月前
|
传感器 算法 新能源
基于永磁同步电机驱动实现的飞轮储能系统建模与仿真(仿真+毕设报告)
基于永磁同步电机驱动实现的飞轮储能系统建模与仿真(仿真+毕设报告)
129 1