扩展卡尔曼滤波(EKF)算法详细推导及仿真(Matlab)

前言

扩展卡尔曼滤波算法是解决非线性状态估计问题最为直接的一种处理方法,尽管EKF不是最精确的”最优“滤波器,但在过去的几十年成功地应用到许多非线性系统中。所以在学习非线性滤波问题时应该先从EKF开始。
EKF算法是将非线性函数进行泰勒展开,然后省略高阶项,保留展开项的一阶项,以此来实现非线性函数线性化,最后通过卡尔曼滤波算法近似计算系统的状态估计值和方差估计值。

一、EKF算法详细推导

【注】EKF推导参考的是黄蔚的博士论文“CKF及鲁棒滤波在飞行器姿态估计中的应用研究”,论文中EKF,UKF和CKF等算法讲解的都很详细,值得一看。

 

 

 我们把KF与EKF算法拿出来对比可以发现:

 

EKF算法局限性:

  •     该算法线性化会引入阶段误差从而导致滤波精度下降,同时当初始状态误差较大或系统模型非线性程度较高时,滤波精度会受到严重影响甚至发散。
  •     需要计算雅克比矩阵,复杂,计算量大,影响系统的实时性,还会导致EKF算法的数值稳定性差。
  •     当系统存在模型失配,量测干扰,量测丢失,量测延迟或状态突变等复杂情况时,EKF算法鲁棒性差。

 Matlab仿真:

clear all;
clc; 
close all;
tf = 50; 
Q = 10;w=sqrt(Q)*randn(1,tf); 
R = 1;v=sqrt(R)*randn(1,tf);
P =eye(1);
x=zeros(1,tf);
Xnew=zeros(1,tf);
x(1,1)=0.1; 
Xnew(1,1)=x(1,1);
z=zeros(1,tf);
z(1)=x(1,1)^2/20+v(1); 
zjian=zeros(1,tf);
zjian(1,1)=z(1);
for k = 2 : tf 
    %%%%%%%%%%%%%%%%%%模拟系统%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    x(:,k) = 0.5 * x(:,k-1) + (2.5 * x(:,k-1) / (1 + x(:,k-1).^2)) + 8 * cos(1.2*(k-1)) + w(k-1);  
    z(k) = x(:,k).^2 / 20 + v(k); 
    %%%%%%%%%%%%%%%%%%EKF开始%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    Xpre = 0.5*Xnew(:,k-1)+ 2.5*Xnew(:,k-1)/(1+Xnew(:,k-1).^2) + 8 * cos(1.2*(k-1));
    zjian =Xpre.^2/20; 
    F = 0.5 + 2.5 * (1-Xnew.^2)/((1+Xnew.^2).^2);
    H = Xpre/10;
    PP=F*P*F'+Q;
    Kk=PP*H'*inv(H*PP*H'+R);
    Xnew(k)=Xpre+Kk*(z(k)-zjian);
    P=PP-Kk*H*PP;
end
   t = 2 : tf;
   figure;
   plot(t,x(1,t),'b',t,Xnew(1,t),'r*');
   legend('真实值','EKF估计值');

转载:

扩展卡尔曼滤波(EKF)算法详细推导及仿真(Matlab)_gangdanerya的博客-CSDN博客_扩展卡尔曼滤波matlab

扩展卡尔曼滤波EKF)是一种常用的非线性滤波方法,它可以用于估计非线性系统的状态。在MATLAB中,可以使用以下步骤来实现EKF: 1. 定义系统模型和观测模型。 2. 定义系统和观测噪声的协方差矩阵。 3. 初始化状态估计和协方差矩阵。 4. 依次处理每个观测值,并进行预测和更新步骤。 5. 在更新步骤中,计算卡尔曼增益并更新状态估计和协方差矩阵。 以下是一个简单的MATLAB示例,演示了如何使用EKF对非线性系统进行状态估计: ```matlab % 定义系统模型和观测模型 f = @(x) [x(1)+0.1*x(1)*x(2); x(2)-0.05*x(1)*x(2)]; % 系统模型 h = @(x) x(1)^2/20; % 观测模型 % 定义系统和观测噪声的协方差矩阵 Q = diag([0.01, 0.01]); R = 0.1; % 初始化状态估计和协方差矩阵 x0 = [1; 1]; P0 = diag([1, 1]); % 生成观测数据 t = 0:0.1:10; y = h(f([x0(1), x0(2)])) + sqrt(R)*randn(size(t)); x = zeros(length(t), 2); x(1,:) = x0'; % 执行EKF for i = 2:length(t) % 预测步骤 [xp, A] = jacobian(f, x(i-1,:)); Pp = A*P0*A' + Q; % 更新步骤 [yp, H] = jacobian(h, xp); K = Pp*H'/(H*Pp*H' + R); x(i,:) = xp' + K*(y(i) - yp); P0 = (eye(2) - K*H)*Pp; end % 绘图 figure; plot(t, x(:,1), 'r', t, sqrt(x(:,2)), 'b', t, -sqrt(x(:,2)), 'b'); xlabel('Time'); legend('Estimate', 'Std Dev', '-Std Dev'); ``` 在这个示例中,我们使用了EKF来估计非线性系统的状态,并使用随机噪声生成了观测数据。在EKF的预测步骤中,我们使用了系统模型来预测状态,并计算了状态协方差矩阵。在更新步骤中,我们使用观测模型计算卡尔曼增益,并使用观测数据来更新状态估计和协方差矩阵。最终,我们绘制了状态估计和标准偏差的图表,以展示EKF的效果。
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值