首页 > 其他分享 >二维的集合卡尔曼滤波(Ensemble Kalman Filter,EnKF)(模拟平面上的目标跟踪),MATLAB代码

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

时间:2024-12-02 20:30:53浏览次数:6  
标签:状态 Kalman 测量 卡尔曼滤波 矩阵 Filter 协方差 集合

在这里插入图片描述

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

文章目录

理论基础

卡尔曼滤波

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

  • 状态方程:
    x k = A x k − 1 + B u k + w k x_k = Ax_{k-1} + Bu_k + w_k xk​=Axk−1​+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​=Axk−1i​+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​=N1​i=1∑N​xki​

  • 协方差:
    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​=N−11​i=1∑N​(xki​−xˉk​)(xki​−xˉk​)T

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

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

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

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

更新集合
最后,更新每个样本:
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​+Kk​yk​(i=1,2,…,N)

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

运行结果

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

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

应用领域

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

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

结论

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

代码或文章内容有疑问,可联系作者

标签:状态,Kalman,测量,卡尔曼滤波,矩阵,Filter,协方差,集合
From: https://blog.csdn.net/2401_86544394/article/details/143709608

相关文章

  • 【逐行注释】容积卡尔曼滤波的MATLAB例程(三维CKF),附下载链接
    文章目录CKF程序运行结果绘图部分误差的统计特性计算与输出部分部分代码和注释下载链接CKFCKF全称为容积卡尔曼滤波,相比于UKF(无迹卡尔曼滤波),拥有更合理的理论推导和鲁棒性,且在理论上比UKF的精度更高。另有:与EKF的对比程序:https://blog.csdn.net/callmeup/article......
  • 如何让js的filter方法支持大小写?
    JavaScript的filter方法本身并不直接支持忽略大小写的过滤。你需要在filter的回调函数中手动实现大小写不敏感的比较。以下几种方法可以实现:1.使用toLowerCase()或toUpperCase():这是最常见和最简单的方法。将要比较的字符串都转换为小写或大写,然后再进行比较。const......
  • opencv调用摄像头(卡尔曼滤波)
    importcv2importnumpyasnpimportonnxruntimeimportxlsxwriterimportos#coco80类别CLASSES=['card']classYOLOV5():def__init__(self,onnxpath):self.onnx_session=onnxruntime.InferenceSession(onnxpath)self.input......
  • 举例说明这三种方法map、reduce和filter的区别是什么?
    map、reduce和filter都是JavaScript数组的高阶函数,它们允许你以声明式的方式操作数组,而无需显式地编写循环。它们的主要区别在于它们如何转换数组以及返回的结果:1.map:作用:对数组的每个元素应用一个函数,并返回一个包含转换后元素的新数组。原始数组保持不变。类比:......
  • 卡尔曼滤波
    参考文章:卡尔曼滤波原理详解及系统模型建立(simulink)系统数学建模两大等式\(X(k)=AX(k-1)+BU(k)+w(k)\)\(Z(k)=HX(k)+v(k)\)卡尔曼滤波五大等式\(X(k|k-1)=AX(k-1|k-1)+BU(k)\)\(X(k|k-1)\):根据上一时刻最优估计值求得的当前值\(X(k-1|k-1)\):上一时刻最优估计值\(A\):状......
  • WEB攻防-XSS跨站&CSP策略&HttpOnly属性&Filter过滤器&标签闭合&事件触发
    1.CSP(ContentSecurityPolicy内容安全策略)内容安全策略是一种可信白名单机制,来限制网站中是否可以包含某来源内容。该制度明确告诉客户端,哪些外部资源可以加载和执行,等同于提供白名单,它的实现和执行全部由浏览器完成,开发者只需提供配置。禁止加载外域代码,防止复杂的攻击......
  • QListView 使用QSortFilterProxyModel 过滤后的Item 无法拖动改变顺序
    当使用QSortFilterProxyModel对QListView进行过滤时,拖动顺序的改变通常不会生效,因为QSortFilterProxyModel是只读的,不支持修改模型中的数据顺序。要解决这个问题,可以通过以下方法实现:操作源模型:在拖动和放置时,将操作应用于QSortFilterProxyModel的源模型(sourceModel)......
  • JavaWeb合集17-拦截器(Interceptor)和过滤器(Filter)
    十七、拦截器和过滤器在JavaWeb开发中,拦截器(Interceptor)和过滤器(Filter)都是用于在请求处理前后执行某些操作的机制。虽然它们的功能相似,但在实现方式、使用场景和灵活性方面有一些重要的区别。1、拦截器和过滤器的区别及选择1.1拦截器定义:拦截器是Spring框架提供......
  • 卡尔曼滤波(Kalman Filter)MATLAB代码
    卡尔曼滤波(KalmanFilter)是一种用于估计动态系统状态的递归算法,尤其适用于含有噪声的线性系统。它在时间序列数据的噪声抑制、状态估计、轨迹跟踪等领域非常常用,如自动控制、信号处理、导航系统等。卡尔曼滤波通过预测和更新两个步骤来递归地估计系统的状态,并根据噪声和测......
  • 199号资源-源程序:(SCI论文+程序)具有部分观测损失的卡尔曼滤波-----已提供下载资源
    ......