home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / octa21eb.zip / octave / SCRIPTS.ZIP / scripts.fat / control / hinf_ctr.m < prev    next >
Text File  |  1999-04-29  |  4KB  |  136 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 = hinf_ctr(dgs,F,H,Z,g)
  18.   # K = hinf_ctr(dgs,F,H,Z,g)
  19.   #
  20.   # Called by hinfsyn to compute the H_inf optimal controller.
  21.   # 
  22.   # inputs:
  23.   #   dgs: data structure returned by is_dgkf
  24.   #           F, H:         feedback and filter gain (not partitioned)
  25.   #           g:            final gamma value
  26.   # outputs: 
  27.   #           controller K (system data structure)
  28.   #
  29.   # Do not attempt to use this at home; no argument checking performed.
  30.  
  31.   # A. S. Hodel August 1995
  32.   # Revised by Kai P Mueller April 1998 to solve the general H_infinity
  33.   # problem using unitary transformations Q (on w and z)
  34.   # and non-singular transformations R (on u and y).
  35.  
  36.   nw = dgs.nw;
  37.   nu = dgs.nu;
  38.   nz = dgs.nz;
  39.   ny = dgs.ny;
  40.   d22nz = dgs.Dyu_nz;
  41.   
  42.   B1  = dgs.Bw;
  43.   B2  = dgs.Bu;
  44.   C1  = dgs.Cz;
  45.   C2  = dgs.Cy;
  46.   C = [C1; C2];
  47.   D11 = dgs.Dzw;
  48.   D12 = dgs.Dzu;
  49.   D21 = dgs.Dyw;
  50.   D22 = dgs.Dyu;
  51.   A = dgs.A;
  52.   Ru = dgs.Ru;
  53.   Ry = dgs.Ry;
  54.  
  55.   nout = nz + ny;
  56.   nin = nw + nu;
  57.   nstates = size(A, 1);
  58.  
  59.   F11 = F(1:(nw-ny),:);
  60.   F12 = F((nw-ny+1):nw,:);
  61.   F2  = F((nw+1):nin,:);
  62.   H11 = H(:,1:(nz-nu));
  63.   H12 = H(:,(nz-nu+1):nz);
  64.   H2  = H(:,(nz+1):nout);
  65.  
  66.   # D11 partitions
  67.   D1111 = D11(1:(nz-nu),1:(nw-ny));
  68.   D1112 = D11(1:(nz-nu),(nw-ny+1):nw);
  69.   D1121 = D11((nz-nu+1):nz,1:(nw-ny));
  70.   D1122 = D11((nz-nu+1):nz,(nw-ny+1):nw);
  71.  
  72.   # D11ik may be the empty matrix, don't calculate with empty matrices
  73.   [nd1111,md1111] = size(D1111);
  74.   md1112 = length(D1112);
  75.   md1121 = length(D1121);
  76.  
  77.   if ((nd1111 == 0) || (md1112 == 0))
  78.     d11hat = -D1122;
  79.   else
  80.     xx = inv(g*g*eye(nz-nu) - D1111*D1111');
  81.     d11hat = -D1121*D1111'*xx*D1112 - D1122;
  82.   endif
  83.   if (md1112 == 0)
  84.     d21hat = eye(ny);
  85.   elseif (nd1111 == 0)
  86.     d21hat = chol(eye(ny) - D1112'*D1112/g/g);
  87.   else
  88.     xx = inv(g*g*eye(nz-nu) - D1111*D1111');
  89.     xx = eye(ny) - D1112'*xx*D1112;
  90.     d21hat = chol(xx);
  91.   endif
  92.   if (md1121 == 0)
  93.     d12hat = eye(nu);
  94.   elseif (md1111 == 0)
  95.     d12hat = chol(eye(nu) - D1121*D1121'/g/g)';
  96.   else
  97.     xx = inv(g*g*eye(nw-ny) - D1111'*D1111);
  98.     xx = eye(nu)-D1121*xx*D1121';
  99.     d12hat = chol(xx)';
  100.   endif
  101.  
  102.   b2hat = (B2+H12)*d12hat;
  103.   c2hat = -d21hat*(C2+F12)*Z;
  104.   b1hat = -H2 + (b2hat/d12hat)*d11hat;
  105.   c1hat =  F2*Z + (d11hat/d21hat)*c2hat;
  106.   ahat  =  A + H*C + (b2hat/d12hat)*c1hat;
  107.  
  108.   # rescale controller by Ru and Ry
  109.   b1hat = b1hat/Ry;
  110.   c1hat = Ru\c1hat;
  111.   bhat  = [b1hat, b2hat];
  112.   chat  = [c1hat; c2hat];
  113.   dhat  = [Ru\d11hat/Ry, Ru\d12hat; d21hat/Ry, 0*d11hat'];
  114.  
  115.   # non-zero D22 is a special case
  116.   if (d22nz)
  117.     if (rank(eye(nu) + d11hat*D22) < nu)
  118.       error(" *** cannot compute controller for D22 non-zero.");
  119.     endif
  120.  
  121.     d22new = [D22, zeros(ny,ny); zeros(nu,nu), 0*D22'];
  122.     xx = inv(eye(nu+ny) + d22new*dhat);
  123.     mhat = inv(eye(nu+ny) + dhat*d22new);
  124.     ahat = ahat - bhat*((eye(nu+ny)-xx)/dhat)*chat;
  125.     bhat = bhat*xx;
  126.     chat = mhat*chat;
  127.     dhat = dhat*xx;
  128.  
  129.   endif
  130.  
  131.   K = ss2sys(ahat,bhat(:,1:ny),chat(1:nu,:),dhat(1:nu,1:ny));
  132.  
  133. endfunction
  134.