
本文介绍普通UKF与强跟踪无迹卡尔曼滤波(Strong Tracking Unscented Kalman Filter, ST-UKF)算法的 MATLAB 代码示例。该示例涉及三维非线性状态量和观测量。
这段代码实现了强跟踪无迹卡尔曼滤波(Strong Tracking Unscented Kalman Filter, ST-UKF),主要用于非线性动态系统的状态估计。以下是代码的主要功能和步骤:
主要功能
- 状态估计:通过处理带有噪声的观测数据,估计系统的真实状态。
- 自适应调整:根据观测残差动态调整滤波器的参数,以提高估计的精度和稳定性。
主要步骤
- 初始化:设置遗忘因子、协方差矩阵、初始状态和时间序列。
- sigma点生成:根据当前状态和协方差生成 sigma 点,以便进行状态预测。
- 状态预测:
- 根据非线性状态模型对 sigma 点进行预测。
- 计算预测状态的均值和协方差。
- 观测预测:根据预测的状态计算观测值的预测均值和协方差。
- 卡尔曼增益计算:通过预测的观测和实际观测之间的关系计算卡尔曼增益,用于更新状态估计。
- 状态和协方差更新:
- 根据观测残差更新状态估计。
- 更新协方差矩阵,以反映新的不确定性。
- 自适应调节:动态调整滤波的参数(如
Lambda),以适应系统的动态变化。
运行结果
-
代码最终输出更新后的状态估计,存储在
X_aukf中。这些状态估计可以用于进一步分析或控制系统。 -
滤波前后的状态量与真实值的曲线对比:

-
误差曲线对比:

-
误差输出:

MATLAB 代码示例
程序结构如下:

% 强跟踪无迹卡尔曼滤波(STUKF)与传统UKF效果对比
% 2024-12-12/Ver1
clear;clc;close all; %清空工作区、命令行,关闭小窗口
rng(0); %固定随机种子
%% 滤波模型初始化
t = 1:1:1000;% 定义时间序列
Q = 1*diag([1,1,1]);w=sqrt(Q)*randn(size(Q,1),length(t));% 设置过程噪声协方差矩阵和过程噪声
R = 1*diag([1,1,1]);v=sqrt(R)*randn(size(R,1),length(t));% 设置观测噪声协方差矩阵和观测噪声
P0 = 1*eye(3);% 初始状态估计协方差矩阵
X=zeros(3,length(t));% 初始化状态向量
Z=zeros(3,length(t)); %定义观测值形式
Z(:,1)=[X(1,1)^2/20;X(2,1);X(3,1)]+v(:,1); %观测量
residue_tag = 0; %自适应标签
%% 运动模型
代码运行界面截图:

完整代码下载链接:
https://download.youkuaiyun.com/download/callmeup/90121978
备注
如有相关代码定制需求,可通过文末卡片联系作者
297

被折叠的 条评论
为什么被折叠?



