粒子滤波原理及非线性系统应用仿真工具箱
项目简介
本项目是一个集理论验证与工程应用仿真于一体的 MATLAB 算法工具箱,专注于粒子滤波 (Particle Filter, PF) 算法在非线性、非高斯系统中的核心应用。项目旨在通过清晰的代码结构和直观的仿真结果,展示粒子滤波如何利用蒙特卡洛方法和贝叶斯估计理论,解决复杂状态空间下的状态估计问题。
代码通过三个典型的应用场景(单目标非线性跟踪、多目标跟踪、电池寿命预测),完整实现了从粒子初始化、状态预测、权重更新到重采样的全流程。
主要功能特性
- 完全且详细的算法实现:摒弃黑盒调用,通过原生 MATLAB 代码逐行实现了粒子滤波的每一个步骤(预测、似然计算、权重归一化、重采样)。
- 模块化场景设计:将不同复杂度的应用场景封装为独立的函数,便于单独运行和分析。
- 结果可复现:内置固定随机种子机制,确保每次仿真的粒子演化路径和滤波结果一致,便于教学演示和算法对比。
- 丰富的可视化:每个场景均配备了动态或静态的绘图功能,包括真实轨迹、估计轨迹、观测点以及粒子云的演化分布。
系统仿真场景详解
本项目在 main 入口函数中依次集成了以下三大核心仿真场景:
1. 单目标非线性跟踪 (UNGM 模型)
该场景演示了粒子滤波在处理强非线性、非高斯系统时的优势,这是卡尔曼滤波(KF)失效的典型场景。
- 系统模型:采用单变量非平稳增长模型 (Univariate Non-stationary Growth Model)。
*
状态方程:包含非线性分式项
x/(1+x^2) 和时变余弦项
cos(k),模拟极不稳定的系统状态演化。
*
观测方程:状态的平方形式
x^2 / 20,引入了非线性观测映射。
* 粒子群通过非线性状态方程进行传播。
* 利用高斯似然函数计算观测权重。
*
自适应重采样:通过计算有效粒子数 (N_eff) 判断是否需要执行系统重采样,防止粒子退化。
- 输出结果:计算并显示均方根误差 (RMSE),绘制粒子分布散点图,直观展示粒子如何聚集在真实状态附近。
2. 多目标跟踪 (Multi-Target Tracking, MTT)
该场景展示了如何在存在观测不确定性和数据关联困难的情况下,同时跟踪多个目标。
- 系统模型:2D 平面内的恒速 (Constant Velocity, CV) 运动模型。
- 复杂场景:设置了两个目标在平面上进行路径交叉运动,模拟混淆场景。
- 核心算法逻辑:
*
独立滤波:为每个目标维护一个独立的粒子滤波器结构体,分别存储粒子群和权重。
*
数据关联 (GNN):实现了简化的全局最近邻关联算法。通过计算预测位置与当前时刻量测数据的欧氏距离矩阵,采用贪心策略将量测分配给目标。
*
关联门限:设置了距离阈值,排除杂波或过远的错误关联。
*
差异化更新:关联成功的滤波器执行权重更新和重采样;未关联目标的滤波器仅执行预测步骤(纯推演)。
- 可视化:同时显示两个目标的真实轨迹、PF 估计轨迹以及原始量测点,清晰展示在交叉点附近的跟踪性能。
3. 电池剩余寿命预测 (RUL Prediction)
该场景应用粒子滤波解决状态本身包含未知参数的一类问题,模拟锂电池退化过程。
- 系统模型:基于容量退化的指数模型,其中退化速率是非线性的且包含随机过程。
- 状态增强 (State Augmentation):
* 粒子状态向量不仅包含当前的
电池容量,还包含未知的
退化速率 (Fading Rate)。
* 通过“联合估计”策略,在滤波过程中同时估计系统状态和模型参数。
*
在线监测阶段:以前 80 个周期的观测数据为输入,利用粒子滤波动态修正对当前容量的估计,并自适应调整对退化速率参数的识别。
* 通过随机游走模型允许退化速率参数随时间缓慢漂移,以适应电池的非线性老化特性。
- 实现细节:展示了如何构建双维度粒子(容量 + 速率),并通过观测到的容量数据反向更新潜在的退化速率分布。
关键算法与实现细节
代码中核心的粒子滤波逻辑包含以下四个标准步骤:
- 初始化 (Initialization)
* 根据先验知识(如高斯分布)生成 N 个初始粒子。
* 在单目标场景中 N=200,在复杂的多目标和 RUL 场景中增加了粒子数(N=500/1000)以保证精度。
- 预测 (Prediction / Sampling)
* 依据系统的状态转移方程,将上一时刻的粒子映射到当前时刻。
* 在此步骤注入过程噪声 (Process Noise),增加粒子的多样性。
- 更新 (Update / Weighting)
* 获取当前时刻的观测值。
* 计算预测观测值与实际观测值的残差。
* 基于高斯似然函数更新每个粒子的权重:残差越小,权重越大。
*
权重归一化:确保所有粒子权重之和为 1。
- 重采样 (Resampling)
*
触发条件:代码计算 $1 / sum(w^2)$ 得到有效粒子数 $N_{eff}$。当有效粒子数低于阈值(如 N/2)时触发。
*
机制:复制高权重粒子,淘汰低权重粒子,将权重重置为 $1/N$。代码中调用了
resample_systematic 系列函数实现系统重采样算法。
使用方法
- 确保计算机安装有 MATLAB 软件。
- 将包含
main.m 及相关重采样辅助函数(如 resample_systematic)的文件夹设置为 MATLAB 当前工作路径。 - 直接运行
main 函数。 - 程序将依次执行三个场景的仿真,并在每个场景结束后弹出对应的结果分析图窗。
系统要求
- MATLAB R2016b 或更高版本(主要使用了基础绘图和矩阵运算功能,无特殊工具箱强依赖)。
- 统计与机器学习工具箱 (Statistics and Machine Learning Toolbox) - 代码中使用了
mvnrnd 生成多维随机数。