home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / octa21eb.zip / octave / SCRIPTS.ZIP / scripts / control / are.m < prev    next >
Text File  |  1999-03-05  |  3KB  |  90 lines

  1. # Copyright (C) 1993, 1994, 1995 John W. Eaton
  2. # This file is part of Octave.
  3. # Octave is free software; you can redistribute it and/or modify it
  4. # under the terms of the GNU General Public License as published by the
  5. # Free Software Foundation; either version 2, or (at your option) any
  6. # later version.
  7. # Octave is distributed in the hope that it will be useful, but WITHOUT
  8. # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  9. # FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  10. # for more details.
  11. # You should have received a copy of the GNU General Public License
  12. # along with Octave; see the file COPYING.  If not, write to the Free
  13. # Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
  14.  
  15. function x = are (a, b, c, opt)
  16.  
  17. # Usage: x = are (a, b, c {,opt})
  18. #
  19. # Solves algebraic riccati equation
  20. #
  21. #   a' x + x a - x b x + c = 0
  22. #
  23. # for identically dimensioned square matrices a, b, c.  If b (c) is not
  24. # square, then the function attempts to use b * b' (c' * c) instead.
  25. #
  26. # Solution method: apply Laub's Schur method (IEEE Trans. Auto. Contr,
  27. # 1979) to the appropriate Hamiltonian matrix.
  28. #
  29. # opt is an option passed to the eigenvalue balancing routine default is "B".
  30. #
  31. # See also: balance
  32.  
  33. # Written by A. S. Hodel (scotte@eng.auburn.edu) August 1993.
  34.  
  35.   if (nargin == 3 || nargin == 4)
  36.     if (nargin == 4)
  37.       if (! (strcmp (opt, "N") || strcmp (opt, "P") ...
  38.          || strcmp (opt, "S") || strcmp (opt, "B") ...
  39.          || strcmp (opt, "n") || strcmp (opt, "p") ...
  40.          || strcmp (opt, "s") || strcmp (opt, "b")))
  41.     warning ("are: opt has an invalid value; setting to B");
  42.     opt = "B";
  43.       endif
  44.     else
  45.       opt = "B";
  46.     endif
  47.     if ((n = is_square(a)) == 0)
  48.       error ("are: a is not square");
  49.     endif
  50.  
  51.     if (is_controllable(a,b) == 0)
  52.       warning ("are: a, b are not controllable");
  53.     endif
  54.     if ((m = is_square (b)) == 0)
  55.       b = b * b';
  56.       m = rows (b);
  57.     endif
  58.     if (is_observable (a, c) == 0)
  59.       warning ("are: a,c are not observable");
  60.     endif
  61.     if ((p = is_square (c)) == 0)
  62.       c = c' * c;
  63.       p = rows (c);
  64.     endif
  65.     if (n != m || n != p)
  66.       error ("are: a, b, c not conformably dimensioned.");
  67.     endif
  68.  
  69. # Should check for controllability/observability here
  70. # use Boley-Golub (Syst. Contr. Letters, 1984) method, not the
  71. #
  72. #                     n-1
  73. # rank ([ B A*B ... A^   *B]) method 
  74.  
  75.     [d, h] = balance ([a, -b; -c, -a'], opt);
  76.     [u, s] = schur (h, "A");
  77.     u = d * u;
  78.     n1 = n + 1;
  79.     n2 = 2 * n;
  80.     x = u (n1:n2, 1:n) / u (1:n, 1:n);
  81.   else
  82.     usage ("x = are (a, b, c)")
  83.   endif
  84.  
  85. endfunction
  86.