【MATLAB例程】线性卡尔曼滤波的程序,三维状态量和观测量,较为简单,可用于理解多维KF,附代码下载链接

本文所述代码实现了一个 三维状态的扩展卡尔曼滤波 (Extended Kalman Filter, EKF) 算法。通过生成过程噪声和观测噪声,对真实状态进行滤波估计,同时对比了滤波前后状态量的误差和误差累积分布曲线。

文章目录

简介

代码分为以下几个部分:

  1. 初始化部分

    • 清理工作区环境,设置随机数种子,定义时间序列。
    • 定义过程噪声协方差矩阵 Q 和观测噪声协方差矩阵 R
    • 初始化真实状态矩阵 X、观测值矩阵 Z 和滤波估计状态矩阵 X_kf
  2. 运动模型

    • 模拟真实状态、未滤波状态(带噪声)以及观测值的变化,生成数据序列。
  3. 扩展卡尔曼滤波 ( E K F EKF EKF)

    • 实现 EKF 的预测和更新步骤,逐步对状态进行滤波估计。
    • 计算状态协方差矩阵的更新和卡尔曼增益。
  4. 绘图

    • 绘制滤波前后状态量的对比曲线。
    • 绘制滤波前后绝对误差的对比曲线。
    • 绘制误差的累积概率分布 ( C D F CDF CDF) 对比图。
  5. 误差输出

    • 计算并输出滤波前和滤波后各维度的最大误差值。

运行结果

  • 状态量曲线:

  • 误差曲线:

  • 误差CDF曲线(越靠近左上表示误差整体越小):

MATLAB源代码

部分代码如下:

matlab 复制代码
% KF,3维
% 2025-05-12/Ver1
clear; clc; close all;% 清除变量、命令行和图形窗口
rng(0); % 设置随机数种子

%% 滤波模型初始化
t = 1:1:1000; %设置时间序列
Q = 1 * diag(ones(1,3)); % 过程噪声协方差矩阵
w = sqrt(Q) * randn(3, length(t)); % 过程噪声
R = 10 * diag(ones(1,3)); % 观测噪声协方差矩阵
v = sqrt(R) * randn(3, length(t)); % 观测噪声
P0 = 1 * eye(3); % 初始状态协方差矩阵
X = zeros(3, length(t)); % 真实状态
X_kf = zeros(3, length(t)); % 扩展卡尔曼滤波估计的状态
Z = zeros(3, length(t)); % 观测值形式

%% 运动模型
X_ = zeros(3, length(t)); %给带误差的(未滤波的)状态量建立空间
X_(:, 1) = X(:, 1); %给带误差的状态量赋初值

完整代码下载链接:https://download.csdn.net/download/callmeup/90819699

如需帮助,或有导航、定位滤波相关的代码定制需求,请点击下方卡片联系作者

相关推荐
邪修king19 分钟前
Re:Linux 系统篇(二十九):动静态库Chapter2:动态库深度辨析 —— 核心本质、制作流程、双阶段查找模型与排错指南
android·java·linux·开发语言
泡海椒1 小时前
告别 iText 繁杂配置:jquick-pdf 极简 PDF 生成实战(零基础上手)
java·开发语言·pdf
Evand J9 小时前
【MATLAB例程|图像滤波降噪13】局部噪声方差自适应滤波(LNR)图像降噪与效果展示。附完整例程的下载链接
图像处理·计算机视觉·matlab·滤波·代码·降噪
君顾112 小时前
上海24小时自助健身房系统开发实战指南:从架构设计到落地部署
java·开发语言·健身房
香菜TTT12 小时前
大模型上下文协议(MCP):AI 应用的“USB-C”接口技术
开发语言·人工智能·经验分享
aramae13 小时前
模拟实现strlen()函数 (C语言)
c语言·开发语言·后端
jimy114 小时前
readelf 查看“派生类”的vtable符号
开发语言·c++
ctlover14 小时前
排序与查找算法详解
开发语言·python
YYYing.14 小时前
【C++进阶系列 (七)】C++ RTTI 深度剖析:从 typeid 到 dynamic_cast 的底层之旅
开发语言·c++·c/c++·rtti
nvvas16 小时前
Java 入门(四):数组——数据的集合管理
java·开发语言