一维、线性卡尔曼滤波的例程(MATLAB)

在这里插入图片描述

这段 MATLAB 代码实现了一维线性卡尔曼滤波器的基本功能,用于估计在存在噪声的情况下目标状态的真实值

文章目录

  • 一维线性卡尔曼滤波
    • 代码运行
    • 代码介绍
      • 1. **初始化部分**
      • 2. **数据生成**
      • 3. **卡尔曼滤波器实现**
      • 4. **结果可视化**
      • 5. **统计输出**
    • 源代码
  • 总结

一维线性卡尔曼滤波

代码运行

状态量对比:
在这里插入图片描述
状态误差对比:
在这里插入图片描述

代码介绍

1. 初始化部分

  • 清空工作区及命令行:使用 clearclcclose all 清理环境。
  • 随机数种子:通过 rng(0) 设置固定的随机数种子,以确保结果可重复。
  • 参数设置
    • T:采样率,设置为1。
    • t:构建时间序列,范围为1到100。
    • QR:分别定义系统噪声和观测噪声的方差。
    • P:初始状态协方差。

2. 数据生成

  • 使用循环生成真实状态 X、未滤波的状态 X_ 和观测值 Z。在每次迭代中,真实值 X 按固定增量递增,未滤波状态 X_ 加上随机噪声生成。

3. 卡尔曼滤波器实现

  • 在 EKF(扩展卡尔曼滤波)部分,通过循环更新状态的预测和协方差:
    • Xpre:根据上一个滤波值预测当前状态。
    • Z_hat:通过预测的状态生成对应的观测。
    • 计算增益 Kk,并更新当前的滤波状态 X_kf 和状态协方差 P

4. 结果可视化

  • 绘制真实值、滤波后值、观测值和未滤波值的比较图。
  • 计算并绘制滤波前后状态估计的绝对误差对比图。
  • 绘制滤波后误差的累计概率密度函数(CDF)图。

5. 统计输出

  • 计算并输出滤波前后的误差最大值、平均值和标准差,帮助评估滤波效果。

源代码

% 一维线性卡尔曼滤波
% 2024-12-25/Ver1clear; %清空工作区变量
clc; %清空命令行内容
close all; %关闭所有窗口(主窗口除外)
rng(0); % 设置固定的随机数种子
%% 初始化
T = 1; %设置采样率
t = T:T:100; %构建时间序列,最后的10是序列总长度
Q = 1;w=sqrt(Q)*randn(size(Q,1),length(t)); %系统噪声
R =9;v=sqrt(R)*randn(size(R,1),length(t)); %观测噪声
P = 1; %状态协方差
P_num = zeros(length(t),size(P,1),size(P,2)); %存放每次迭代的P
P_num(1,:,:) = P; %记录协方差
X=zeros(1,length(t)); %给状态真实值X分配空间
X_=zeros(1,length(t)); %给滤波前的状态分配空间
Z=zeros(1,length(t)); %给观测量序列分配空间
X_kf=zeros(1,length(t)); %准备储存滤波后的值
X(1) = 3; %给状态值初值赋值
X_(1) = X(1) + w(1); %X_是未滤波的状态,由真实值加上误差生成,这里生成其初值
%% 运动模型建立
for i1 = 2:length(t) %生成数据的for循环X(i1) = X(i1-1)+1;  %迭代生成真实值X_(i1) = X_(i1-1)+1 + w(i1); %迭代生成滤波前的状态Z(i1) = X(i1) + v(i1); %迭代生成观测量
end
X_kf(1) = X(1); %用第一时刻的观测值代替第一时刻的滤波值
%% KF迭代
for k = 2 : length(t) %生成数据的for循环,循环次数为时间序列-1Xpre = X_kf(k-1)+1+w(k); %预测下一时刻的XZ_hat = Xpre; %预测下一时刻的X对应的观测F = 1; %状态转移矩阵H = 1; %观测矩阵PP=F*P*F'+Q; %更新状态协方差Kk=PP*H'/(H*PP*H'+R); %计算增益X_kf(:,k)=Xpre+Kk*(Z(k)-Z_hat); %状态预测,此状态为滤波输出状态P=PP-Kk*H*PP; %更新状态协方差(留作下一时刻使用)P_num(k,:,:) = P; %储存状态协方差矩阵
end%% 结果展示
figure; %新建绘图窗口
plot(t,X,t,X_kf,t,Z,t,X_); %绘制状态的真实值、EKF滤波后的值、观测值对比图
title('状态对比'); %标注图像的标题
legend('理论值','KF滤波后的值','观测值','未滤波的值'); %标注图例figure; %新建绘图窗口
hold on
plot(abs(X_kf-X),'DisplayName','滤波后');
plot(abs(X_-X),'DisplayName','滤波前'); %绘制误差对比图
plot(abs(Z-X),'DisplayName','观测值');
title('状态估计绝对误差对比'); %标注图像的标题
legend; %标注图例figure; %新建绘图窗口
cdfplot(abs(X_kf-X)); %绘制滤波后误差的CDF图像
hold on %后续绘制的图像覆盖在前面的图像上
cdfplot(abs(X_-X)); %绘制滤波前误差的CDF图像
cdfplot(abs(Z-X)); %绘制观测误差的CDF图像
legend('KF','滤波前','观测'); %标注图例
title('累计概率密度函数'); %标注图像的标题fprintf('滤波前的误差最大值:%f\n',max(X_-X)); %计算滤波前误差最大值
fprintf('滤波后的误差最大值:%f\n',max(X_kf-X)); %计算滤波后误差最大值
fprintf('观测误差最大值:%f\n\n',max(Z-X)); %计算观测误差最大值fprintf('滤波前的误差平均值:%f\n',mean(X_-X)); %计算滤波前误差平均值
fprintf('滤波后的误差平均值:%f\n',mean(X_kf-X)); %计算滤波后误差平均值
fprintf('观测误差平均值:%f\n\n',mean(Z-X)); %计算滤波后误差平均值fprintf('滤波前的误差标准差:%f\n',std(X_-X)); %计算滤波前误差标准差
fprintf('滤波后的误差标准差:%f\n',std(X_kf-X)); %计算滤波前误差标准差
fprintf('观测误差标准差:%f\n\n',std(Z-X)); %计算观测误差标准差

总结

这段代码展示了线性卡尔曼滤波在一维状态估计中的应用,适用于需要在噪声环境中进行可靠状态估计的场景。通过可视化结果,用户可以直观地观察到滤波的效果和性能。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/65339.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

探索 .idea 文件夹:Java Maven 工程的隐形守护者

一、.idea文件夹深度解析:IntelliJ IDEA项目配置的核心 在Java Maven工程的开发环境中,.idea文件夹扮演着举足轻重的角色。这是IntelliJ IDEA项目特有的一个配置文件夹,它包含了项目所需的各种配置信息,以确保项目能够在不同的开…

【Compose multiplatform教程13】【组件】Column和Row组件

查看全部组件文章浏览阅读495次,点赞17次,收藏12次。alignment。https://blog.csdn.net/b275518834/article/details/144751353 Column 功能说明:将子组件按照垂直方向依次排列,能够设置组件之间的间距、对齐方式等属性&#xff…

观察者模式和发布-订阅模式有什么异同?它们在哪些情况下会被使用?

大家好,我是锋哥。今天分享关于【观察者模式和发布-订阅模式有什么异同?它们在哪些情况下会被使用?】面试题。希望对大家有帮助; 观察者模式和发布-订阅模式有什么异同?它们在哪些情况下会被使用? 1000道 …

每天40分玩转Django:实操多语言博客

实操多语言博客 一、今日学习内容概述 学习模块重要程度主要内容国际化配置⭐⭐⭐⭐⭐基础设置、语言切换翻译模型⭐⭐⭐⭐⭐多语言字段、翻译管理视图处理⭐⭐⭐⭐多语言内容展示、URL处理前端实现⭐⭐⭐⭐语言切换、界面适配 二、模型设计 # models.py from django.db im…

iviewui表单验证新手教程

1、表单验证介绍 下面来讲解iviewui表单验证的实现&#xff0c;下面上示例代码&#xff1a; <template><Form ref"formInline" :model"formInline" :rules"ruleInline" inline><FormItem prop"user"><!--prop属…

测试测试测试测试测试测试测试测试测试测试

标题详情作者简介愚公搬代码头衔华为云特约编辑&#xff0c;华为云云享专家&#xff0c;华为开发者专家&#xff0c;华为产品云测专家&#xff0c;CSDN博客专家&#xff0c;CSDN商业化专家&#xff0c;阿里云专家博主&#xff0c;阿里云签约作者&#xff0c;腾讯云优秀博主&…

【音视频工具系列】streamEye 工具分析 H264 码流详细教程

streamEye工具 Elecard StreamEye 是一款专业的视频质量分析工具,广泛应用于视频编解码器的开发、系统集成、传输流制造等领域。它提供了对视频流的深度分析,包括宏块和帧级别的详细视觉表示。StreamEye 支持多种视频格式,如 MPEG-1/2、AVC/H.264、HEVC/H.265、VP9 等,能够…

Doris的SQL原理解析

今天来介绍下Doris的SQL原理解析&#xff0c;主要从语法、解析、分析、执行等几个方面来介绍&#xff0c;可以帮助大家对Doris底层有个清晰的理解~ 一、Doris简介 Apache Doris是一个基于MPP架构的高性能、实时的分析型数据库&#xff0c;能够较好的满足报表分析、即席查询、…

OpenHarmony开发板环境搭建

程序员Feri一名12年的程序员,做过开发带过团队创过业,擅长Java相关开发、鸿蒙开发、人工智能等,专注于程序员搞钱那点儿事,希望在搞钱的路上有你相伴&#xff01;君志所向,一往无前&#xff01; 0.OpenHarmony 0.1 OpenHarmony OpenHarmony是一款面向全场景、全连接、全智能的…

Debian12 安装配置 ODBC for GaussDB

第一步 apt install -y unixodbc 第二步下载 dws_8.2.x_odbc_driver_for_x86_redhat.zip 到 /tmp&#xff0c;之后 cd /tmp unzip dws_8.2.x_odbc_driver_for_x86_redhat.zip cp lib/* /usr/local/lib cp odbc/lib/* /usr/local/lib echo /usr/local/lib >> /etc/ld…

Web前端基础知识(四)

CSS简介 CSS(层叠样式表)&#xff0c;用于定义网页样式和布局的样式表语言。 一般与HTML一起用于构建web页面的。 HTML负责定义页面的结构和内容&#xff0c;CSS负责控制页面的外观和样式。 通过CSS&#xff0c;可以指定页面中各个元素的颜色、字体、大小、间距、边框、背景…

ESP32_h2-创建一个工程后,添加驱动文件并在调用

点击F1或者ctrlshiftP 输入组件名字&#xff1a; 创建好后&#xff0c;可以看到文件目录多了components文件夹和组件文件 &#xff08;文件夹名字uart就是组件名字&#xff09;这里更改了文件名字 在整个工程目录下找到&#xff1a; 添加路径 finish&#xff01; 调用 程…

SQL进阶技巧:如何计算加油站问题? | LeetCode 134. 加油站

目录 0 问题描述 1 数据准备 2 问题分析 计算每个加油站剩余油量(当前油量减去到下一个加油站消耗的油量)

【Android】application@label 属性属性冲突报错

错误记录 What went wrong: Execution failed for task :app:processDebugMainManifest. > Manifest merger failed : Attribute applicationlabel value(string/app_name) from AndroidManifest.xml:8:9-41is also present at [:abslibrary] AndroidManifest.xml:25:9-47 v…

idea报错:There is not enough memory to perform the requested operation.

文章目录 一、问题描述二、先解决三、后原因&#xff08;了解&#xff09; 一、问题描述 就是在使用 IDEA 写代码时&#xff0c;IDEA 可能会弹一个窗&#xff0c;大概提示你目前使用的 IDEA 内存不足&#xff0c;其实就是提醒你 JVM 的内存不够了&#xff0c;需要重新分配。弹…

深入解析:构建高效单页应用(SPA)的最佳实践与示例

文章目录 前言一、单页应用&#xff08;SPA&#xff09;的介绍二、单页应用&#xff08;SPA&#xff09;的优势三、构建单页应用&#xff08;SPA&#xff09;的基本步骤四、使用Vue.js构建一个简易的单页应用&#xff08;SPA&#xff09;&#xff1a;任务管理器结语 前言 随着…

PHP高性能webman管理系统EasyAdmin8

介绍 EasyAdmin8-webman 在 EasyAdmin 的基础上使用 webman 最新版重构&#xff0c;PHP 最低版本要求不低于 8.0。基于webman和layui v2.9.x的快速开发的后台管理系统。 项目地址&#xff1a;http://easyadmin8.top 演示地址&#xff1a;http://webman.easyadmin8.top/admin …

运算符 - 算术、关系、逻辑运算符

引言 在编程中&#xff0c;运算符是用于执行特定操作的符号。C 提供了多种类型的运算符&#xff0c;包括算术运算符、关系运算符和逻辑运算符等。理解这些运算符及其用法对于编写高效且无误的代码至关重要。本文将详细介绍 C 中的这三种基本运算符&#xff0c;并通过实例帮助读…

简单讲解关于微信小程序调整 miniprogram 后, tabbar 找不到图片的原因之一

微信小程序开发&#xff0c;[ miniprogram/app.json 文件内容错误]&#xff0c;["tabBar"]["list"][0]["iconPath"]: "/miniprogram/assets/tabbar/icon_main_home.png" 未找到 简单讲解关于调整 miniprogram 后&#xff0c; tabbar 找…

ThinkPHP 数据库操作详解:CRUD 实现与最佳实践

ThinkPHP 数据库操作详解&#xff1a;CRUD 实现与最佳实践 在现代 Web 开发中&#xff0c;数据库操作是应用程序的核心部分。ThinkPHP 作为一款流行的 PHP 框架&#xff0c;提供了强大的数据库操作功能&#xff0c;使得开发者能够高效地进行数据的增删改查&#xff08;CRUD&am…