- 积分
- 136119
- 注册时间
- 2014-12-27
- 最后登录
- 2024-3-28
- 在线时间
- 602 小时
- 威望
- 562
- 贡献
- 29
- 金币
- 52623
- 钢镚
- 1422
- 交易凭证
- 1
- 分享
- 0
- 精华
- 33
- 帖子
- 2094
- 主题
- 1742
TA的每日心情 | 擦汗 2018-4-10 15:18 |
---|
签到天数: 447 天 [LV.9]以坛为家II
超级版主
- 威望
- 562
- 贡献
- 29
- 金币
- 52623
- 钢镚
- 1422
|
头文件:
- /*
- * Copyright (c) 2008-2011 Zhang Ming (M. Zhang), zmjerry@163.com
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation, either version 2 or any later version.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details. A copy of the GNU General Public License is available at:
- * http://www.fsf.org/licensing/licenses
- */
- /*****************************************************************************
- * kalman.h
- *
- * Kalman Filter.
- *
- * The Kalman filter is an efficient recursive filter that estimates the
- * internal state of a linear dynamic system from a series of noisy
- * measurements. In most applications, the internal state is much larger
- * (more degrees of freedom) than the few "observable" parameters which are
- * measured. However, by combining a series of measurements, the Kalman
- * filter can estimate the entire internal state.
- *
- * A wide variety of Kalman filters have now been developed, from Kalman's
- * original formulation, now called the simple Kalman filter, the Kalman-Bucy
- * filter, Schmidt's extended filter, the information filter, and a variety
- * of square-root filters that were developed by Bierman, Thornton and so on.
- *
- * Zhang Ming, 2010-10, Xi'an Jiaotong University.
- *****************************************************************************/
- #ifndef KALMAN_H
- #define KALMAN_H
- #include <vector.h>
- #include <matrix.h>
- #include <inverse.h>
- namespace splab
- {
- template<typename Type>
- Vector<Type> kalman( const Matrix<Type>&, const Matrix<Type>&,
- const Matrix<Type>&, const Matrix<Type>&,
- const Vector<Type>&, const Vector<Type>&,
- const Vector<Type>& );
- #include <kalman-impl.h>
- }
- // namespace splab
- #endif
- // KALMAN_H
复制代码
实现文件:
- /*
- * Copyright (c) 2008-2011 Zhang Ming (M. Zhang), zmjerry@163.com
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the
- * Free Software Foundation, either version 2 or any later version.
- *
- * Redistribution and use in source and binary forms, with or without
- * modification, are permitted provided that the following conditions are met:
- *
- * 1. Redistributions of source code must retain the above copyright notice,
- * this list of conditions and the following disclaimer.
- *
- * 2. Redistributions in binary form must reproduce the above copyright
- * notice, this list of conditions and the following disclaimer in the
- * documentation and/or other materials provided with the distribution.
- *
- * This program is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details. A copy of the GNU General Public License is available at:
- * http://www.fsf.org/licensing/licenses
- */
- /*****************************************************************************
- * kalman-impl.h
- *
- * Implementation for Kalman Filter.
- *
- * Zhang Ming, 2010-10, Xi'an Jiaotong University.
- *****************************************************************************/
- /**
- * The simple Kalman filter for one step.
- * A ---> system matrix defining linear dynamic system
- * C ---> measurement matrix defining relationship between system's state
- * and measurements
- * Q ---> covariance matrix of process noise in system state dynamics
- * R ---> covariance matrix of measurements uncertainty
- * y ---> measurements at time t
- * xPrev ---> previous estimated state vector of the linear dynamic system
- * initDiagV ---> diagonal vector for initializing the covariance matrix of
- * state estimation uncertainty
- */
- template <typename Type>
- Vector<Type> kalman( const Matrix<Type> &A, const Matrix<Type> &C,
- const Matrix<Type> &Q, const Matrix<Type> &R,
- const Vector<Type> &xPrev, const Vector<Type> &y,
- const Vector<Type> &initDiagV )
- {
- int N = xPrev.size();
- // covariance matrix of state estimation uncertainty
- static Matrix<Type> V = diag(initDiagV);
- // previoused state vector
- Vector<Type> xPred = A * xPrev;
- // inovation
- Vector<Type> alpha = y - C * xPred;
- Matrix<Type> CTran = trT( C );
- Matrix<Type> VPred = A*V*trT(A) + Q;
- // Kalman gain matrix
- Matrix<Type> KGain = VPred*CTran * inv(C*VPred*CTran+R);
- V = ( eye(N,Type(1.0)) - KGain*C ) * VPred;
- // return the estimation of the state vector
- return xPred + KGain * alpha;
- }
复制代码 测试代码:
- /*****************************************************************************
- * kalman.h
- *
- * Kalman filter testing.
- *
- * Zhang Ming, 2010-10, Xi'an Jiaotong University.
- *****************************************************************************/
- #define BOUNDS_CHECK
- #include <iostream>
- #include <kalman.h>
- using namespace std;
- using namespace splab;
- typedef double Type;
- const int N = 2;
- const int M = 2;
- const int T = 20;
- int main()
- {
- Matrix<Type> A(N,N), C(M,N), Q(N,N), R(M,M);
- A = eye( N, Type(1.0) ); C = eye( N, Type(1.0) );
- Q = eye( N, Type(1.0) ); R = eye( N, Type(2.0) );
- Vector<Type> x(N,Type(1.0)), y(M), ytInit(M);
- ytInit[0] = Type(0.5); ytInit[1] = Type(2.0);
- Matrix<Type> yt(M,T);
- for( int t=0; t<T; ++t )
- yt.setColumn( ytInit, t );
- Vector<Type> intV( N, Type(10.0) );
- for( int t=0; t<T; ++t )
- {
- y = yt.getColumn(t);
- x = kalman( A, C, Q, R, x, y, intV );
- cout << "Estimation of xt at the " << t << "th iteratin: " << x << endl;
- }
- cout << "The theoretical xt should converge to: " << ytInit << endl;
- return 0;
- }
复制代码 运行结果:
- Estimation of xt at the 0th iteratin: size: 2 by 1
- 0.576923
- 1.84615
- Estimation of xt at the 1th iteratin: size: 2 by 1
- 0.532787
- 1.93443
- Estimation of xt at the 2th iteratin: size: 2 by 1
- 0.51581
- 1.96838
- Estimation of xt at the 3th iteratin: size: 2 by 1
- 0.507835
- 1.98433
- Estimation of xt at the 4th iteratin: size: 2 by 1
- 0.503909
- 1.99218
- Estimation of xt at the 5th iteratin: size: 2 by 1
- 0.501953
- 1.99609
- Estimation of xt at the 6th iteratin: size: 2 by 1
- 0.500977
- 1.99805
- Estimation of xt at the 7th iteratin: size: 2 by 1
- 0.500488
- 1.99902
- Estimation of xt at the 8th iteratin: size: 2 by 1
- 0.500244
- 1.99951
- Estimation of xt at the 9th iteratin: size: 2 by 1
- 0.500122
- 1.99976
- Estimation of xt at the 10th iteratin: size: 2 by 1
- 0.500061
- 1.99988
- Estimation of xt at the 11th iteratin: size: 2 by 1
- 0.500031
- 1.99994
- Estimation of xt at the 12th iteratin: size: 2 by 1
- 0.500015
- 1.99997
- Estimation of xt at the 13th iteratin: size: 2 by 1
- 0.500008
- 1.99998
- Estimation of xt at the 14th iteratin: size: 2 by 1
- 0.500004
- 1.99999
- Estimation of xt at the 15th iteratin: size: 2 by 1
- 0.500002
- 2
- Estimation of xt at the 16th iteratin: size: 2 by 1
- 0.500001
- 2
- Estimation of xt at the 17th iteratin: size: 2 by 1
- 0.5
- 2
- Estimation of xt at the 18th iteratin: size: 2 by 1
- 0.5
- 2
- Estimation of xt at the 19th iteratin: size: 2 by 1
- 0.5
- 2
- The theoretical xt should converge to: size: 2 by 1
- 0.5
- 2
- Process returned 0 (0x0) execution time : 0.125 s
- Press any key to continue.
复制代码
本文来自:http://my.oschina.net/zmjerry/blog/8517
|
|