EKF例程 matlab

% 不含IMU误差方程的EKF滤波典型程序,适用于多次滤波的第二级

% author:Evand

% date: 2023-09-20

% Ver1

clear;clc;close all;

global T

%% initial

T = 0.1; %采样率

t = T:T:100;

Q = 0.1diag(1,1,1);w=sqrt(Q)randn(size(Q,1),length(t));
R = 1
diag(1,1,1);v=sqrt®randn(size(R,1),length(t));
P = 1
eye(3);
P_num = zeros(length(t),size(P,1),size(P,2)); %存放每次迭代的P
X=zeros(3,length(t));
X_ekf=zeros(3,length(t));
X_ekf(1,1)=X(1,1);
Z=zeros(3,length(t)); %定义观测值形式
Z(:,1)=X(1,1)\^2/20;X(2,1);X(3,1)+v(:,1); %观测量
%% model
X_=zeros(3,length(t));
X_(:,1)=X(:,1);
for i1 = 2:length(t)
X(:,i1) = [1 * X(1,i1-1) + (2.5 * X(1,i1-1) / (1 + X(1,i1-1).^2)) + 8 * cos(1.2
(i1-1));

X(2,i1-1)+1;

(2X(3,i1-1)+1)^0.5]; %真实值
X_(:,i1) = [1 * X_(1,i1-1) + (2.5 * X_(1,i1-1) / (1 + X_(1,i1-1).^2)) + 8 * cos(1.2
(i1-1));

X_(2,i1-1)+1;

X_(3,i1-1)] + w(:,i1-1);%未滤波的值

Z(:,i1) = X(1,i1).\^2 / 20;X(2,i1);X(3,i1) + v(i1); %观测值

end

%% EKF

for k = 2 : length(t)

Xpre = [1X_ekf(1,k-1)+ 2.5 X_ekf(1,k-1)./(1+X_ekf(1,k-1).^2) + 8 * cos(1.2*(k-1));

X_ekf(2,k-1)+1;

X_ekf(3,k-1)]+w(:,k-1);

Z_hat =Xpre(1).\^2/20;Xpre(2);Xpre(3);

F = [1 + 2.5 * (1-X_ekf(1,k-1).2)/((1+X_ekf(1,k-1).2).^2),0,0;

0,1,0;

0,0,(2X_ekf(3,k-1)+1)^(-0.5)];
H = Xpre(1)/10,0,0; 0,1,0; 0,0,1;
PP=F
PF'+Q;
Kk=PP
H'/(HPP H'+R);

X_ekf(:,k)=Xpre+Kk*(Z(:,k)-Z_hat);

P=PP-KkH PP;

end

%% display

figure;

subplot(3,1,1);

plot(t,X(1,:),t,X_ekf(1,:));

title('EKF');

legend('real','EKF');

subplot(3,1,2);

plot(t,X(2,:),t,X_ekf(2,:));

subplot(3,1,3);

plot(t,X(3,:),t,X_ekf(3,:));

figure;

subplot(3,1,1); %1st

plot(t,X_ekf(1,:)-X(1,:),t,X_(1,:)-X(1,:));

title('Err');

legend('EKF','without KF');

\~,p1 = max(abs(X_ekf(1,:)-X(1,:)));

h = gca().Children(1);

datatip(h,p1T-1,X_ekf(1,p1)-X(1,p1));
\~,p2 = max(abs(X_(1,:)-X(1,:)));
datatip(h,p2
T-1,X_(1,p2)-X(1,p2));

subplot(3,1,2); %2nd

plot(t,X_ekf(2,:)-X(2,:),t,X_(2,:)-X(2,:));

subplot(3,1,3); %3rd

plot(t,X_ekf(3,:)-X(3,:),t,X_(3,:)-X(3,:));

\~,p1 = max(abs(X_ekf(3,:)-X(3,:)));

h = gca().Children(1);

datatip(h,p1T-1,X_ekf(3,p1)-X(3,p1));
\~,p2 = max(abs(X_(3,:)-X(3,:)));
datatip(h,p2
T-1,X_(3,p2)-X(3,p2));

figure;

subplot(3,1,1); %1st

cdfplot(abs(X_ekf(1,:)-X(1,:)));

hold on

cdfplot(abs(X_(1,:)-X(1,:)));

legend('EKF','without KF');

subplot(3,1,2); %2nd

cdfplot(abs(X_ekf(2,:)-X(2,:)));

hold on

cdfplot(abs(X_(2,:)-X(2,:)));

subplot(3,1,3); %3rd

cdfplot(abs(X_ekf(3,:)-X(3,:)));

hold on

cdfplot(abs(X_(3,:)-X(3,:)));

相关推荐
IvanCodes2 小时前
Python 数据处理(十三):JSON、CSV 与数据序列化
开发语言·python
aramae4 小时前
MySQL复合查询(8)
java·c语言·开发语言·后端·算法
qq_2518364577 小时前
springboot vue3 开发实现 拼豆管理系统
java·开发语言·ai编程
郑州光合科技余经理7 小时前
同城外卖小程序开发:下单成功后,后台导出能不能对上用户端状态
开发语言·前端·git·后端·uni-app·php·ai编程
知识分享小能手8 小时前
C++ 学习教程,从入门到精通,C++ 入门知识 — 完整知识点(1)
开发语言·c++·学习
+VX:Fegn08958 小时前
计算机毕业设计|基于springboot + vue旅游管理系统(源码+数据库+文档)
java·开发语言·vue.js·spring boot·课程设计
阿里嘎多学长9 小时前
2026-09-20 GitHub 热点项目精选
开发语言·程序员·github·代码托管
weixin_3077791310 小时前
C++代码实现MATLAB中的ode23tb函数功能
开发语言·c++·算法·matlab
2601_9669496511 小时前
为什么量化回测中 for 循环比 DataFrame 慢三个数量级?从向量化原理讲起
开发语言·python·pandas·股票数据·quantdash
边境悍匪12 小时前
蜗牛学苑 Java 智能体学习 Day45|Knife4j+SpringBoot3、书城项目整合 MyBatis 思维导图复盘
java·开发语言·vue.js·学习·spring