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

  1. # Copyright (C) 1996 A. Scottedward Hodel 
  2. #
  3. # This file is part of Octave. 
  4. #
  5. # Octave is free software; you can redistribute it and/or modify it 
  6. # under the terms of the GNU General Public License as published by the 
  7. # Free Software Foundation; either version 2, or (at your option) any 
  8. # later version. 
  9. # Octave is distributed in the hope that it will be useful, but WITHOUT 
  10. # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 
  11. # FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License 
  12. # for more details.
  13. # You should have received a copy of the GNU General Public License 
  14. # along with Octave; see the file COPYING.  If not, write to the Free 
  15. # Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 
  16.  
  17. function [K,Q,P,Ee,Er] = dlqg(A,B,C,G,Sigw, Sigv,Q,R)
  18. #
  19. #
  20. #  O B S O L E T E * * * D O   N O T   U S E!
  21. #
  22. #  Use lqg instead.
  23. #
  24. # function [K,Q,P,Ee,Er] = dlqg(A,B,C,G,Sigw,Sigv,Q,R)
  25. # function [K,Q,P,Ee,Er] = dlqg(Sys,Sigw,Sigv,Q,R)
  26. # design a discrete-time linear quadratic gaussian optimal controller
  27. # for the system
  28. #
  29. #  x(k+1) = A x(k) + B u(k) + G w(k)       [w]=N(0,[Sigw 0    ])
  30. #    y(k) = C x(k) + v(k)                  [v]  (    0   Sigv ])
  31. #
  32. # Outputs:
  33. #    K: system data structure format LQG optimal controller
  34. #    P: Solution of control (state feedback) algebraic Riccati equation
  35. #    Q: Solution of estimation algebraic Riccati equation
  36. #    Ee: estimator poles
  37. #    Es: controller poles
  38. # inputs:
  39. #  A,B,C,G, or Sys: state space representation of system.  
  40. #  Sigw, Sigv: covariance matrices of independent Gaussian noise processes 
  41. #      (as above)
  42. #  Q, R: state, control weighting matrices for dlqr call respectively.  
  43. #
  44. # See also: lqg, dlqe, dlqr
  45.  
  46. # Written by A. S. Hodel August 1995
  47.  
  48. warning("dlqg: obsolete. use lqg instead (system data structure format)");
  49.  
  50. if (nargin == 5)
  51.   # system data structure format
  52.   
  53.   # check that it really is system data structure
  54.   if(! is_struct(A) )
  55.     error("dlqg: 5 arguments, first argument is not a system data structure structure")
  56.   endif
  57.  
  58.   sys = sysupdate(sys,"ss");    # make sure in proper form
  59.   [ncstates,ndstates,nin,nout] = sysdimensions(sys);
  60.   if(ndstates == -1)
  61.     error("this message should never appear: bad system dimensions");
  62.   endif
  63.  
  64.   if(ncstates)
  65.     error("dlqg: system has continuous-time states (try lqg?)")
  66.   elseif(ndstates < 1)
  67.     error("dlqg: system has no discrete time states")
  68.   elseif(nin <= columns(Sigw))
  69.     error(["dlqg: ",num2str(nin)," inputs provided, noise dimension is ", ...
  70.     num2str(columns(Sigw))])
  71.   elseif(nout != columns(Sigv))
  72.     error(["dlqg: number of outputs (",num2str(nout),") incompatible with ", ...
  73.     "dimension of Sigv (",num2str(columns(Sigv)),")"])
  74.   endif
  75.  
  76.   # put parameters into correct variables
  77.   R = Sigw;
  78.   Q = G;
  79.   Sigv = C;
  80.   Sigw = B;
  81.   [A,B,C,D] = sys2ss(Sys)
  82.   [n,m] = size(B)
  83.   m1 = columns(Sigw);
  84.   m2 = m1+1;
  85.   G = B(:,1:m1);
  86.   B = B(:,m2:m);
  87.  
  88. elseif (nargin == 8)
  89.   # state-space format
  90.   m = columns(B);
  91.   m1 = columns(G);
  92.   p = rows(C);
  93.   n = abcddim(A,B,C,zeros(p,m));
  94.   n1 = abcddim(A,G,C,zeros(p,m1));
  95.   if( (n == -1) || (n1 == -1))
  96.     error("dlqg: A,B,C,G incompatibly dimensioned");
  97.   elseif(p != columns(Sigv))
  98.     error("dlqg: C, Sigv incompatibly dimensioned");
  99.   elseif(m1 != columns(Sigw))
  100.     error("dlqg: G, Sigw incompatibly dimensioned");
  101.   endif
  102. else
  103.   error("dlqg: illegal number of arguments")
  104. endif
  105.  
  106. if (! (is_square(Sigw) && is_square(Sigv) ) )
  107.   error("dlqg: Sigw, Sigv must be square");
  108. endif
  109.  
  110. # now we can just do the design; call dlqr and dlqe, since all matrices
  111. # are not given in Cholesky factor form (as in h2syn case)
  112. [Ks, P, Er] = dlqr(A,B,Q,R);
  113. [Ke, Q, jnk, Ee] = dlqe(A,G,C,Sigw,Sigv);
  114. Ac = A - Ke*C - B*Ks;
  115. Bc = Ke;
  116. Cc = -Ks;
  117. Dc = zeros(rows(Cc),columns(Bc));
  118. K = ss2sys(Ac,Bc,Cc,Dc,1);
  119. disp("HODEL: need to add names to this guy!")
  120.  
  121. endfunction
  122.