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

  1. ## Copyright (C) 1996 Auburn University.  All Rights Reserved
  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. ## 
  10. ## Octave is distributed in the hope that it will be useful, but WITHOUT 
  11. ## ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 
  12. ## FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License 
  13. ## for more details.
  14. ## 
  15. ## You should have received a copy of the GNU General Public License 
  16. ## along with Octave; see the file COPYING.  If not, write to the Free 
  17. ## Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. 
  18.  
  19. ##  O B S O L E T E * * * D O   N O T   U S E!
  20. ##
  21. ##  Use lqg instead.
  22. ##
  23. ## function [K,Q,P,Ee,Er] = dlqg(A,B,C,G,Sigw,Sigv,Q,R)
  24. ## function [K,Q,P,Ee,Er] = dlqg(Sys,Sigw,Sigv,Q,R)
  25. ## 
  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. function [K, Q, P, Ee, Er] = dlqg (A, B, C, G, Sigw, Sigv, Q, R)
  47.  
  48.   ## Written by A. S. Hodel August 1995
  49.  
  50.   warning("dlqg: obsolete. use lqg instead (system data structure format)");
  51.  
  52.   if (nargin == 5)
  53.     ## system data structure format
  54.  
  55.     ## check that it really is system data structure
  56.     if(! is_struct(A) )
  57.       error("dlqg: 5 arguments, first argument is not a system data structure structure")
  58.     endif
  59.  
  60.     sys = sysupdat(sys,"ss");    # make sure in proper form
  61.     [ncstates,ndstates,nin,nout] = sysdimen(sys);
  62.     if(ndstates == -1)
  63.       error("this message should never appear: bad system dimensions");
  64.     endif
  65.  
  66.     if(ncstates)
  67.       error("dlqg: system has continuous-time states (try lqg?)")
  68.     elseif(ndstates < 1)
  69.       error("dlqg: system has no discrete time states")
  70.     elseif(nin <= columns(Sigw))
  71.       error(["dlqg: ",num2str(nin)," inputs provided, noise dimension is ", ...
  72.       num2str(columns(Sigw))])
  73.     elseif(nout != columns(Sigv))
  74.       error(["dlqg: number of outputs (",num2str(nout),") incompatible with ", ...
  75.       "dimension of Sigv (",num2str(columns(Sigv)),")"])
  76.     endif
  77.  
  78.     ## put parameters into correct variables
  79.     R = Sigw;
  80.     Q = G;
  81.     Sigv = C;
  82.     Sigw = B;
  83.     [A,B,C,D] = sys2ss(Sys)
  84.     [n,m] = size(B)
  85.     m1 = columns(Sigw);
  86.     m2 = m1+1;
  87.     G = B(:,1:m1);
  88.     B = B(:,m2:m);
  89.  
  90.   elseif (nargin == 8)
  91.     ## state-space format
  92.     m = columns(B);
  93.     m1 = columns(G);
  94.     p = rows(C);
  95.     n = abcddim(A,B,C,zeros(p,m));
  96.     n1 = abcddim(A,G,C,zeros(p,m1));
  97.     if( (n == -1) || (n1 == -1))
  98.       error("dlqg: A,B,C,G incompatibly dimensioned");
  99.     elseif(p != columns(Sigv))
  100.       error("dlqg: C, Sigv incompatibly dimensioned");
  101.     elseif(m1 != columns(Sigw))
  102.       error("dlqg: G, Sigw incompatibly dimensioned");
  103.     endif
  104.   else
  105.     error("dlqg: illegal number of arguments")
  106.   endif
  107.  
  108.   if (! (is_sqr(Sigw) && is_sqr(Sigv) ) )
  109.     error("dlqg: Sigw, Sigv must be square");
  110.   endif
  111.  
  112.   ## now we can just do the design; call dlqr and dlqe, since all matrices
  113.   ## are not given in Cholesky factor form (as in h2syn case)
  114.   [Ks, P, Er] = dlqr(A,B,Q,R);
  115.   [Ke, Q, jnk, Ee] = dlqe(A,G,C,Sigw,Sigv);
  116.   Ac = A - Ke*C - B*Ks;
  117.   Bc = Ke;
  118.   Cc = -Ks;
  119.   Dc = zeros(rows(Cc),columns(Bc));
  120.   K = ss2sys(Ac,Bc,Cc,Dc,1);
  121.   disp("HODEL: need to add names to this guy!")
  122.  
  123. endfunction
  124.