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 / lqr.m < prev    next >
Text File  |  1996-09-28  |  3KB  |  98 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 [k, p, e] = lqr (a, b, q, r, zz)
  16.  
  17. # Usage: [k, p, e] = lqr (A, B, Q, R {,Z})
  18. #
  19. # Linear quadratic regulator design for the continuous time system
  20. #
  21. #   dx/dt = A x + B u
  22. #
  23. # to minimize the cost functional
  24. #
  25. #  J = int_0^\infty{ x' Q x + u' R u }             Z omitted
  26. #
  27. # or
  28. #
  29. #  J = int_0^\infty{ x' Q x + u' R u +2 x' Z u}        Z included
  30. #
  31. # Returns:
  32. #
  33. #   k = state feedback gain, (A - B K) is stable
  34. #   p = solution of algebraic Riccati equation
  35. #   e = closed loop poles of (A - B K)
  36.  
  37. # Written by A. S. Hodel (scotte@eng.auburn.edu) August 1993.
  38.  
  39.   if (nargin != 4 && nargin != 5)
  40.     error ("lqr: invalid number of arguments");
  41.   endif
  42.  
  43. # Check a.
  44.   if ((n = is_square (a)) == 0)
  45.     error ("lqr: requires 1st parameter(a) to be square");
  46.   endif
  47.  
  48. # Check b.
  49.   [n1, m] = size (b);
  50.   if (n1 != n)
  51.     error ("lqr: a,b not conformal");
  52.   endif
  53.  
  54. # Check q.
  55.   
  56.   if ((n1 = is_square (q)) == 0 || n1 != n)
  57.     error ("lqr: q must be square and conformal with a");
  58.   endif
  59.  
  60. # Check r.
  61.   if((m1 = is_square(r)) == 0 || m1 != m)
  62.     error ("lqr: r must be square and conformal with column dimension of b");
  63.   endif
  64.  
  65. # Check if n is there.
  66.   if (nargin == 5)
  67.     [n1, m1] = size (zz);
  68.     if (n1 != n || m1 != m)
  69.       error ("lqr: z must be identically dimensioned with b");
  70.     endif
  71.  
  72. # Incorporate cross term into a and q.
  73.  
  74.     ao = a - (b/r)*zz';
  75.     qo = q - (zz/r)*zz';
  76.   else
  77.     zz = zeros (n, m);
  78.     ao = a;
  79.     qo = q;
  80.   endif
  81.  
  82. # Check that q, (r) are symmetric, positive (semi)definite
  83.  
  84.   if (is_symmetric (q) && is_symmetric (r) ...
  85.       && all (eig (q) >= 0) && all (eig (r) > 0))
  86.     p = are (ao, (b/r)*b', qo);
  87.     k = r\(b'*p + zz');
  88.     e = eig (a - b*k);
  89.   else
  90.     error ("lqr: q (r) must be symmetric positive (semi) definite");
  91.   endif
  92.  
  93. endfunction
  94.