计算机实习报告 MATLAB 对卡尔曼滤波的仿真实现 MATLAB 对卡尔曼滤波的仿真实现 实验目的 基于卡尔曼滤波原理,利用matlab针对以下模型编制代码进行仿真 225 (1x(k)=0.5x(k-1)+8cos[1.2(1)](1)1+x(k-1)( )( )( )20x kkw kx ky kv k) 1:仿真100 次,每次50 步。从 100 次仿真中任选一次,将其对应的状态真值和滤波结果曲线绘制在同一副图上,绘制时选用不同的线型,颜色并进行标注。 2:用均方根误差评价算法的精度,均方根误差定义为 ^1/2,,1( )(() /)Mk jk jjREMS kxxM M 为仿真次数,k 为离散时间点的索引值,,k jx 为第 j 次仿真时第 K拍的真值。请绘制出 RMSE(k)随 k 变化的曲线。 程序设计 程序代码如下: A=zeros(50,100);B=zeros(50,100);C=zeros(50,100); x=0; for i=1:1:100 for k=1:1:50 x=0.5*x+25*x/(1+x^2)+8*cos(1.2*(i-1))+randn; A(k,i)=x; end end xk=0;P=1; for i=1:1:100 for k=1:1:50 xkk=0.5*xk+25*x/(1+xk^2)+8*cos(1.2*(k-1)); F=1/2+25/(1+xk^2)-50*xk^2/(1+xk^2)^2; P=1+F*P*F; H=xk/10; S=H*P*H+10; K=P*H/S; xk=xkk+K*(xk^2/20+sqrt(10)*randn-xkk^2/20-sqrt(10)*randn); Pk=P-K*S*K; B(k,i)=xk;C(k,i)=Pk; end end D=A-B; Q=zeros(50,1); for k=1:1:50 E=D(k,:); sum=0; for j=1:1:100 su m=su m+E(j)^2; end RMSE=sqrt(su m/100); Q(k)=RMSE; end m=rou nd(rand*100); su bplot(1,2,1);plot(A(:,m),'rx -'); hold on plot(B(:,m),'b*:');legend('真值','滤波');title('第一次仿真'); su bplot(1,2,2); plot(Q);title('RMSE 随 k 变化曲线'); 输出结果截屏显示为: 程序运行中观测截屏 程序运行中经过卡尔曼递推后估计值截屏 程序运行中经过卡尔曼滤波后观测值与递推估计值比较截屏 实验总结 1 . 实验中遇到的问题 (1).最初编写代码时将整个过程分为三步,第一步,对模型进行仿真,第二步,编写代码进行卡尔曼递推,第三步,对卡尔曼滤波后观测值与递推估计值比较。前两步由于未将变量和矩阵统一,导致第三步是变量混乱,导致工作量变大,并且经常出错。 (2).由于 matlab 编程实践经验不足和对卡尔曼滤波原理不了解,在编程过程中遇到了很多问题,比如不清楚公式中变量的含义,不能掌握题目的要求,在第三步进行比较是不理解其含义等。 (3).实验结果有缺陷,但是没有科学有...