kalman_filter.m
上传用户:zs_kehong
上传日期:2022-08-03
资源大小:1k
文件大小:3k
开发平台:

Visual C++

  1. function [x, V, VV, loglik] = kalman_filter(y, A, C, Q, R, init_x, init_V, varargin)
  2.   % Kalman filter.
  3.   % [x, V, VV, loglik] = kalman_filter(y, A, C, Q, R, init_x, init_V...)
  4.   %
  5.   % INPUTS:输入
  6.   % y(:,t) - the observation at time t    t时刻观察值
  7.   % A - the system matrix                 系统矩阵
  8.   % C - the observation matrix            观察矩阵
  9.   % Q - the system covariance              系统协方差
  10.   % R - the observation covariance         观察协方差
  11.   % init_x - the initial state (column) vector    初始状态向量
  12.   % init_V - the initial state covariance         初始状态协方差
  13.   %varargin                                       模式
  14.   % OPTIONAL INPUTS (string/value pairs [default in brackets])
  15.   % 'model' - model(t)=m means use params from model m at time t [ones(1,T) ]
  16.   % In this case, all the above matrices take an additional final dimension,
  17.   % i.e., A(:,:,m), C(:,:,m), Q(:,:,m), R(:,:,m).
  18.   % However, init_x and init_V are independent of model(1).
  19.   % 'u' - u(:,t) the control signal at time t [ [] ]
  20.   % 'B' - B(:,:,m) the input regression matrix for model m
  21.   %
  22.   % OUTPUTS (where X is the hidden state being estimated)输出
  23.   % x(:,t) = E[X(:,t) | y(:,1:t)]
  24.   % V(:,:,t) = Cov[X(:,t) | y(:,1:t)]
  25.   % VV(:,:,t) = Cov[X(:,t), X(:,t-1) | y(:,1:t)] t >= 2
  26.   % loglik = sum{t=1}^T log P(y(:,t))
  27.   %
  28.   % If an input signal is specified, we also condition on it:
  29.   % e.g., x(:,t) = E[X(:,t) | y(:,1:t), u(:, 1:t)]
  30.   % If a model sequence is specified, we also condition on it:
  31.   % .g., x(:,t) = E[X(:,t) | y(:,1:t), u(:, 1:t), m(1:t)]
  32. [os T] = size(y);
  33. ss = size(A,1); % size of state space
  34.   % set default params
  35. model = ones(1,T);
  36. u = [];
  37. B = [];
  38. ndx = [];
  39. args = varargin;
  40. nargs = length(args);
  41. for i=1:2:nargs
  42. switch args
  43. case 'model', model = args{i+1};
  44. case 'u', u = args{i+1};
  45. case 'B', B = args{i+1};
  46. case 'ndx', ndx = args{i+1};
  47. otherwise, error(['unrecognized argument ' args])
  48. end
  49. end
  50. x = zeros(ss, T);
  51. V = zeros(ss, ss, T);
  52. VV = zeros(ss, ss, T);
  53. loglik = 0;
  54. for t=1:T
  55. m = model(t);
  56. if t==1
  57.   %prevx = init_x(:,m);
  58.  %prevV = init_V(:,:,m);
  59. prevx = init_x;
  60. prevV = init_V;
  61. initial = 1;
  62. else
  63. prevx = x(:,t-1);
  64. prevV = V(:,:,t-1);
  65. initial = 0;
  66. end
  67. if isempty(u)
  68. [x(:,t), V(:,:,t), LL, VV(:,:,t)] =kalman_update(A(:,:,m), C(:,:,m), Q(:,:,m), R(:,:,m), y(:,t), prevx, prevV, 'initial', initial);
  69. else
  70. if isempty(ndx)
  71. [x(:,t), V(:,:,t), LL, VV(:,:,t)] =kalman_update(A(:,:,m), C(:,:,m), Q(:,:,m), R(:,:,m), y(:,t), prevx, prevV,'initial', initial, 'u', u(:,t), 'B', B(:,:,m));
  72. else
  73. i = ndx;
  74.   % copy over all elements; only some will get updated
  75. x(:,t) = prevx;
  76. prevP = inv(prevV);
  77. prevPsmall = prevP(i,i);
  78. prevVsmall = inv(prevPsmall);
  79. 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));
  80. smallP = inv(smallV);
  81. prevP(i,i) = smallP;
  82. V(:,:,t) = inv(prevP);
  83. end
  84. end
  85. loglik = loglik + LL;
  86. end