数学建模社区-数学中国

标题: 卡尔曼算法的matlab程序 [打印本页]

作者: 工科男    时间: 2011-11-26 16:16
标题: 卡尔曼算法的matlab程序
求卡尔曼算法的matlab预测程序
作者: 厚积薄发    时间: 2011-11-28 10:48
matlab下面的kalman滤波程序
* L& @  H3 L2 v* \# |) rclear  N=200; w(1)=0;   
  [; q2 G+ o. B' _' K( p1 bw=randn(1,N)
3 T( P. ^4 b) k+ m9 O3 a1 sx(1)=0;   
4 g$ q+ t2 t/ ], O$ ia=1;   
8 r2 T: F3 v# M1 B1 ifor k=2:N;   
4 R0 ~: m* o* Q& O+ @x(k)=a*x(k-1)+w(k-1);   
& ~. s. @8 H1 Q6 H, @/ _" v  X  send   1 C( H6 V& Z3 v- S
V=randn(1,N);   
3 H' s  y- J; ?, A2 uq1=std(V);   4 c' g  Q$ o8 l  a4 c& X8 H: t7 _$ {( P
Rvv=q1.^2;   
( T$ ~; q- i6 R" F1 G& r; `: ^q2=std(x);   
. M2 U0 a2 J  ?5 ORxx=q2.^2;   # s$ o7 V. J2 h. Y) v
q3=std(w);   
" v: e0 _4 @  dRww=q3.^2;   
4 o0 h( c4 w- T6 sc=0.2;   
! W9 D$ [' C! I" ], s8 O2 K  PY=c*x+V;   
3 Z$ E2 O  W" h9 cp(1)=0;   
; e$ ^7 Z% b: G- \s(1)=0;  m& d5 `, l$ Q) w1 ?/ w1 g
for t=2:N;   9 [. e9 g7 a! m- b
p1(t)=a.^2*p(t-1)+Rww;   
+ y, i# m! q  ?& @. {b(t)=c*p1(t)/(c.^2*p1(t)+Rvv);   " Y# `+ D( l2 K$ d- ~
s(t)=a*s(t-1)+b(t)*(Y(t)-a*c*s(t-1));   , k) j+ A( R) D  O5 o" u$ h1 _( Q: @' |% f
p(t)=p1(t)-c*b(t)*p1(t);   " e" E3 e2 m7 h; e8 i
end   2 y! ^& y7 f6 ~" M" o' _
t=1:N;   ' N5 O; {/ s8 U9 }
plot(t,s,'r',t,Y,'g',t,x,'b');   - G* _) o: Y( d( r
function [x, V, VV, loglik] = kalman_filter(y, A, C, Q, R, init_x, init_V, varargin)   7 v3 f$ R# Y$ e  d; r0 P5 I
% Kalman filter.   
/ v! d2 w2 H0 a& D! R/ d2 K% M* u% [x, V, VV, loglik] = kalman_filter(y, A, C, Q, R, init_x, init_V, ...)   
0 C0 K$ Y: K9 O$ i1 G9 I% G%   
2 d& ?8 S2 T* d9 K; s% INPUTS:   
" C. m, x) E2 T$ C8 {) u  X3 H+ n% y(:,t) - the observation at time t   7 C! w$ r/ G# r0 }5 ]) m9 `* X. o
% A - the system matrix   
; y0 |% ]6 `  O8 C% C - the observation matrix   
" [( b4 H" G, W  D( c% Q - the system covariance   + o) ]3 `( e& u! N8 V
% R - the observation covariance   
3 A0 z( a' m3 ^* S% init_x - the initial state (column) vector   
: F! b! J4 P* x% init_V - the initial state covariance   
+ h: ~: `- k9 y& ]9 k& y$ @! A%   4 q! [+ z4 v6 e& s/ P! J% I
% OPTIONAL INPUTS (string/value pairs [default in brackets])   
# J) j$ {2 w* |* z7 a5 ~& x$ e% 'model' - model(t)=m means use params from model m at time t [ones(1,T) ]   
" A- v) Q& Z* a# X: q, L% In this case, all the above matrices take an additional final dimension,   ! K8 d) d3 b# U1 b5 J3 D
% i.e., A(:,:,m), C(:,:,m), Q(:,:,m), R(:,:,m).   
: _/ F, p: |0 |* j% However, init_x and init_V are independent of model(1).   
/ T) U$ L0 L. K9 K/ L. K% 'u' - u(:,t) the control signal at time t [ [] ]   
. S5 _1 N* G- @: F% 'B' - B(:,:,m) the input regression matrix for model m   
) B& k5 _5 q6 T; H%   7 Q; k. w' p5 B1 |5 ]; r9 ]9 [
% OUTPUTS (where X is the hidden state being estimated)   
+ H7 Y: N6 k# _: C6 Z2 y3 c% x(:,t) = E[X(:,t) | y(:,1:t)]   
4 I' N) K! S4 R4 W! D% V(:,:,t) = Cov[X(:,t) | y(:,1:t)]   
; U) T# |: ?- V" C8 J% VV(:,:,t) = Cov[X(:,t), X(:,t-1) | y(:,1:t)] t >= 2   
8 p* h. r0 X. Z  j2 o# a; C% loglik = sum{t=1}^T log P(y(:,t))   $ z8 ^& N. L6 O  N/ A% K! [" t4 R6 q
%   
+ N* G2 D7 \4 N+ e* }/ K# s' V8 f# P& k% If an input signal is specified, we also condition on it:   
8 w) x5 R3 ~- c2 t* f1 t& W/ ~# W( U9 ^% e.g., x(:,t) = E[X(:,t) | y(:,1:t), u(:, 1:t)]   
  V  D3 H, Z" V% If a model sequence is specified, we also condition on it:   
( R  f. ^3 y" b% e.g., x(:,t) = E[X(:,t) | y(:,1:t), u(:, 1:t), m(1:t)]   6 U- f; a* Z, \7 l% U5 J# n) a
[os T] = size(y);   
! P) P* I0 g4 t0 w/ Css = size(A,1); % size of state space   
8 a' d0 W" j3 M1 H' {% set default params   # k4 J, d% `" Z  f
model = ones(1,T);   
% V' [6 t: a! t! ~$ uu = [];   
+ [( C$ y* h; M: z+ B( iB = [];   
/ |* m% i1 `6 Q9 e# k# C2 l- |/ u: @ndx = [];   
3 k. y' f3 l# t+ Q4 T6 S1 Q" K. @args = varargin;   
  H4 `* B% m  m- Q1 E! E* l* S: }- Z- Jnargs = length(args);   9 x! W% Q8 L- B% \0 @: k
for i=1:2:nargs   + a4 ~. a+ }' k8 |# ?
switch args   5 o; G: o6 s+ q1 H: e* E+ ~& M. X3 e
case 'model', model = args{i+1};   : \8 z  d% j) o: H; h
case 'u', u = args{i+1};   
- ?4 }! X8 Z. L  vcase 'B', B = args{i+1};   
. A% u# ]" n$ e" I$ Icase 'ndx', ndx = args{i+1};   / Y$ S$ P% E' u1 D; |
otherwise, error(['unrecognized argument ' args])   
1 h5 u$ ]6 C. F0 a, R) iend   
8 B% {. f) M( i% A' f6 ]) iend   
4 V9 m" w! ]4 L- q: A( yx = zeros(ss, T);   
1 K+ K# ]; b- KV = zeros(ss, ss, T);   $ P, j" h. K$ w+ I$ Q" e: ]+ {
VV = zeros(ss, ss, T);   # M$ u: V  `/ _5 u( J- q
loglik = 0;   
/ Z* r0 k7 M' O+ y1 sfor t=1:T   m = model(t);   . O2 w* d$ k! B: P
if t==1   %prevx = init_x(:,m);   
6 S1 R" s. P' v* P9 Q%prevV = init_V(:,:,m);   
+ D  A; P7 n* v' M- f+ T5 U( L" eprevx = init_x;   
7 v8 J" T) B1 Z  n- lprevV = init_V;   / n' g+ ?+ m5 z0 X( T( q( R! f
initial = 1;   
2 P7 s% }( J, Z/ e5 W- q: }else   prevx = x(:,t-1);   
) O! X: U' ?, `prevV = V(:,:,t-1);   
0 I, s. r8 o* [# ]5 g3 R3 U% winitial = 0;   8 y2 j$ o/ v2 c
end   
! E0 I) p# U# Y& Zif isempty(u)   ' e% y7 O  W8 m, C; H6 u
[x(:,t), V(:,:,t), LL, VV(:,:,t)] = ...   
% i. J4 Q1 _& e  Xkalman_update(A(:,:,m), C(:,:,m), Q(:,:,m), R(:,:,m), y(:,t), prevx, prevV, 'initial', initial);   else   
5 p% [. k5 ]$ A% L0 @; R. |  if isempty(ndx)   [x(:,t), V(:,:,t), LL, VV(:,:,t)] = ...   
/ y" d( T3 d$ D$ ~     kalman_update(A(:,:,m), C(:,:,m), Q(:,:,m), R(:,:,m), y(:,t), prevx, prevV, ...   'initial', initial,     'u', u(:,t), 'B', B(:,:,m));   
$ q5 K. c# a7 y( o2 E% Telse   9 U2 r3 H8 {- p4 n- f
i = ndx;   3 d' _0 E; t! U1 n% {* ~2 B' ^5 Y
% copy over all elements; only some will get updated   x(:,t) = prevx;   8 E. F  i4 m" R1 A* O7 |4 S$ T
prevP = inv(prevV);   : ]. j9 n0 k5 G, O  t2 d
prevPsmall = prevP(i,i);   " u7 z" S0 a3 \+ a" B
prevVsmall = inv(prevPsmall);   8 Q6 m6 ^+ c+ E0 H* O) P9 O
[x(i,t), smallV, LL, VV(i,i,t)] = ...   kalman_update(A(i,i,m), C(:,i,m), Q(i,i,m), R(:,:,m), y(:,t), prevx(i), prevVsmall, ...   'initial', initial, 'u', u(:,t), 'B', B(i,:,m));   
7 M8 Z5 N5 W3 G: w+ v  asmallP = inv(smallV);   ( d; ?0 F' a+ n5 d4 N- A/ g
prevP(i,i) = smallP;   
7 N& u6 J3 Z* i) tV(:,:,t) = inv(prevP);   : F- H! O$ j$ _
end   1 j( b* ?6 }* t6 s3 _
end   
2 ~7 r& |2 S$ ~5 ?loglik = loglik + LL;   
/ Y- t0 U! t$ S- N) O" l4 |end
作者: 剑游九天    时间: 2011-12-19 23:38
厚积薄发 发表于 2011-11-28 10:48
5 H# p+ [* F$ ]3 e1 V1 ^- Hmatlab下面的kalman滤波程序
- Z! E& A- o) s" Y& Nclear  N=200; w(1)=0;   
6 d. V$ `+ @# i; z+ iw=randn(1,N)
$ |# o# {8 S0 f4 a3 V( x+ h. \
强大呀,下了
作者: 工科男    时间: 2012-2-5 10:24
太强大了
作者: 244190977    时间: 2013-10-7 19:59
太令人。。。。
作者: yulun9988    时间: 2014-1-13 21:45
谢谢。。。。。。。。。。。。。。。。。。。。。。。。。。
作者: yulun9988    时间: 2014-1-13 21:45





欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5