QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3873|回复: 0
打印 上一主题 下一主题

[问题求助] 卡尔曼算法的matlab程序

[复制链接]
字体大小: 正常 放大

1341

主题

737

听众

2万

积分

数学中国总编辑

  • TA的每日心情

    2016-11-18 10:46
  • 签到天数: 206 天

    [LV.7]常住居民III

    超级版主

    社区QQ达人 邮箱绑定达人 元老勋章 发帖功臣 新人进步奖 原创写作奖 最具活力勋章 风雨历程奖

    群组2011年第一期数学建模

    群组第一期sas基础实训课堂

    群组第二届数模基础实训

    群组2012第二期MCM/ICM优秀

    群组MCM优秀论文解析专题

    1#
    发表于 2011-11-28 10:48 |显示全部楼层
    |招呼Ta 关注Ta |邮箱已经成功绑定
    matlab下面的kalman滤波程序
    " W" \6 N# b  }5 P9 Bclear  N=200; w(1)=0;   ; z4 F9 M0 J+ M$ P- W2 V
    w=randn(1,N) . f1 S% W0 c. S/ n- h
    x(1)=0;   
    : x9 R, S% C/ V! J2 I* Ra=1;   
    * {9 b3 R* R+ k7 T$ ]for k=2:N;   ! T) A4 ?  A; Z! U$ f8 Y- M
    x(k)=a*x(k-1)+w(k-1);   
    $ D/ w- C- \0 f0 Wend   % [- ^2 W' e  D# ^1 d: n8 Z  M6 F
    V=randn(1,N);   1 S# w0 m! M+ n# r  P9 w" @* Z7 R+ \
    q1=std(V);   
    " g$ Z+ C6 O1 M' gRvv=q1.^2;   ! o% K- G& w8 O* [3 e5 E
    q2=std(x);   
    - d7 @) X# n  K! _. eRxx=q2.^2;   
    " ^2 M* w( d2 B: d) w& wq3=std(w);   ) y3 i. K: J! {: c0 Z
    Rww=q3.^2;   3 i+ S% S! l' z
    c=0.2;   
    2 |( ~" l/ X  TY=c*x+V;   ; }: [0 ]9 d9 l* h( k+ G8 b" ]
    p(1)=0;   ) x; G4 ]9 i# ?3 G$ @4 F/ d
    s(1)=0;, \9 I7 |) k% U/ F
    for t=2:N;   
    + Y" g6 a; W& y- e- Qp1(t)=a.^2*p(t-1)+Rww;   
    " `5 d6 n  O5 C3 F3 A. x& db(t)=c*p1(t)/(c.^2*p1(t)+Rvv);     L  M9 r3 H+ t' b. u
    s(t)=a*s(t-1)+b(t)*(Y(t)-a*c*s(t-1));   $ p5 Y& U+ Y: L* n
    p(t)=p1(t)-c*b(t)*p1(t);   , |6 S( w+ G; E! M  _
    end   
    4 a" c, t  T* jt=1:N;   
    ; s1 Q- t6 o- B  ]( N7 ^* r4 C9 eplot(t,s,'r',t,Y,'g',t,x,'b');   
    ( b$ W; G5 }) S5 I! u  ~* ofunction [x, V, VV, loglik] = kalman_filter(y, A, C, Q, R, init_x, init_V, varargin)   4 B1 F0 d% B5 @# j1 F$ F
    % Kalman filter.   
      ]4 [" b. A1 |9 ]9 D& o5 j% [x, V, VV, loglik] = kalman_filter(y, A, C, Q, R, init_x, init_V, ...)   ' N/ u1 g4 s5 ~, |
    %   
    2 ~% ]3 m, h5 E& [6 e& Y% INPUTS:   
    ( D& k* E$ L" U  T% y(:,t) - the observation at time t   
    " ?, H) h, i( G4 |% A - the system matrix   ' ]6 u- J4 p6 g# p3 U
    % C - the observation matrix   
    : }3 j) g, t! z4 Z0 ?% Q - the system covariance   3 y6 |/ k8 n) f2 a4 q
    % R - the observation covariance   
    : t9 G: V7 Q5 ]% w0 Q% init_x - the initial state (column) vector   
    - V9 s% n# @5 o: t0 X- w% init_V - the initial state covariance   
      ^% S1 Y* Q' l7 c%   ) D  h+ s4 L. K. |
    % OPTIONAL INPUTS (string/value pairs [default in brackets])   % r: w* \. |7 I4 Z* R- |, m
    % 'model' - model(t)=m means use params from model m at time t [ones(1,T) ]   & z, t. }0 n2 |5 q6 O
    % In this case, all the above matrices take an additional final dimension,   1 g3 I; O3 Q5 }. {$ k9 q
    % i.e., A(:,:,m), C(:,:,m), Q(:,:,m), R(:,:,m).   ) E( p; s5 ^9 ?: R4 E/ v1 o
    % However, init_x and init_V are independent of model(1).   ( v, I' {& |* L
    % 'u' - u(:,t) the control signal at time t [ [] ]   4 @5 F, i( ^% f7 L1 y
    % 'B' - B(:,:,m) the input regression matrix for model m   , [* E& F) j9 _  R8 g
    %   , e5 Y4 j5 R" O# c
    % OUTPUTS (where X is the hidden state being estimated)   ! y% Z3 S. {& o% r3 |' o, _/ J
    % x(:,t) = E[X(:,t) | y(:,1:t)]   
    ' W( q- n. x7 }7 D# ]  _% V(:,:,t) = Cov[X(:,t) | y(:,1:t)]   5 A- W, g! M8 ?4 B6 o5 Y% G; t
    % VV(:,:,t) = Cov[X(:,t), X(:,t-1) | y(:,1:t)] t >= 2   * W: a- k* Z9 r/ B* T* y
    % loglik = sum{t=1}^T log P(y(:,t))   5 i. F  m$ g8 C; a1 \# G
    %   1 U  `4 z3 g' |5 i  T
    % If an input signal is specified, we also condition on it:   ; _- S6 s' k, S7 B
    % e.g., x(:,t) = E[X(:,t) | y(:,1:t), u(:, 1:t)]   & q  \! T* O5 _) i
    % If a model sequence is specified, we also condition on it:   6 p" A! g% `0 l6 q- R' [
    % e.g., x(:,t) = E[X(:,t) | y(:,1:t), u(:, 1:t), m(1:t)]   5 y7 P3 ]7 ?* w$ x  z! t; |) a: y
    [os T] = size(y);   $ d% @) O; H8 i$ ]
    ss = size(A,1); % size of state space   ; ^  N- P5 i* j+ Y: _4 U
    % set default params   1 X8 F, S! M9 k4 p, N5 r' l" {
    model = ones(1,T);   
    ! q' U) }0 Y. \3 i0 c/ ju = [];   
    ) O2 U' D* ?! L- q9 _, B: C: M5 xB = [];   " J, A7 ?" J6 [+ }1 e2 W  k% X
    ndx = [];   7 C0 ^3 i0 L9 ~% j/ P) h+ v
    args = varargin;   
    / r6 E1 b* C. H# s; T) B7 P  ynargs = length(args);   # `. j! H+ N$ n' }5 E, ]% l
    for i=1:2:nargs   , a$ V  j* I) S5 r; t
    switch args   # f' i1 `: h$ }6 K  ]5 q1 q6 _
    case 'model', model = args{i+1};   
    2 p# h* Y$ Z* N3 u+ s2 U, scase 'u', u = args{i+1};   
    & i$ o/ U# k( o% M" ]# Hcase 'B', B = args{i+1};   : L, r( @7 L% I8 ]4 ?" Q
    case 'ndx', ndx = args{i+1};   
    ( ^7 L" `# E# \* \( R$ Dotherwise, error(['unrecognized argument ' args])   1 u2 A% b& W: K" ]
    end   
    & D/ ]  W1 X5 `7 o( W4 G  send   
    ! V1 h1 \9 \# ~: \! I4 vx = zeros(ss, T);   & I( m' s4 s3 I! \9 D7 }2 Q
    V = zeros(ss, ss, T);   + n, W& v& O8 f6 B/ Y9 U/ G9 _
    VV = zeros(ss, ss, T);   9 {% w1 R2 @& e+ {1 U
    loglik = 0;   
    8 u. A4 V1 d3 s7 L7 Dfor t=1:T   m = model(t);   . k1 u: _3 x* |2 H- s5 O: Q
    if t==1   %prevx = init_x(:,m);   & [% D2 X/ w5 [/ r! C" E% w
    %prevV = init_V(:,:,m);   
    7 I# b4 s6 Q4 E) Y% Sprevx = init_x;   1 o# k$ D, V6 ~6 m  l: I' K- a: B% J; i
    prevV = init_V;   3 t* @$ {/ d0 g6 s4 B3 e( V0 w1 _
    initial = 1;   3 P5 j% F: F8 p8 X
    else   prevx = x(:,t-1);   / t+ }5 t2 b* l4 J5 `' ~' m1 X
    prevV = V(:,:,t-1);   / [/ C9 {0 [. P2 ]
    initial = 0;   
    6 O6 `! n+ b: J7 U6 j8 k; ~- A4 Tend   + y5 s5 m, Y3 d
    if isempty(u)   
    6 `) }$ S* u$ D& Z5 x9 V" |[x(:,t), V(:,:,t), LL, VV(:,:,t)] = ...   
    - l7 \9 }7 V2 L6 s# o1 O% Z8 `* Ukalman_update(A(:,:,m), C(:,:,m), Q(:,:,m), R(:,:,m), y(:,t), prevx, prevV, 'initial', initial);   else   1 U5 V$ F# a) ]- q, [+ l' p
      if isempty(ndx)   [x(:,t), V(:,:,t), LL, VV(:,:,t)] = ...   ( E( s4 @& s+ u6 |( u2 P
         kalman_update(A(:,:,m), C(:,:,m), Q(:,:,m), R(:,:,m), y(:,t), prevx, prevV, ...   'initial', initial,     'u', u(:,t), 'B', B(:,:,m));   
    * i) J8 o7 l* f1 W1 r' `; M! V& y  Xelse   
    ) ~9 l7 ~0 ^% E1 Z& l* d% si = ndx;   " j7 P/ z0 Q* h! a4 |( v
    % copy over all elements; only some will get updated   x(:,t) = prevx;   
    , f9 g5 D+ K; f1 f: LprevP = inv(prevV);   
    1 ?7 v8 d" H, f! y0 g/ VprevPsmall = prevP(i,i);   
      Z: U# r; i) \% z7 E) k* JprevVsmall = inv(prevPsmall);   
    * d0 M; E# ]6 ^1 ]9 O' c, ^* V3 n6 F. _[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));   
    ; O* g) S7 z! n, D. AsmallP = inv(smallV);   
    % N% k7 V) |  E5 e7 eprevP(i,i) = smallP;   
    $ d( S. O& @" @0 ^/ r5 X1 T, ZV(:,:,t) = inv(prevP);   
    6 W7 P1 j( U: D' k2 s3 send   8 Z3 t3 G" U2 x" h0 ]/ J
    end   
    : \3 G/ h9 o: O1 Sloglik = loglik + LL;   ( f  ]7 r% ^& m3 o6 b
    end
    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2024-5-31 05:32 , Processed in 0.557869 second(s), 49 queries .

    回顶部