⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dkalman.m

📁 similer program for matlab
💻 M
字号:
## Copyright (C) 2000, 2002, 2005, 2007 Gabriele Pannocchia#### This file is part of Octave.#### Octave 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 3 of the License, or (at## your option) any later version.#### Octave 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.#### You should have received a copy of the GNU General Public License## along with Octave; see the file COPYING.  If not, see## <http://www.gnu.org/licenses/>.## -*- texinfo -*-## @deftypefn {Function File} {[@var{Lp}, @var{Lf}, @var{P}, @var{Z}] =} dkalman (@var{A}, @var{G}, @var{C}, @var{Qw}, @var{Rv}, @var{S})## Construct the linear quadratic estimator (Kalman predictor) for the## discrete time system## @iftex## @tex## $$##  x_{k+1} = A x_k + B u_k + G w_k## $$## $$##  y_k = C x_k + D u_k + v_k## $$## @end tex## @end iftex## @ifinfo#### @example## x[k+1] = A x[k] + B u[k] + G w[k]##   y[k] = C x[k] + D u[k] + v[k]## @end example#### @end ifinfo## where @var{w}, @var{v} are zero-mean gaussian noise processes with## respective intensities @code{@var{Qw} = cov (@var{w}, @var{w})} and## @code{@var{Rv} = cov (@var{v}, @var{v})}.#### If specified, @var{S} is @code{cov (@var{w}, @var{v})}.  Otherwise## @code{cov (@var{w}, @var{v}) = 0}.#### The observer structure is## @iftex## @tex## $x_{k+1|k} = A x_{k|k-1} + B u_k + L_p (y_k - C x_{k|k-1} - D u_k)$## $x_{k|k} = x_{k|k} + L_f (y_k - C x_{k|k-1} - D u_k)$## @end tex## @end iftex## @ifinfo#### @example## x[k+1|k] = A x[k|k-1] + B u[k] + LP (y[k] - C x[k|k-1] - D u[k])## x[k|k] = x[k|k-1] + LF (y[k] - C x[k|k-1] - D u[k])## @end example## @end ifinfo#### @noindent## The following values are returned:#### @table @var## @item Lp## The predictor gain,## @iftex## @tex## $(A - L_p C)$.## @end tex## @end iftex## @ifinfo## (@var{A} - @var{Lp} @var{C})## @end ifinfo## is stable.#### @item Lf## The filter gain.## ## @item P## The Riccati solution. ## @iftex## @tex## $P = E \{(x - x_{n|n-1})(x - x_{n|n-1})'\}$## @end tex## @end iftex## ## @ifinfo## P = E [(x - x[n|n-1])(x - x[n|n-1])']## @end ifinfo## ## @item Z## The updated error covariance matrix.## @iftex## @tex## $Z = E \{(x - x_{n|n})(x - x_{n|n})'\}$## @end tex## @end iftex## ## @ifinfo## Z = E [(x - x[n|n])(x - x[n|n])']## @end ifinfo## @end table## @end deftypefn## Author: Gabriele Pannocchia <pannocchia@ing.unipi.it>## Created: July 2000function [Lp, Lf, P, Z] = dkalman (A, G, C, Qw, Rv, S)  if (nargin != 5 && nargin != 6)    error ("dkalman: invalid number of arguments");  endif  ## Check A.  if ((n = issquare (A)) == 0)    error ("dkalman: requires 1st parameter(A) to be square");  endif  ## Check C.  [p, n1] = size (C);  if (n1 != n)    error ("dkalman: A,C not conformal");  endif  ## Check G.  [n1, nw] = size (G);  if (n1 != n)    error ("dkalman: A,G not conformal");  endif  ## Check Qw.  if ((nw1 = issquare (Qw)) == 0)    error ("dkalman: requires 4rd parameter(Qw) to be square");  else    if (nw1 != nw)      error ("dkalman: G,Qw not conformal");    endif  endif  ## Check Rv.  if ((p1 = issquare (Rv)) == 0)    error ("dkalman: requires 5rd parameter(Rv) to be square");  else    if (p1 != p)      error ("dkalman: C,Rv not conformal");    endif  endif  ## Check S if it is there  if (nargin == 6)    [nw1, p1] = size (S);    if (nw1 != nw || p1 != p)      error ("dkalman: S not conformal with Qw and Rv");    else      Cov_aug = [Qw, S; S', Rv];	      if (! all (eig (Cov_aug) > 0))	error ("dkalman: augmented noise covariance matrix must be positive definite");      endif     endif  else    if (! all (eig (Qw) > 0) || ! all (eig (Rv) > 0))      error ("dkalman: covariance matrices Qw,Rv must be positive definite");    endif    S = zeros (nw, p);  endif  ## Incorporate the cross term into A and Qw  As = A - G*S/Rv*C;  Qs = Qw - S/Rv*S';  ## Call dare to solve the Riccati eqn.  a = As';  b = C';  c = G*Qs*G';  r = Rv;  p = dare (a, b, c, r);  ## Output  Lp = (A*p*C'+G*S)/(Rv+C*p*C');  Lf = (p*C')/(Rv+C*p*C');  P = p;  Z = p - Lf*C*p;endfunction

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -