home *** CD-ROM | disk | FTP | other *** search
/ Liren Large Software Subsidy 10 / 10.iso / l / l455 / 2.ddi / MUTOOLS1.DI$ / SNCFBAL.M < prev    next >
Encoding:
Text File  |  1993-03-11  |  3.7 KB  |  119 lines

  1. % function [sysnlcf,sig,sysnrcf] = sncfbal(sys,tol)
  2. %
  3. %   Finds a (truncated)  balanced realization of the normalized 
  4. %   left and right coprime factors of the system state-space 
  5. %   model SYS. The state-space models in SYSNLCF and SYSNRCF
  6. %   are both balanced realizations with Hankel singular values 
  7. %   given by SIG.  
  8. %    SYSNLCF = [Nl Ml] and Nl Nl~ + Ml Ml~ = I, SYS = Ml^(-1) Nl.
  9. %    SYSNRCF = [Nr;Mr] and Nr~ Nr + Mr~ Mr = I, SYS = Nr Mr^(-1).
  10. %
  11. %   The results are truncated to retain all Hankel singular values 
  12. %   greater than TOL. If TOL is omitted then it is set to 
  13. %   MAX(SIG(1)*1.0E-12,1.0E-16). A warning message is printed out 
  14. %   if SYS is close to being undetectable, in which case the output 
  15. %   may be unreliable.
  16. %
  17. %   See also: HANKMR, SFRWTBAL, SFRWTBLD, SRELBAL, SYSBAL,
  18. %             SRESID, and TRUNC.
  19.  
  20. function [sysnlcf,sig,sysnrcf]  = sncfbal(sys,tol)
  21.  
  22.    if nargin<1
  23.      disp('usage: [sysnlcf,sig,sysnrcf] = sncfbal(sys,tol)')
  24.      return
  25.    end
  26.    [A,B,C,D]=unpck(sys);
  27.    [systype,p,m,n]=minfo(sys);
  28.    if systype~='syst'
  29.      disp('SYS must be SYSTEM')
  30.      return
  31.    end
  32.  
  33.  %  Solve the GFARE soln X=S'*S
  34.  
  35.    Ham = [A' zeros(n); -B*B' -A] - [C'; -B*D']*inv(eye(p)+D*D')*[D*B' C];
  36.    [U,Hamm]=schur(Ham);
  37.    if any(imag(sys)), [U,Hamm]=ocsf(U,Hamm,'s');
  38.      else [U,Hamm]=orsf(U,Hamm,'s'); end
  39.    [S,SS]=schur((U(1:n,1:n)'*U(n+1:2*n,1:n)+U(n+1:2*n,1:n)'*U(1:n,1:n))/2);
  40.     S=S*sqrt(abs(SS))*S';
  41.    [qdr,Dr]=qr([D;eye(m)]);Dr=inv(Dr(1:m,1:m));
  42.    [qdl,Dl]=qr([D';eye(p)]);Dl=inv(Dl(1:p,1:p)');
  43.  
  44. % change coordinates using U(1:n,1:n)
  45.  
  46.    nmuinv= norm(inv(U(1:n,1:n)));
  47.    if nmuinv>1e12, 
  48.      disp(['Warning from SNCFBAL: SYS is close to being undetectable',...
  49.            ' results maybe unreliable'])
  50.      return
  51.    end %if nmuinv>1e12,
  52.    B=U(1:n,1:n)'*B; %temp variable
  53.    Cl=Dl*(C/U(1:n,1:n)');
  54.    C=C*U(n+1:2*n,1:n); %temp variable
  55.    Al=Hamm(1:n,1:n)';
  56.    Bl=(B-C'*D)*Dr*Dr';        
  57.    Hl=-(C'+B*D') *Dl'*Dl;       
  58.  
  59. % realization of nlcf [N M] is now pck(Al,[Bl Hl],Cl,[Dl*D;Dl])
  60. % Calculate observability Gramian for nrcf [Nl Ml], R*R'
  61.  
  62.    nm11=n:-1:1;
  63.    R=sjh6(Al(nm11,nm11),Cl(:,nm11));
  64.    R=R(nm11,nm11)';
  65.  
  66. % calculate the Hankel-singular values of [Nl Ml]
  67.  
  68.    [W,T,V] = svd(S*R);
  69.    sig = diag(T);
  70.  
  71. % balancing coordinates
  72.  
  73.    T = W'*S;
  74.    Cl = Cl*T'; Al = Al*T'; 
  75.    T = R*V; 
  76.    Bl = T'*Bl; Al = T'*Al; Hl = T'*Hl;
  77.  
  78. % calculate the truncated dimension nn
  79.  
  80.    if nargin<2, tol=max([sig(1)*1.0E-12,1.0E-16]);end;
  81.    nn = n;
  82.    for i=n:-1:1, if sig(i)<=tol nn=i-1; end; end;
  83.    if nn==0, sysnrcf=[Dl*D Dl];sig=[];
  84.      else
  85.      sig = sig(1:nn);
  86.      % diagonal scaling  by sig(i)^(-0.5)
  87.     irtsig = sig.^(-0.5);
  88.      onn=1:nn;
  89.      Al=Al(onn,onn).*(irtsig*irtsig');
  90.      Bl=(irtsig*ones(1,m)).*Bl(onn,:);
  91.      Cl=Cl(:,onn).*(ones(p,1)*irtsig');
  92.      Hl=Hl(onn,:).*(irtsig*ones(1,p));
  93.      sysnlcf=pck(Al,[Bl Hl],Cl,[Dl*D Dl]);
  94.     end %if nn==0,
  95.  
  96. %now calculate the right coprime factorization if nargout>2.
  97.  
  98.  if nargout>2,
  99.   if nn==0, sysnrcf=[D*Dr;Dr];
  100.    elseif (sig(1)<0.99)&(nmuinv<=1e12),
  101.      roms2=sqrt(1-sig.^2);
  102.      sysnrcf=[zeros(nn+p+m,nn+m) nn*eye(nn+p+m,1); zeros(1,nn+m), -inf];
  103.      B=(Bl-Hl*D)*Dr;
  104.      sysnrcf(nn+p+1:nn+m+p,1:nn)=...
  105.           -(Dr*B').*(ones(m,1)*(sig./roms2)')...
  106.           -(D'*Dl'*Cl).*(ones(m,1)*roms2');
  107.     sysnrcf(nn+1:nn+p,1:nn)=...
  108.           (Dl\Cl).*(ones(p,1)*roms2')+D*sysnrcf(nn+p+1:nn+m+p,1:nn);
  109.     sysnrcf(1:nn+m+p,nn+1:nn+m)=[B./(roms2*ones(1,m));D*Dr;Dr];
  110.     sysnrcf(1:nn,1:nn)=(Al).*(roms2*(roms2.^(-1))');
  111.    else
  112.     sysnrcf = transp(sncfbal(transp(sys)));
  113.   end %if nn==0, sysnrcf
  114.  end, % if nargout>2
  115.  
  116. %
  117. % Copyright MUSYN INC 1991,  All Rights Reserved
  118.