1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51
|
// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
// Copyright (C) INRIA
//
// This file must be used under the terms of the CeCILL.
// This source file is licensed as described in the file COPYING, which
// you should have received as part of this distribution. The terms
// are also available at
// http://www.cecill.info/licences/Licence_CeCILL_V2-en.txt
function [p,s,t,l,rt,tt]=srfaur(h,f,g,r0,n,p,s,t,l)
//square-root algorithm for the algebraic Riccati equation.
//
// h,f,g : convenient matrices of the state-space model.
// r0 : E(yk*yk').
// n : number of iterations.
//
// p : estimate of the solution after n iterations.
// s,t,l : intermediate matrices for
// : successive iterations;
// rt,tt : gain matrices of the filter model after n iterations.
//
// : p,s,t,l may be given as input if more than one recursion
// : is desired (evaluation of intermediate values of p, e.g.).
//!
[lhs,rhs]=argn(0);
[d,m]=size(h);
if rhs==5,
//initializations
r0=.5*(r0+r0');
s=sqrtm(r0);
t=(g/s)';s=s';
l=-%i*t;
p=l'*l;
else,
if rhs<>9 then
error(msprintf(gettext("%s: Wrong number of input argument(s): %d expected.\n"),'srfaur',9));
end;
end;
//recursion
for j=1:n,
a=[s t;l*h' l*f'];
[q,r]=qr(a);
s=r(1:d,1:d);
t=r(1:d,d+1:d+m);
l=r(d+1:2*d,d+1:d+m);
p=p+l'*l;
end;
//gain matrices of the filter.
rt=r0-h*p*h';
tt=(g-f*p*h')*inv(rt);
endfunction
|