home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / octave-1.1.1p1-src.tgz / tar.out / fsf / octave / scripts / control / dare.m < prev    next >
Text File  |  1996-09-28  |  3KB  |  113 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 = dare (a, b, c, r, opt)
  16.  
  17. # Usage: x = dare (a, b, c, r {,opt})
  18. #
  19. # Solves discrete-time algebraic riccati equation
  20. #
  21. #   a' x a - x + a' x b (r + b' x b)^{-1} b' x a + c = 0
  22. #
  23. # for
  24. #
  25. #   a: nxn
  26. #   b: nxm
  27. #   c: nxn, symmetric positive semidefinite 
  28. #   r: mxm, invertible
  29. #
  30. # If c is not square, then the function attempts to use c'*c instead.
  31. #
  32. # Solution method: Laub's Schur method (IEEE Trans Auto Contr, 1979) applied
  33. # to the appropriate symplectic matrix.
  34. #
  35. # See also: Ran and Rodman, "Stable Hermitian Solutions of Discrete
  36. # Algebraic Riccati Equations," Mathematics of Control, Signals and
  37. # Systems, Vol 5, no 2 (1992)  pp 165-194.
  38. #
  39. # opt is an option passed to the eigenvalue balancing routine default
  40. # is "B". 
  41. #
  42. # See also: balance, are
  43.  
  44. # Written by A. S. Hodel (scotte@eng.auburn.edu) August 1993.
  45.  
  46.   if (nargin == 4 || nargin == 5)
  47.     if (nargin == 5)
  48.       if (opt != "N" || opt != "P" || opt != "S" || opt != "B")
  49.     warning ("dare: opt has an invalid value -- setting to B");
  50.     opt = "B";
  51.       endif
  52.     else
  53.       opt = "B";
  54.     endif
  55.  
  56. # Check a matrix dimensions
  57.     if ((n = is_square (a)) == 0)
  58.       error ("dare: a is not square");
  59.     endif
  60.  
  61. # Check a,b compatibility.
  62.  
  63.     [n1, m] = size (b);
  64.  
  65.     if (n1 != n)
  66.       warning ("dare: a,b are not conformable");
  67.     endif
  68.  
  69.     if (is_controllable (a, b) == 0)
  70.       warning ("dare: a,b are not controllable");
  71.     endif
  72.  
  73. # Check a,c compatibility.
  74.  
  75.     if (is_observable (a, c) == 0)
  76.       warning ("dare: a,c are not observable");
  77.     endif
  78.  
  79.     if ((p = is_square (c)) == 0)
  80.       c = c'*c;
  81.       p = rows (c);
  82.     endif
  83.  
  84.     if (n != p)
  85.       error ("dare: a,c are not conformable");
  86.     endif
  87.  
  88. # Check r dimensions.
  89.  
  90.     if ((m1 = is_square (r)) == 0)
  91.       warning ("dare: r is not square");
  92.     elseif (m1 != m)
  93.       warning ("b,r are not conformable");
  94.     endif
  95.  
  96.     brb = (b/r)*b';
  97.     atc = a'\c;
  98.     [d, sy] = balance ([a + brb*atc, -brb/(a'); -atc, inv (a')], opt);
  99.     [u, s] = schur(sy,'D');
  100.     u = d*u;
  101.     n1 = n+1;
  102.     n2 = 2*n;
  103.     x = u (n1:n2, 1:n)/u(1:n, 1:n);
  104.   else
  105.     usage ("x = dare (a, b, c, r {,opt})");
  106.   endif
  107.  
  108. endfunction
  109.