简单非线性扩展Kalman滤波器设计

该Matlab程序展示了如何使用Kalman滤波器对一阶动态系统进行状态估计。程序首先生成带有噪声的真实数据,然后应用Kalman滤波算法进行估计,并计算估计误差。结果以图形方式展示真实值与滤波估计值的对比以及状态估计偏差。
摘要由CSDN通过智能技术生成

matlab程序

function EFK1
T=50;
Q=10;
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)^2/(1+x(k-1)^2)+8*cos(1.2*k)+w(k);
    y(k)=x(k)^2/20+v(k);
end
Xekf=zeros(1,T);
Xekf(1)=x(1);
Yekf=zeros(1,T);
Yekf(1)=y(1);
P0=eye(1);
for k=2:T
    Xn=0.5*Xekf(k-1)+2.5*Xekf(k-1)/(1+Xekf(k-1)^2)+8*cos(1.2*k);
    Zn=Xn^2/20;
    F=0.5+2.5*(1-Xn^2)/(1+Xn^2)^2;
    H=Xn/10;
    P=F*P0*F'+Q;
    K=P*H'*inv(H*P*H'+R);
    Xekf(k)=Xn+K*(y(k)-Zn);
    P0=(eye(1)-K*H)*P;
end

Xstd=zeros(1,T);
for k=1:T
    Xstd(k)=abs(Xekf(k)-x(k));
end

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


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

 

Q=10 

 Q=0.1

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值