EKF举例

扩展卡尔曼滤波器的实验说明:

摘要,仅对非线性函数的卡尔曼滤波进行处理,效果图如下:

在使用的过程中,只需要将状态方程进行线性化处理即可,但是当滤波误差和一步预测误差较大的时候无法使用,也

即是过程噪声太大的时候,误差变大。

$$
X(k) = 0.5X(k-1)+\frac{2.5X(k-1)}{1+X^2(K-1)}+8cos(1.2k)+W(k)\

Y(k) = \frac{X^2(k)}{20}+V(k)
$$

程序代码

clc;
clear;
T = 50;
Q= 0.1;
R =1;
w = sqrt(Q)*randn(1,T);
v= sqrt(R)*randn(1,T);

x = zeros(1,T);
x(1) = 0.1;
y= zeros(1,T);
y(1) = x(1)^2/20+v(1);
for k = 2:T
    x(k)= 0.5*x(k-1)+2.5*x(k-1)/(1+x(k-1)^2)+8*cos(1.2*k)+w(k-1);
    y(k) = x(k)^2/20+v(k);
end

% 进行滤波算法的设计
X_ekf = zeros(1,T);
X_ekf(1)=x(1);
Y_ekf = zeros(1,T);
Y_ekf(1) = y(1);
P = zeros(1,T);
P(1) = 10;
for k =2:T
    Xn =  0.5*X_ekf(k-1)+2.5*X_ekf(k-1)/(1+X_ekf(k-1)^2)+8*cos(1.2*k);
    Zn = Xn^2/20;
    Phi = 0.5 +2.5*(1-Xn^2)/(1+Xn^2)^2;
    H = Xn/10;
    P_t = Phi*P(k-1)*Phi'+ Q;
    Kk = P_t*H'*inv(H*P_t*H'+R);
    X_ekf(k) = Xn+Kk*(y(k)-Zn);
    P(k) = (eye(1)-Kk*H)*P_t;    
end
X_std = zeros(1,T);
for k =1:T
    X_std(k) = abs(X_ekf(k)-x(k));
end

figure
hold on;
box on;
plot(x,'-ko','MarkerFaceColor','g');
plot(X_ekf,'-ks','MarkerFaceColor','b');
legend('真实值','kalman 滤波值');
xlabel('时间/s');
ylabel('状态值 x');

figure 
hold on;box on;
plot(X_std,'-ko','MarkerFaceColor','g');
xlabel('时间/s');
ylabel('状态估计偏差');

figure
hold on;box on;
plot(P);

程序输出结果:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ZUCA8f6G-1649235347130)(E:\Icodetest\forMatlab\Kalman\ekf_img\untitled2.png)]
在这里插入图片描述

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-yJkuKWmR-1649235347130)(E:\Icodetest\forMatlab\Kalman\ekf_img\untitled1.png)]
在这里插入图片描述

Px的协方差滤波
在这里插入图片描述

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eMgTHHoV-1649235347131)(E:\Icodetest\forMatlab\Kalman\ekf_img\untitled3.png)]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值