集合卡尔曼滤波(Ensemble Kalman Filter),用于二维滤波(模拟平面上的目标跟踪),MATLAB代码

news/2024/11/22 12:12:31/

在这里插入图片描述

集合卡尔曼滤波(Ensemble Kalman Filter)

文章目录

  • 引言
  • 理论基础
    • 卡尔曼滤波
    • 集合卡尔曼滤波
      • 初始化
      • 预测步骤
      • 更新步骤
      • 卡尔曼增益
      • 更新集合
  • MATLAB 实现
  • 运行结果
  • 3. 应用领域
  • 结论

引言

集合卡尔曼滤波(Ensemble Kalman Filter, EnKF)是一种基于状态估计的非线性滤波方法,广泛应用于动态系统中的状态估计和数据同化问题。它通过使用一组样本(即“集合”)来近似状态的概率分布,有效地处理高维和非线性系统。

理论基础

卡尔曼滤波

卡尔曼滤波是一种递归算法,用于估计线性动态系统的状态。其基本模型可以描述为:

  • 状态方程:
    x k = A x k − 1 + B u k + w k x_k = Ax_{k-1} + Bu_k + w_k xk=Axk1+Buk+wk
    其中, x k x_k xk 是当前状态, A A A 是状态转移矩阵, B B B 是控制输入矩阵, u k u_k uk 是控制输入, w k w_k wk 是过程噪声,通常假设为高斯分布。

  • 测量方程:
    z k = H x k + v k z_k = Hx_k + v_k zk=Hxk+vk
    其中, z k z_k zk 是测量值, H H H 是测量矩阵, v k v_k vk 是测量噪声,通常也假设为高斯分布。

集合卡尔曼滤波

当系统是非线性时,传统卡尔曼滤波的假设可能不再成立,因此需要引入集合卡尔曼滤波。EnKF的基本思想是使用一组状态样本来表示状态分布。具体步骤如下:

初始化

生成初始状态的集合:
X 0 = { x 0 1 , x 0 2 , … , x 0 N } X_0 = \{x_0^1, x_0^2, \ldots, x_0^{N}\} X0={x01,x02,,x0N}
其中, N N N 是集合的大小。通常,样本是从初始状态的概率分布中采样。

预测步骤

根据状态方程更新每个样本:
x k i = A x k − 1 i + B u k + w k i ( i = 1 , 2 , … , N ) x_k^i = A x_{k-1}^i + B u_k + w_k^i \quad (i = 1, 2, \ldots, N) xki=Axk1i+Buk+wki(i=1,2,,N)
其中, w k i w_k^i wki 是从过程噪声分布中采样的噪声。

更新步骤

计算样本的均值和协方差:

  • 均值:
    x ˉ k = 1 N ∑ i = 1 N x k i \bar{x}_k = \frac{1}{N} \sum_{i=1}^{N} x_k^i xˉk=N1i=1Nxki

  • 协方差:
    P k = 1 N − 1 ∑ i = 1 N ( x k i − x ˉ k ) ( x k i − x ˉ k ) T P_k = \frac{1}{N-1} \sum_{i=1}^{N} (x_k^i - \bar{x}_k)(x_k^i - \bar{x}_k)^T Pk=N11i=1N(xkixˉk)(xkixˉk)T

根据测量方程计算创新和创新协方差:

  • 创新:
    y k = z k − H x ˉ k y_k = z_k - H \bar{x}_k yk=zkHxˉk

  • 创新协方差:
    S k = H P k H T + R S_k = H P_k H^T + R Sk=HPkHT+R
    其中, R R R 是测量噪声的协方差。

卡尔曼增益

计算卡尔曼增益:
K k = P k H T S k − 1 K_k = P_k H^T S_k^{-1} Kk=PkHTSk1

更新集合

最后,更新每个样本:
x k i = x k i + K k y k ( i = 1 , 2 , … , N ) x_k^i = x_k^i + K_k y_k \quad (i = 1, 2, \ldots, N) xki=xki+Kkyk(i=1,2,,N)

MATLAB 实现

以下是基于上述理论的 MATLAB 代码示例,用于实现集合卡尔曼滤波:

matlab">% 集合卡尔曼滤波示例
% 2024-11-12/Ver1
clear; clc; close all; % 清除工作空间,清空命令窗口,关闭所有图形窗口
rng(0); % 设置随机数生成器的种子,以确保结果可重复% 参数设置
n = 4; % 状态维度(4个状态变量)
m = 2; % 测量维度(2个测量变量)
N = 100; % 时间步数(总共进行100个时间步的模拟)
num_ensemble = 10; % 集合成员数量(使用10个样本进行估计)
process_noise_cov = 1e-5 * eye(n); % 过程噪声协方差矩阵(小值,表示低噪声)
measurement_noise_cov = 1 * eye(m); % 测量噪声协方差矩阵(较大值,表示较高噪声)% 初始化真实状态
true_state = zeros(n, N); % 创建一个n行N列的零矩阵,用于存储真实状态
true_state(:, 1) = [1; 0; 2; 1]; % 设置初始真实状态(X位移、X速度、Y位移、Y速度)T = 1; %时间间隔
% 状态转移矩阵
A = [1 T 0 0;  % 状态转移矩阵,定义如何从一个状态转移到下一个状态0 1 0 0; 0 0 1 T; 0 0 0 1];% 测量矩阵
H = [1 0 0 0; % 测量矩阵,定义如何从状态生成测量值0 0 1 0];

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

运行结果

轨迹图:
在这里插入图片描述
状态曲线:
在这里插入图片描述
误差曲线:
在这里插入图片描述

误差统计特性输出:
在这里插入图片描述

3. 应用领域

集合卡尔曼滤波在多个领域中得到了广泛应用,包括:

  • 气象学:在天气预报和气候模型中进行数据同化。
  • 环境科学:用于水文模型、污染扩散模型等。
  • 机器人:在定位和导航中进行状态估计。
  • 金融:用于时间序列数据的预测与分析。

结论

集合卡尔曼滤波是一种强大的工具,能够在复杂的非线性和高维状态空间中实现有效的状态估计。通过使用集合样本来近似状态分布,EnKF克服了传统卡尔曼滤波在处理非线性问题时的局限性,具有良好的计算效率和灵活性。随着数据同化和状态估计需求的增加,EnKF的应用前景将更加广泛。

如有需要,可私信或通过下方的卡片联系我


http://www.ppmy.cn/news/1549026.html

相关文章

scPair:隐式特征选择提高single-cell paired多模态分析

配对多模态单细胞分析可在同一细胞中分析多模态特征,用于识别染色质和 mRNA 模态互补的细胞状态以及将调控元件与靶基因联系起来。然而,与单模态分析相比,输入特征的高维度和较浅的测序深度给数据分析带来了挑战。在这里,作者介绍…

USRP X410 价格

价格 官方网站:https://www.ni.com/zh-cn/shop/model/ettus-usrp-x410.html 注意: 官方的价格不含税。 市场价:229475*1.13 259307 打折7折:259307 * 0.7 181514.9

Python 之网络爬虫

一.认识HTML 1.什么是HTML (HyperText Markup Language) HTML是超文本标记语言的缩写,它包含一系列的标签, “超文本”是一种组织信息的方式,利用HTML标记,告诉浏览器被标记的内容如何显示到浏览器页面上…

STM32编程遇到的问题随笔【一】

STM32编程遇到的问题随笔【一】 一、PB4引脚输出一直为高,无论怎么拉低都不起作用 原因PB4和PB3是复用引脚,用于JTAG调试,芯片是默认开启JTAG功能的,如果我们需要用到这两个引脚,必须降JTAG调试功能关闭,…

11.21Scala

import java.io.PrintWriter import scala.io.Source object ddd1 {def main(args: Array[String]): Unit {//读入文件内容val content Source.fromFile("dd.txt").mkStringprintln(content)//2.把字符串拆分为一个一个的单词,保存到数组//正则表达式//…

java Map 遍历 详解

在 Java 中,Map 是一种键值对(Key-Value)形式存储数据的集合接口。遍历 Map 是日常开发中的常见需求。以下是遍历 Map 的详解,包括各种常见方式及其适用场景。 1. Map 的基本结构 在 Java 中,Map 提供了以下几种常用实…

docker是什么

Docker 是一个开源的平台,用于自动化开发、交付和运行应用程序。它利用容器化技术,将应用程序及其依赖项打包成一个独立的单元,称为容器。Docker 容器在任何环境中都能一致地运行,从而解决了“在我的机器上能正常工作”的问题。 …

FastJson反序列化漏洞(CVE-2017-18349)

漏洞原理 原理就不多说了&#xff0c;可以去看我这篇文章&#xff0c;已经写得很详细了。 Java安全—log4j日志&FastJson序列化&JNDI注入-CSDN博客 影响版本 FastJson<1.2.24 复现过程 这里我是用vulfocus.cn这个漏洞平台去复现的&#xff0c;比较方便&#x…