sinc222.m
上传用户:shigeng
上传日期:2017-01-30
资源大小:122k
文件大小:3k
开发平台:

Matlab

  1. function main()
  2. %产生观测数据
  3. total=3*60;%总的时间长度
  4. global T;%采样周期
  5. T=1;
  6. N=total/T;%数据长度
  7. a=50;
  8. var_rx=100;
  9. var_ry=100;
  10. X=[];%观测数据
  11. X_ideal=[];%理想数据
  12. for i=1:N
  13.     [rx,ry]=track(i*T,20);
  14.     X_ideal=[X_ideal,[rx;ry]];
  15.     rx=rx+var_rx*randn(1,1);
  16.     ry=ry+var_ry*randn(1,1);
  17.     X=[X,[rx;ry]];
  18. end
  19. X_filter=zeros(size(X));%滤波后数据
  20. X_mean=X_filter;%蒙特卡洛平均数据
  21. Error_var=zeros(size(X));
  22. M=10;%蒙特卡洛仿真次数
  23. for iCount=1:M
  24.     X_filter=Trace(X);
  25.     X_mean=X_mean+X_filter;
  26.     Error_var=Error_var+(X_ideal-X_filter).^2;
  27.     
  28. end
  29. X_mean=X_mean/M;
  30. Error_var=Error_var/M;
  31. Error_mean=X_ideal-X_mean;%误差均值
  32. Error_var=sqrt(Error_mean.^2);
  33. for iCount=1:99
  34.     Error_var=Error_var+sqrt((X_ideal-X_filter).^2-Error_mean.^2);
  35. end
  36. set(gca,'FontSize',12); set(gcf,'Color','White');
  37. plot(X(1,:),X(2,:),X_mean(1,:),X_mean(2,:));
  38. xlabel('X(米)'),ylabel('Y(米)');
  39. axis equal;
  40. legend('真实轨迹','滤波轨迹');
  41. figure;
  42. k=1:N;
  43. set(gca,'FontSize',12); set(gcf,'Color','White');
  44. subplot(2,1,1),plot(k,Error_var(1,:)/100);title('x方向误差平均标准值');xlabel('采样次数'),ylabel('RMSE(米)');
  45. subplot(2,1,2),plot(k,Error_var(2,:)/100);title('y方向误差平均标准值');xlabel('采样次数'),ylabel('RMSE(米)');
  46.     
  47. %理想航迹方程
  48. function [x,y]=track(t,a)
  49. %   t:时间
  50. %   x:横轴位移
  51. %   y:纵轴位移
  52. %   a:转弯处加速度 
  53. %   r:初始位置
  54. %   v:初始速度
  55. r=[0,0]';
  56. v=300+randn(1,1);
  57. w=a/v;%角速度
  58. t1=pi/w;
  59. t2=t1+pi/w;
  60. D=v^2/a*2;%圆周运动直径
  61. if t<=0
  62.    x=0,y=0;
  63.   elseif t>0&&t<=t1
  64.     angel=t*w;
  65.     x=D/2-D/2*cos(angel);
  66.     y=D/2*sin(angel);
  67. elseif t>t1&&t<=t2
  68.     angel=(t-t1)*w;
  69.     x=(3-cos(angel))*D/2;
  70.     y=-D*sin(angel);
  71.     else
  72.     x=D+D+v*(t-t2);
  73.     y=0;
  74. end
  75.     
  76. function R=Trace(X)
  77. %飞行器跟踪模拟
  78. %    X:观测数据
  79. %    R:输出坐标
  80. %观测时间间隔
  81. global T;
  82. %观测矩阵
  83. H=[1,0,0,0,0;...
  84.    0,1,0,0,0];
  85. %位移测量误差
  86. var_rx=100;
  87. var_ry=100;
  88. var_rx2=var_rx^2;
  89. var_ry2=var_ry^2;
  90. %观测噪声协方差矩阵
  91. C=[var_rx2,0;...
  92.    0,var_ry2];
  93. %状态噪声协方差矩阵
  94. var_v=30;
  95. var_a=5;
  96. var_v2=var_v^2;
  97. var_a2=var_a^2;
  98. Q=zeros(5,5);
  99. Q(4,4)=var_v2;
  100. Q(5,5)=var_a2;
  101. %初始状态
  102. s0=[0,0,0,300,0]';
  103. %Kalman滤波跟踪
  104. N=size(X,2);%观测数据长度
  105. s=s0;
  106. a=@traverse;
  107. M=Q;
  108. Xplus=[];%修正后的航迹
  109. for icurrent=1:N
  110.     [s,M]=Karlman(s,M,X(:,icurrent),a,Q,C,H);
  111.     Xplus=[Xplus;(s(1:2))'];
  112. end
  113. R=Xplus';
  114. function s_estimate=traverse(s)
  115. %状态方程
  116. global T;
  117. s_estimate=zeros(5,1);
  118. s_estimate(1)=s(1)+s(4)*cos(s(3))*T;
  119. s_estimate(2)=s(2)-s(4)*sin(s(3))*T;
  120. s_estimate(3)=s(3)+(s(5)/s(4))*T;
  121. s_estimate(4)=s(4);
  122. s_estimate(5)=s(5);
  123. function [s,M]=Karlman(s_forward,M_forward,X,a,Q,C,H)
  124. %卡尔曼滤波
  125. %参数说明
  126. %       X--观测数据矢量
  127. %       A--状态矩阵
  128. %       Q--状态噪声协方差
  129. %       C--观测噪声协方差
  130. %       h--观测方程句柄
  131. %       s--输出数据矢量
  132. %       s_foward--前次输出矢量
  133. %       M--前次预测矩阵
  134. global T;
  135. %预测
  136. s=feval(a,s_forward);  
  137. %状态转换矩阵
  138. A=[1,2*s(4)*sin(s(3))*T+9000,2*s(4)*cos(s(3))*T*(-s(4)*sin(s(3))*T-4500),2*sin(s(3))*T*(-s(4)*sin(s(3))*T-4500),0;...
  139.    1/(2*sqrt(4500-s(4)*cos(s(3))*T)),1,-s(4)*sin(s(3))*T/(2*sqrt(4500-s(4)*cos(s(3))*T)),cos(s(3))*s(4)/(2*sqrt(4500-s(4)*cos(s(3))*T)),0;...
  140.    sin(s(3))/(s(4)*T),cos(s(3))/(s(4)*T),1,-s(5)*T/(s(4))^2,T/s(4);...
  141.    0,0,0,1,0;...
  142.    0,0,0,0,1];
  143. %最小预测MSE矩阵
  144. M=M_forward;
  145. M=A*M*A'+Q;   %协方差的进一步预测
  146. %卡尔曼增益矩阵
  147. K=M*H'*inv(C+H*M*H');
  148. %修正(状态更新方程)
  149. s=s+K*(X-H*s);
  150. %最小MSE矩阵(协方差更新方程)
  151. I=eye(5);
  152. M=[I-K*H]*M*[I+K*H]'-K*C*K';