【逐行注释】PF(Particle filter,粒子滤波)的MATLAB代码(附源代码)

news2024/11/27 23:47:06

在这里插入图片描述

文章目录

  • 程序设计
    • 1. 介绍
    • 2. 系统模型
    • 3. 算法步骤
  • 源代码
  • 运行结果

程序设计

1. 介绍

粒子滤波是一种用于动态系统状态估计的先进方法,广泛应用于机器人定位、目标跟踪和金融预测等领域。该算法通过一组粒子及其权重来表示系统状态的概率分布,能够有效处理非线性和非高斯的系统。在每个时间步中,粒子滤波首先随机初始化粒子的位置和权重,然后根据系统的状态方程对粒子进行预测,接着计算每个粒子与实际观测值的匹配程度以更新权重。为了避免粒子退化,算法执行重采样步骤,根据权重选择新的粒子集合,最后通过加权平均得到当前时刻的状态估计。通过图形化展示真实状态、观测值和估计结果,粒子滤波能够在含噪声的环境中提供精准的状态估计,展现其在复杂动态环境中的优秀性能。

2. 系统模型

2.1 状态方程

系统的状态可以通过以下非线性方程进行描述:

X k = f ( X k − 1 ) + w k X_k=f\left(X_{k-1}\right)+w_k Xk=f(Xk1)+wk

其中:

  • X k X_k Xk 表示在时间 k k k 的状态向量。
  • 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\left(X_{k-1}\right)=\left[\begin{array}{c} X_{1, k-1}+\frac{2.5 \cdot X_{1, k-1}}{1+X_{1, k-1}^2}+8 \cdot \cos (1.2 \cdot(k-1)) \\ X_{2, k-1}+1 \\ X_{3, k-1} \end{array}\right] f(Xk1)= X1,k1+1+X1,k122.5X1,k1+8cos(1.2(k1))X2,k1+1X3,k1

  • w k w_k wk 是过程噪声,假设其符合高斯分布 w k ∼ N ( 0 , Q ) w_k \sim \mathcal{N}(0, Q) wkN(0,Q)
    2.2 观测方程

观测模型通过以下方程描述:

Z k = h ( X k ) + v k Z_k=h\left(X_k\right)+v_k Zk=h(Xk)+vk

其中:

  • Z k Z_k Zk 是在时间 k k k 的观测值。
  • h ( ⋅ ) h(\cdot) h() 是观测函数,定义为:

h ( X k ) = [ X 1 , k 2 X 2 , k 2 X 3 , k ] h\left(X_k\right)=\left[\begin{array}{c} \frac{X_{1, k}^2}{X_{2, k}^2} \\ X_{3, k} \end{array}\right] h(Xk)=[X2,k2X1,k2X3,k]

  • v k v_k vk 是观测噪声,假设其符合高斯分布 v k ∼ N ( 0 , R ) v_k \sim \mathcal{N}(0, R) vkN(0,R)

3. 算法步骤

3.1 初始化

  1. 设置粒子数量 N N N 和时间步 t t t
  2. 初始化粒子的位置 P P P :

P ( : , i ) = X ( : , 1 ) , ∀ i ∈ [ 1 , N ] P(:, i)=X(:, 1), \quad \forall i \in[1, N] P(:,i)=X(:,1),i[1,N]

  1. 计算初始观测值 Z P Z_P ZP 并计算权重 w w w :

w ( : , i ) = 1 2 π R ⋅ exp ⁡ ( − ∥ Z P ( : , i ) − Z ( : , 1 ) ∥ 2 2 R ) w(:, i)=\frac{1}{\sqrt{2 \pi R}} \cdot \exp \left(-\frac{\left\|Z_P(:, i)-Z(:, 1)\right\|^2}{2 R}\right) w(:,i)=2πR 1exp(2RZP(:,i)Z(:,1)2)
3.2 预测步骤

在每个时间步 k k k 中:

  1. 对每个粒子进行状态预测:

P ( : , i ) = f ( X p f ( k − 1 ) ) + w p f , k P(:, i)=f\left(X_{p f}(k-1)\right)+w_{p f, k} P(:,i)=f(Xpf(k1))+wpf,k

  1. 计算预测观测值 Z P Z_P ZP :

Z P ( : , i ) = h ( P ( : , i ) ) Z_P(:, i)=h(P(:, i)) ZP(:,i)=h(P(:,i))

3.3 更新权重

  1. 计算每个粒子的权重:

w ( : , i ) = 1 2 π R ⋅ exp ⁡ ( − ∥ Z P ( : , i ) − Z k ∥ 2 2 R ) w(:, i)=\frac{1}{\sqrt{2 \pi R}} \cdot \exp \left(-\frac{\left\|Z_P(:, i)-Z_k\right\|^2}{2 R}\right) w(:,i)=2πR 1exp(2RZP(:,i)Zk2)

  1. 归一化权重:

w ( : , i ) = w ( : , i ) ∑ j = 1 N w ( : , j ) w(:, i)=\frac{w(:, i)}{\sum_{j=1}^N w(:, j)} w(:,i)=j=1Nw(:,j)w(:,i)

3.4 重采样步骤

  1. 根据权重重采样,生成新的粒子集合 P next  P_{\text {next }} Pnext  :

P next  ( : , i ) = P ( : ,  index  ) P_{\text {next }}(:, i)=P(:, \text { index }) Pnext (:,i)=P(:, index )

3.5 状态估计

最终的状态估计为所有粒子的加权平均:

X p f ( k ) = 1 N ∑ i = 1 N P ( : , i ) X_{p f}(k)=\frac{1}{N} \sum_{i=1}^N P(:, i) Xpf(k)=N1i=1NP(:,i)

源代码

根据以上的模型,编写Matlab的代码。原代码如下所示:

% PF三维滤波效果对比
% author:Evand
% 作者联系方式VX:matlabfilter(除前期达成一致外,咨询需付费)
% 2024-9-2/Ver1
% 2024-10-01/Ver2:添加逐行注释
clear; clc; close all; % 清空工作空间、命令窗口和关闭所有图形窗口
rng(0); % 设置随机数生成器的种子,确保结果可复现
%% 参数设置
N = 100; % 粒子总数
t = 1:1:1000; % 时间向量,从1到1000
Q = 1*diag([1,1,1]); % 过程噪声的协方差矩阵
w_pf = sqrt(Q) * randn(size(Q,1), length(t)); % 生成过程噪声,维度与状态一致
R = 1*diag([1,1,1]); % 观测噪声的协方差矩阵
v_pf = 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_pf(:, 1); % 计算初始观测值
fprintf('源代码下载链接:gf.bilibili.com/item/detail/1106357012');
web('https://gf.bilibili.com/item/detail/1106357012');
% 设定变量维度
X_ = zeros(3, length(t)); % 初始化未滤波状态矩阵


运行结果

三维状态量的曲线:
在这里插入图片描述
三维状态量误差曲线:
在这里插入图片描述
三维误差的CDF图像:
在这里插入图片描述
滤波前后误差的统计特性(命令行截图):
在这里插入图片描述

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

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

相关文章

JavaSE——面向对象8:Object类详解(==与equals的区别、hashCode、toString方法)

目录 一、与equals()的区别 (一)是一个比较运算符 (二)equals是Object类中的方法,只能判断引用类型 (三)equals方法重写练习 1.练习1 2.练习2 3.练习3 二、hashCode方法 三、toString方法 1.默认返回:全类名(包名类名)哈希值的十六进制 (1)不…

VS编译器实用调试技巧

一.什么是bug bug本意是"昆虫"或"虫子],现在一般是指在电脑系统或程序中,隐藏着的一些未被发现的缺陷或问题,简称程序漏洞。“Bug"的创始人格蕾丝.赫柏(Grace Murray Hopper)&#xff…

算法笔记(七)——哈希表

文章目录 两数之和判定是否互为字符重排存在重复元素存在重复元素 II字母异位词分组 哈希表:一种存储数据的容器; 可以快速查找某个元素,时间复杂度O(1); 当频繁查找某一个数时,我们可以使用哈希表 创建一个容器&#…

堆的代码和基础知识

堆的向上和向下调整-CSDN博客 1.堆的基础知识 2.堆的代码 Heap.h #pragma once #include<stdio.h> #include<assert.h> #include<stdlib.h> #include<stdbool.h> #include<time.h>// typedef int HPDataType; typedef struct Heap {HPDataTy…

电场磁场,能量密度和平均值(定义式是用实数场计算的,不能直接将定义式里面修改为复数场)

能量密度的定义式&#xff0c;都是实数场 平均能量密度&#xff0c;里面的是复数表示的场。具体推导类似坡印廷矢量 、

4.6章节python中空语句pass保留字作用

在Python中&#xff0c;pass 是一个空语句&#xff0c;它什么也不做。它通常用作占位符&#xff0c;在需要语法上需要一个语句但程序逻辑上不需要执行任何操作的地方。 1.占位符&#xff1a;在编写代码时&#xff0c;如果你还没有决定某个部分应该做什么&#xff0c;可以先用 p…

[深度学习][python]yolov11+bytetrack+pyqt5实现目标追踪

【算法介绍】 YOLOv11、ByteTrack和PyQt5的组合为实现高效目标追踪提供了一个强大的解决方案。 YOLOv11是YOLO系列的最新版本&#xff0c;它在保持高检测速度的同时&#xff0c;通过改进网络结构、优化损失函数等方式&#xff0c;提高了检测精度&#xff0c;能够同时处理多个…

android RadioButton 设置颜色无效

原因好像是 RadioButton 自动被渲染为 MaterialRadioButton 设置颜色使用这个属性 app:buttonTint“color/black” material-components-android/docs/components/RadioButton.md at master material-components/material-components-android (github.com)https://github.…

【MySQL】SQL介绍+基础+DDL+数据备份+还原

目录 一、DDL建库建表 1. 数据库 2. 内部4特征 3. 外部4特征 4. 数据库结构 5. SQL语句分类&#xff08;重点&#xff09; 6. 注意 7. 数据库表的字段类型 8. 存储引擎 9. 数据库表的操作 二、三范式 1. 什么是范式 2. 约束作用 3. 三范式 4. 第一范式&#xff…

Python从入门到高手4.2节-掌握循环控制语句

目录 4.2.1 理解循环控制 4.2.2 for循环结构 4.2.3 循环结构的else语句 4.2.4 while循环结构 4.2.5 循环结构可以嵌套 4.2.6 国庆节吃好玩好 4.2.1 理解循环控制 我们先来搞清楚循环的含义。以下内容引自汉语词典: 循环意指往复回旋&#xff0c;指事物周而复始地运动或变…

Sharp.js:简单而又实用的图像处理库

前言 在现代Web开发中&#xff0c;图像处理是一个不可或缺的部分。 前端开发者经常需要处理图像&#xff0c;以确保它们在不同的设备和分辨率上都能保持良好的显示效果。 sharp.js是一个高性能的Node.js模块&#xff0c;它利用了libvips库&#xff0c;提供了快速且高效的图像…

网安学习(js漏洞挖掘)

内容来自bili白帽大法师白帽大法师的个人空间-白帽大法师个人主页-哔哩哔哩视频 (bilibili.com) 四种方式 目录 1、JS中存在插件名字&#xff0c;根据插件找到相应的漏洞直接利用 2、JS中存在一些URL链接&#xff0c;根据URL链接找到相应的页面进一步测试和利用 3、JS中存…

《软件工程概论》作业一:新冠疫情下软件产品设计

课程说明&#xff1a;《软件工程概论》为浙江科技学院2018级软件工程专业在大二下学期开设的必修课。课程使用《软件工程导论&#xff08;第6版&#xff09;》&#xff08;张海藩等编著&#xff0c;清华大学出版社&#xff09;作为教材。以《软件设计文档国家标准GBT8567-2006》…

Python案例--水仙花数的探索之旅

一、引言 水仙花数&#xff0c;也称为阿姆斯特朗数&#xff0c;是一种特殊的三位数&#xff0c;其各位数字的立方和等于其本身。例如&#xff0c;153就是一个水仙花数&#xff0c;因为 135333153135333153。这种数字的发现不仅展示了数字的内在美&#xff0c;也激发了人们对数…

STM32编码器接口解析及抗噪声措施探讨

1. 引言 在现代控制系统中&#xff0c;编码器扮演着非常重要的角色。它就像一个精密的测量工具&#xff0c;可以告诉我们机械部件的位置和运动状态。在STM32微控制器中&#xff0c;编码器接口可以轻松地与各种编码器连接&#xff0c;实现精确的控制。我将在这里探讨STM32编码器…

unity 默认渲染管线材质球的材质通道,材质球的材质通道

标准渲染管线——材质球的材质通道 文档&#xff0c;与内容无关&#xff0c;是介绍材质球的属性的。 https://docs.unity3d.com/2022.1/Documentation/Manual/StandardShaderMaterialParameters.html游戏资源中常见的贴图类型 https://zhuanlan.zhihu.com/p/260973533 十大贴图…

flutter_鸿蒙next(win)环境搭建

第一步 拉取鸿蒙版本flutterSDK仓库 仓库地址&#xff1a;OpenHarmony-SIG/flutter_flutter 第二步 找到拉取的仓库中的README.md 并根据说明配置环境 第三步 配置好环境变量之后 用管理员开启cmd 输入&#xff1a;flutter dcotor 并查看此时flutter所支持的系统 包括&…

Cpp::STL—string类的模拟实现(12)

文章目录 前言一、string类各函数接口总览二、默认构造函数string(const char* str "");string(const string& str);传统拷贝写法现代拷贝写法 string& operator(const string& str);传统赋值构造现代赋值构造 ~string(); 三、迭代器相关函数begin &…

leetcode打卡001-约瑟夫问题

约瑟夫问题 其背景故事是关于一组人站成一个圈&#xff0c;从某个人开始报数&#xff0c;每数到特定数字的人将被淘汰出圈&#xff0c;然后从被淘汰人的下一个人重新开始报数&#xff0c;直到最后剩下一个人。问题的目标是确定最后剩下的那个人在最初的位置。 关键词 递归&a…

HCIP-HarmonyOS Application Developer 习题(四)

1、以下哪个Harmonyos的AI能力可以提供文档翻拍过程中的辅助增强功能? A.文档检测矫正 B.通用文字识别 C.分词 D.图像超分辨率 答案&#xff1a;A 分析&#xff1a;文档校正提供了文档翻拍过程的辅助增强功能&#xff0c;包含两个子功能&#xff1a; 文档检测&#xff1a;能够…