【MATLAB代码介绍】EKF+CKF对比程序

文章目录

三维滤波,非线性系统状态与非线性观测,使用EKF和CKF进行滤波,输出滤波值曲线与误差对比

程序介绍

系统模型(状态方程与观测方程)

设三维状态向量为:

x k = x 1 , k x 2 , k x 3 , k \mathbf{x}k = \begin{bmatrix} x{1,k} \\ x_{2,k} \\ x_{3,k} \end{bmatrix} xk= x1,kx2,kx3,k

状态方程(运动模型)

系统非线性状态转移方程为:

x k = f ( x k − 1 ) + w k − 1 \mathbf{x}k = f(\mathbf{x}{k-1}) + \mathbf{w}_{k-1} xk=f(xk−1)+wk−1

其中非线性函数 f ( ⋅ ) f(\cdot) f(⋅)定义为:

f ( x k − 1 ) = x 1 , k − 1 + 2.5   x 1 , k − 1 1 + x 1 , k − 1 2 + 8 cos ⁡ ( 1.2   ( k − 1 ) ) x 2 , k − 1 + 1 x 3 , k − 1 f(\mathbf{x}{k-1}) = \begin{bmatrix} x{1,k-1} + \dfrac{2.5\, x_{1,k-1}}{1 + x_{1,k-1}^2} + 8 \cos\big(1.2\,(k-1)\big) \\ x_{2,k-1} + 1 \\ x_{3,k-1} \end{bmatrix} f(xk−1)= x1,k−1+1+x1,k−122.5x1,k−1+8cos(1.2(k−1))x2,k−1+1x3,k−1
【强非线性系统】

过程噪声: w k ∼ N ( 0 , Q ) \mathbf{w}_k \sim \mathcal{N}(\mathbf{0}, \mathbf{Q}) wk∼N(0,Q),协方差矩阵为:

Q = 1 ⋅ 1 0 0 0 1 0 0 0 1 \mathbf{Q} = 1 \cdot \begin{bmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{bmatrix} Q=1⋅ 100010001

观测方程(量测模型)

观测向量由状态非线性映射得到:

z k = h ( x k ) + v k \mathbf{z}_k = h(\mathbf{x}_k) + \mathbf{v}_k zk=h(xk)+vk

其中观测函数 (h(\cdot)) 为:

h ( x k ) = x 1 , k 2 20 x 2 , k x 3 , k h(\mathbf{x}k) = \begin{bmatrix} \dfrac{x{1,k}^2}{20} \\ x_{2,k} \\ x_{3,k} \end{bmatrix} h(xk)= 20x1,k2x2,kx3,k

观测噪声 (\mathbf{v}_k \sim \mathcal{N}(\mathbf{0}, \mathbf{R})),协方差矩阵与过程噪声相同:

R = 1 0 0 0 1 0 0 0 1 \mathbf{R} = \begin{bmatrix} 1 & 0 & 0 \\ 0 & 1 & 0 \\ 0 & 0 & 1 \end{bmatrix} R= 100010001

运行结果

估计的三轴状态量对比:

三轴误差曲线对比:

命令行输出的数值对比:

误差CDF曲线(越靠近左上角表示总体误差越低):

程序源码

部分如下:

matlab 复制代码
% EKF+CKF效果对比
clear;clc;close all;
%% 滤波模型初始化
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));
X_ekf=zeros(3,length(t));
X_ekf(:,1)=X(:,1);
Z=zeros(3,length(t)); %定义观测值形式
Z(:,1)=[X(1,1)^2/20;X(2,1);X(3,1)]+v(:,1); %观测量
%% 运动模型
X_=zeros(3,length(t));
X_(:,1)=X(:,1);
for i1 = 2:length(t)

完整代码与程序详解:

https://blog.csdn.net/callmeup/article/details/136147833?spm=1011.2415.3001.5331

代码讲解、定制,可联系下方名片

相关推荐
Evand J1 天前
【MATLAB例程,PMSM19】永磁同步电机(PMSM)基于多速率无迹卡尔曼滤波(UKF)的转速与转子位置估计。测量缺失、状态预测与恢复性能分析
开发语言·matlab·电机·ekf·卡尔曼·电机滤波
星夜离尘562 天前
MATLAB 离散数据分箱:半开区间、末端点与计数、加权和、平均
算法·matlab
Evand J4 天前
【MATLAB例程介绍】(17)永磁同步电机(PMSM)基于自适应无迹卡尔曼滤波(AUKF)的电流噪声在线估计。测量噪声协方差自适应与转速估计对比仿真
开发语言·matlab·卡尔曼滤波·无迹卡尔曼滤波·pmsm·电机滤波
严肃小白兔5 天前
MATLAB 绘图与科研论文插图制作:图形设计、统计表达与矢量导出
开发语言·matlab·科研绘图
严肃小白兔6 天前
MATLAB 数值计算中的精度与误差问题:浮点运算、误差传播与数值稳定性
人工智能·算法·matlab
Evand J7 天前
【PMSM例程】(14)永磁同步电机无迹卡尔曼滤波(UKF)定子电阻在线辨识与补偿。电阻变化跟踪及预测误差对比仿真。附完整代码的下载链接
matlab·电机·滤波·卡尔曼滤波·永磁同步电机·无迹卡尔曼滤波·pmsm
爱喝雪碧的可乐7 天前
MATLAB
开发语言·算法·matlab
严肃小白兔7 天前
MATLAB 优秀开源项目与工具箱推荐:涵盖通信、图像处理、脑机接口等九大领域
图像处理·matlab·信息与通信·开源项目
Evand J9 天前
【MATLAB例程12】永磁同步电机基于增广无迹卡尔曼滤波的未知负载转矩在线观测
开发语言·matlab
分享资料10 天前
MATLAB 中分号 (;)的作用
matlab