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 / lyap.m < prev    next >
Text File  |  1996-09-28  |  2KB  |  106 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 = lyap (a, b, c)
  16.  
  17. # Usage: x = lyap (a, b {,c})
  18. #
  19. # If (a, b, c) are specified, then lyap returns the solution of the
  20. # Sylvester equation
  21. #
  22. #   a x + x b + c = 0
  23. #
  24. # If only (a, b) are specified, then lyap returns the solution of the 
  25. # Lyapunov equation
  26. #
  27. #   a' x + x a + b = 0
  28. #
  29. # If b is not square, then lyap returns the solution of either
  30. #
  31. #   a' x + x a + b' b = 0     
  32. #
  33. # or
  34. #
  35. #   a x + x a' + b b' = 0
  36. #
  37. # whichever is appropriate.
  38. #
  39. # Solves by using the Bartels-Stewart algorithm (1972).
  40.  
  41. # Written by A. S. Hodel (scotte@eng.auburn.edu) August 1993.
  42.   
  43.  
  44.   if (nargin != 3 && nargin != 2)
  45.     usage ("lyap (a, b {,c})");
  46.   endif
  47.  
  48.   if ((n = is_square(a)) == 0)
  49.     error ("lyap: a is not square");
  50.   endif
  51.  
  52.   if (nargin == 2)
  53.  
  54. # Transform Lyapunov equation to Sylvester equation form.
  55.  
  56.     if ((m = is_square (b)) == 0)
  57.       if ((m = rows (b)) == n)
  58.  
  59. # solve a x + x a' + b b' = 0
  60.  
  61.     b = b * b';
  62.     a = a';
  63.       else 
  64.  
  65. # Try to solve a'x + x a + b' b = 0.
  66.  
  67.     m = columns (b);
  68.     b = b' * b;
  69.       endif
  70.  
  71.       if (m != n)
  72.     error ("lyap: a, b not conformably dimensioned");
  73.       endif
  74.     endif
  75.  
  76. # Set up Sylvester equation.
  77.  
  78.     c = b;
  79.     b = a;
  80.     a = b'
  81.  
  82.   else 
  83.  
  84. # Check dimensions.
  85.  
  86.     if ((m = is_square (b)) == 0)
  87.       error ("lyap: b must be square in a sylvester equation");
  88.     endif
  89.  
  90.     [n1, m1] = size(c);
  91.  
  92.     if (n != n1 || m != m1)
  93.       error("lyap: a,b,c not conformably dimensioned");
  94.     endif;
  95.   endif
  96.  
  97. # Call octave built-in function.
  98.  
  99.   x = syl (a, b, c);
  100.  
  101. endfunction
  102.