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