【逐行注释】MATLAB代码,一维情况的EKF滤波,代码与详细注释|附下载链接

在这里插入图片描述

介绍

这是一个状态量为一维的MATLAB下的滤波程序,使用的滤波方法是EKF(扩展卡尔曼滤波),滤波后,显示滤波值的曲线、滤波误差曲线、滤波误差的最大值、平均值、标准差的输出。
模型是非线性的(状态方程和观测方程都是非线性的),我将模型设计得尽可能复杂一些,拿到手以后可以从难往简单的方向改,更容易上手。

运行结果

滤波前后的状态、观测量的曲线如下图:
在这里插入图片描述
滤波前后的误差对比曲线

  • KF为滤波后
  • without KF是滤波前
    在这里插入图片描述
    第三幅图是滤波前后的误差CDF图像对比:
    在这里插入图片描述

关于CDF的介绍

CDF图像介绍
CDF图像是指累积分布函数图像,它是一种用来描述数据集的统计分布情况的图像表示方法。CDF图像用于展示数据集中各个数值的累积分布情况,即对于每个数值,CDF图像显示了小于或等于该数值的数据所占整个数据集的百分比。
总之,CDF图像是一种直观、简洁的图像表示方法,在数据分析、统计学和概率论等领域有着广泛的应用。

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

部分代码展示

在这里插入图片描述

完整代码下载链接

https://download.csdn.net/download/callmeup/89677357

各模块含义

程序分成初始化、模型建立、EKF滤波、结果展示这四个模块:

  1. 初始化部分如上图,定义了滤波的P/Q/R等值、给滤波中需要用到的变量分配内存空间。
  2. 模型建立部分通过for循环和迭代,完成真值、观测值、滤波前的状态值的生成
  3. EKF滤波为滤波主题
  4. 结果展示为绘图和统计特性计算与输出的部分

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
如有需要,可私信或通过下方的微信联系我。

  • 4
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一个基于Matlab语言EKF滤波器程序,其中状态方程为非线性,测量方程为线性: ``` % EKF滤波器程序,状态方程为非线性,测量方程为线性 % 状态方程:x(k+1) = f(x(k), u(k)) + w(k) % 测量方程:z(k) = H*x(k) + v(k) % 初始化 x0 = [0; 0]; % 初始状态向量 P0 = diag([1, 1]); % 初始协方差矩阵 Q = eye(2); % 状态噪声协方差矩阵 R = 1; % 测量噪声协方差 % 状态转移函数 f = @(x, u) [x(1)+x(2)*u; x(2)-x(1)*u^2]; % 测量函数 H = [1, 0; 0, 1]; % 生成随机数据 N = 100; % 数据量 u = randn(N, 1); % 控制向量 w = mvnrnd([0; 0], Q, N)'; % 状态噪声 v = sqrt(R)*randn(N, 1); % 测量噪声 x = zeros(2, N); % 状态向量 z = zeros(1, N); % 测量向量 x(:, 1) = x0; % 赋初值 z(1) = H*x(:, 1) + v(1); % 赋初值 for k = 2:N x(:, k) = f(x(:, k-1), u(k-1)) + w(:, k); % 状态转移 z(k) = H*x(:, k) + v(k); % 测量 end % EKF滤波器 x_hat = zeros(2, N); % 估计状态向量 P = zeros(2, 2, N); % 估计协方差矩阵 x_hat(:, 1) = x0; % 初始估计 P(:, :, 1) = P0; % 初始估计协方差矩阵 for k = 2:N % 预测步骤 x_pred = f(x_hat(:, k-1), u(k-1)); % 状态预测 F = [1+u(k-1)^2, u(k-1); -2*u(k-1), 1]; % 状态转移矩阵 P_pred = F*P(:, :, k-1)*F' + Q; % 协方差矩阵预测 % 更新步骤 K = P_pred*H'/(H*P_pred*H' + R); % 卡尔曼增益 x_hat(:, k) = x_pred + K*(z(k) - H*x_pred); % 状态估计 P(:, :, k) = (eye(2) - K*H)*P_pred; % 协方差矩阵估计 end % 绘图 figure subplot(2, 1, 1) plot(1:N, x(1, :), 'b', 1:N, x_hat(1, :), 'r') xlabel('时间') ylabel('状态量1') legend('真实值', '估计值') subplot(2, 1, 2) plot(1:N, x(2, :), 'b', 1:N, x_hat(2, :), 'r') xlabel('时间') ylabel('状态量2') legend('真实值', '估计值') ``` 注:以上程序仅供参考,具体实现可能需要根据具体情况进行调整,特别是状态转移函数和测量函数的定义需要根据具体问题进行修改。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

MATLAB卡尔曼

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值