1、数学实验综合实验报告实验名称 综合实验(Kalman 滤波)2016 年 5 月2一、 【实验目的】明白滤波计算流程能够调用相关函数进行数据处理使用循环函数和二维曲线画图有效的构建仿真模型,产生模拟数据二、 【实验原理分析】卡尔曼滤波器是一个“optimal recursive data processing algorithm(最优化自回归数据处理算法) ”。对于解决很大部分的问题,它是最优,效率最高甚至是最有用的。它的广泛应用已经超过 30 年,包括机器人导航,控制,传感器数据融合甚至在军事方面的雷达系统以及导弹追踪等等。近来更被应用于计算机图像处理,例如头脸识别,图像分割,图像边缘检测等
2、等。设系统可用一个线性随机微分方程来描述:X(k)=A X(k-1)+B U(k)+W(k)再加上系统的测量值:Z(k)=H X(k)+V(k)上两式子中,X(k) 是 k 时刻的系统状态, U(k)是 k 时刻对系统的控制量。 A 和 B 是系统参数,对于多模型系统,他们为矩阵。Z(k)是 k 时刻的测量值,H 是测量系统的参数,对于多测量系统,H 为矩阵。W(k)和 V(k)分别表示过程和测量的噪声。他们被假设成高斯白噪声,他们的协方差分别是 Q,R (这里假设他们不随系统状态变化而变化) 。对于满足上面的条件(线性随机微分系统,过程和测量都是高斯白噪声) ,卡尔曼滤波器是最优的信息处理器
3、。首先要利用系统的过程模型,来预测下一状态的系统。假设现在的系统状态是 k,根据系统的模型,可以基于系统的上一状态而预测出现在状态:X(k|k-1)=A X(k-1|k-1)+B U(k) (1)式(1)中,X(k|k-1)是利用上一状态预测的结果,X(k-1|k-1)是上一状态最优的结果,U(k) 为现在状态的控制量,如果没有控制量,它可以为 0。到现在为止,我们的系统结果已经更新了,可是,对应于 X(k|k-1)的协方差还没更新。我们用 P 表示协方差:P(k|k-1)=A P(k-1|k-1) A+Q (2)式(2)中,P(k|k-1) 是 X(k|k-1)对应的协方差,P(k-1|k-
4、1) 是 X(k-1|k-1)对应的协方差,A表示 A 的转置矩阵,Q 是系统过程的协方差。式子 1,2 就是卡尔曼滤波器 5 个公式当中的前两个,也就是对系统的预测。3现在我们有了现在状态的预测结果,然后我们再收集现在状态的测量值。结合预测值和测量值,我们可以得到现在状态(k)的最优化估算值 X(k|k):X(k|k)= X(k|k-1)+Kg(k) (Z(k)-H X(k|k-1) (3)其中 Kg 为卡尔曼增益(Kalman Gain) :Kg(k)= P(k|k-1) H / (H P(k|k-1) H + R) (4)到现在为止,我们已经得到了 k 状态下最优的估算值 X(k|k)。
5、但是为了要令卡尔曼滤波器不断的运行下去直到系统过程结束,我们还要更新 k 状态下 X(k|k)的协方差:P(k|k)=( I-Kg(k) H)P(k|k-1) (5)其中 I 为 1 的矩阵,对于单模型单测量, I=1。当系统进入 k+1 状态时,P(k|k)就是式子(2)的 P(k-1|k-1)。这样,算法就可以自回归的运算下去。 、MATLAB 中已经给出了滤波函数,以下为直接调用方法:设线性系统为 =+=+其调用格式为 kest, L, P=kalman (sys, Qn, Rn, Nn) kest, L, P=kalman(sys, Qn, Rn, Nn, sensors, known
6、)kest,L,P,M,Z=kalman(sys,Qn,Rn,Nn)最后一种调用格式只限于离散系统。三、 【实验内容及数据来源】已知离散系统+1= 0.49 0.298 0.4120.4010.391 0.3910.992 0.401 0.296+=(2)+第一式为系统方程,第二式为观测方程, 表示状态量 x 的第二个分量。e 与 v 是互不相关的高斯白(2)噪声。假设 的真值 ,由此系统方程构造出 k=1,2,30 的数据 ,构造时加上系统噪声干扰,再11=10.98.4814.3 由观测方程构造出观测数据并加观测噪声干扰,并以此作为仿真数据。用 Kalman 滤波对仿真数据进行滤波处理,并
7、与真实结果比较。4四、 【实验程序】%系统描述% xn+1=Axn+Bun+Gwn% yn=Cxn+Dun+Hwn+vn% 状态转移矩阵A=0.49 0.298 0.4120.401 -0.391 0.391-0.992 0.401 0.296;% B 矩阵B=zeros(3,3);% G 矩阵G=eye(3,3);% C 矩阵 向量C=0 1 0;D=0 0 0;H=zeros(1,3);% 状态向量初值(真值)x(:,1)=10.9 8.481 -4.3;% 状态向量初始估计值guji=20.1 21.3 20.7;% 进入循环for i=2:30%c 产生 正态分布数据w=randn(3
8、,1);v=randn(1,1);5%真实数据x(:,i)=A*x(:,i-1);%人为制造系统误差x1(:,i)=x(:,i)+w;Qn=eye(2,2);Rn=1;Nn=0;%人为制造观测数据的误差z0(:,i)=C*x1(:,i)+v;%建立 Kalman 的系统参数sys=ss(A,B,G,C,D,H,-1);kest,L,P,M,Z=kalman(sys,Qn,Rn,Nn);%得到估计数据guji(:,i)=A*guji(:,i-1)+L*(z0(:,i)-C*A*guji(:,i-1);endsubplot(2,2,1)% 做出真值曲线 x1plot(x(1,:)hold on%
9、做出在噪声污染情况下的滤波估计值曲线 x1plot(guji(1,:),:m)hold offlegend(real of x1,estimate of x1)gridsubplot(2,2,2)% 做出真值曲线 x2plot(x(2,:)hold on% 做出在噪声污染情况下的滤波估计值曲线 x2plot(guji(2,:),:m)6hold offlegend(real of x2,estimate of x2)gridsubplot(2,2,3:4)% 做出真值曲线 x2plot(x(3,:)hold on% 做出在噪声污染情况下的滤波估计值曲线 x3plot(guji(3,:),:m)
10、hold offlegend(real of x1,estimate of x1)grid五、 【实验结果】为了阐述 kalman 滤波的基本计算思路,在试验中选择了最简单的一种系统模型,线性定常动力系统。在实际应用中很多时候面对的都是非线性而且时变系统,这有时候性质要复杂一些。最后的结果信息我们反映在图 9.2 中,这只是结果的直观反应,更多的时候需要的是计算结果。表9.1 中给出了真实的运动轨迹。7图 1.1 Kalman 滤波处理的与真实值的比较表 1.1 真实的运动状态数据时间序列 第一个分量 第二个分量 第三个分量1 10.9 8.481 -4.32 6.096738 -0.6264
11、71 -8.6847193 -0.777390966 -0.70598303 -8.8698557914 -4.245685102 -3.503808027 -2.1374046715 -4.005131216 -1.168256014 2.174020826 -1.41495685102 -0.299227376 4.1481296687 0.92653024 1.171518442 2.511494558 1.837848068 0.895469285 0.2940632849 1.288549473 0.501827329 -1.37701936810 0.213601806 -0.21
12、792072 -1.48460605111 -0.571933183 -0.40961964 -0.73872259212 -0.70666762 -0.35802446 0.18443835413 -0.376969821 -0.071270755 0.61204022414 0.046206675 0.116009694 0.52653839615 0.274145979 0.179045599 0.15653823116 0.252180869 0.101132157 -0.15382020917 0.090332082 0.001438153 -0.25514020918 -0.060
13、426476 -0.064098975 -0.16455422819 -0.11650681 -0.063509021 -0.014468676820 -0.08197512 -0.027544456 0.0858249121 -0.013016194 0.011455399 0.09567816522 0.036455178 0.027711608 0.04582641623 0.04500158 0.021701416 -0.01148656324 0.023785332 0.005069134 -0.03933932225 -0.003042386 -0.007825788 -0.033
14、20676626 -0.017504042 -0.011143959 -0.00994929727 -0.015996991 -0.006552008 0.0099502928 -0.005691504 3.76E-05 0.01618694529 0.003891391 0.004032099 0.01045238830 0.007414731 0.004070781 0.000850519表 1.2 给出了三个分量的滤波处理结果。如果对比表 1.1 与表 1.2,可以看出在序列靠后的地方真实状态与估计状态的绝对误差是比较小的。表 1.2 Kalman 滤波处理结果时间序列 第一个分量 第二
15、个分量 第三个分量1 20.1 21.3 20.72 22.7252488 9.494219162 -6.3161692163 10.40651623 3.728682279 -21.105630164 -1.788182459 -6.118879723 -14.710902865 -8.614322881 -4.198556849 -4.9577776266 -6.763631785 -4.378077639 5.7870306767 -2.357407994 1.364838315 6.602659098 1.422692466 1.56099626 4.5530883269 2.3926
16、73342 2.2791037 0.22486428110 1.861692101 0.225133574 -1.43620503611 0.517263742 -0.01125328 -2.11384303912 -0.58022756 -0.648547414 -1.2212362613 -0.593150559 -0.707212838 0.16466488714 -0.553204215 0.202906809 0.29099303715 -0.391235191 0.063405251 0.55915043216 -0.618625591 0.6001259193 0.2254946
17、617 -0.618625591 -0.783860719 1.16515757918 -0.045343222 1.357835159 -0.66486884319 -0.11295527 -0.624252831 0.27688772520 -0.398859191 0.53368178 -0.19830150321 -0.179721431 -0.394725491 0.51876082622 -0.279207237 0.524824267 0.02336533823 0.448919666 -0.658297751 0.713788924 0.479427729 0.58168262
18、8 -0.41355809225 0.032585161 -0.025564549 -0.47208699926 0.014970698 -0.329369401 -0.07715656327 -0.852877938 0.7140655 -0.55159105428 0.072338102 -1.258081817 1.233014025929 -0.453268751 1.521953811 -0.53639147630 -0.003343612 -0.975064648 0.893963618六、 【实验心得】MATLAB 中有丰富的图形处理能力,提供了绘制各种图形、图像数据的函数。它可
19、以提供了一组绘制二维和三维曲线的函数,他们还可以对图形进行旋转、缩放等操作。MATLAB 内部还包含丰富的数学函数和数据类型,使用方便且功能非常强大。本学期通过对 MATLAB 的系统环境,数据的各种运算,矩阵的分析和处理,程序设计,绘图,数值计算及符号运算的学习,初步掌握了 MATLAB 的实用方法。通过老师的讲解与自己上机的操作,使我在短时间内学会使用 MATLAB,同时,通过上机实验,对理论知识的复习巩固实践,可以自己根据例题编写设计简单的程序来实现不同的功能,绘制出比较满意的二维三维图形,在实践中找到乐趣。MATLAB 是一个实用性很强,操作相对容易,比较完善的工具软件,使用起来比较方
20、便,通过操作可以很快看到结果,能够清晰的感觉到成功与失败,虽然课程中也会出现一些小问题,但是很喜欢这门课程。郑蕊MATLAB 作为一门编程语言,其简易程度超过了大多数的计算机高级语言,作为一名计算机专业的学生,我深深感受到了这门语言的简洁与方便,语法和自然语言更为贴近,简便易学,功能强大,能够用其进行绝大多少的数学计算与绘图。而且我们的数值计算就是用 MATLAB 作为我们的计算的工具,所以感觉这门课程多我的帮助很大,而且可以将其接入 java 等多种主流编程语言程序运行,兼容性很好。用它进行数值分析计算,大大的方便了我们的任务的进行。总之,通过这学期为数不多的学习,我掌握了 MATLAB 的
21、许多基础入门知识,我以后继续学习熟练使用它进行问题分析解决打下了良好的基础。俗话说,万事开头难,感谢这门课称帮助我踏入数学问题分析计算的新高度。周其飞刚开始看到“数学实验” 这门课时,我的内心是疑惑的,数学,还能有什么实验?在进入课堂之后才感受到这门课深重的意义。通过 matlab 实验使我学习掌握了许多知识。首先是对 matlab 与数学实验有了一个全新的认识,其次是对matlab 的更多操作和命令的使用有了更好的掌握,最重要的事对 matlab 的处理能力有了一个更高的飞跃尤10其是对相关函数的使用及相关问题的处理。matlab 功能强大而又简单容易上手,通过短短几周的学习我们便掌握了它的
22、基本操作及命令。利用 matlab进行矩阵和数组的运算使得原本复杂的矩阵运算化身为几行代码,而利用 matlab 的绘图功能更是将原本抽象的复杂函数图像显现出来并自主加以修饰,让人一目了然。matlab 在求导、积分方面也颇有功用。数学本身是一门科学,其目的不是在于计算,而在于深入的探索与发现。利用 matlab 软件处理数学问题,将我们从枯燥复杂的计算工作中解放出来,大大提高了我们实验研究的效率。matlab 带给我的影响远不止于此,在接下来的学习中的每一门课,matlab 将成为一个必备的工具。赵冠晨【参考文献】:(1) Optimal State Estimation ,作者:Dan Simon(2) 卡尔曼滤波与组合导航原理 ,作者:秦永元(3) 数值计算方法 ,主编:颜兵兵