diff scripts/control/hinf/is_dgkf.m @ 7131:a184bc985c37

[project @ 2007-11-08 15:55:02 by jwe]
author jwe
date Thu, 08 Nov 2007 15:55:02 +0000
parents a1dbe9d80eee
children df9519e9990c
line wrap: on
line diff
--- a/scripts/control/hinf/is_dgkf.m	Thu Nov 08 15:28:41 2007 +0000
+++ b/scripts/control/hinf/is_dgkf.m	Thu Nov 08 15:55:02 2007 +0000
@@ -131,84 +131,95 @@
 
 function [retval, dgkf_struct] = is_dgkf (Asys, nu, ny, tol)
 
-  if (nargin < 3) | (nargin > 4)
+  if (nargin < 3) || (nargin > 4)
     print_usage ();
-  elseif (! isscalar(nu) | ! isscalar(ny) )
-    error("is_dgkf: arguments 2 and 3 must be scalars")
-  elseif (! isstruct(Asys) )
-    error("Argument 1 must be a system data structure");
+  elseif (! isscalar (nu) || ! isscalar (ny))
+    error ("is_dgkf: arguments 2 and 3 must be scalars")
+  elseif (! isstruct (Asys))
+    error ("Argument 1 must be a system data structure");
   endif
-  if(nargin < 4)
+  if (nargin < 4)
     tol = 200*eps;
-  elseif( !is_sample(tol) )
-    error("is_dgkf: tol must be a positive scalar")
+  elseif (! is_sample (tol))
+    error ("is_dgkf: tol must be a positive scalar")
   endif
 
   retval = 1;           # assume passes test
 
-  dflg = is_digital(Asys);
-  [Anc, Anz, nin, nout ] = sysdimensions(Asys);
+  dflg = is_digital (Asys);
+  [Anc, Anz, nin, nout ] = sysdimensions (Asys);
 
-  if( Anz == 0 & Anc == 0 )
-    error("is_dgkf: no system states");
-  elseif( nu >= nin )
-    error("is_dgkf: insufficient number of disturbance inputs");
-  elseif( ny >= nout )
-    error("is_dgkf: insufficient number of regulated outputs");
+  if (Anz == 0 && Anc == 0)
+    error ("is_dgkf: no system states");
+  elseif (nu >= nin)
+    error ("is_dgkf: insufficient number of disturbance inputs");
+  elseif (ny >= nout)
+    error ("is_dgkf: insufficient number of regulated outputs");
   endif
 
-  nw = nin - nu;           nw1 = nw + 1;
-  nz = nout - ny;          nz1 = nz + 1;
+  nw = nin - nu;
+  nz = nout - ny;
 
-  [A,B,C,D] = sys2ss(Asys);
+  nw1 = nw + 1;
+  nz1 = nz + 1;
+
+  [A, B, C, D] = sys2ss (Asys);
   ## scale input/output for numerical reasons
-  if(norm (C, "fro") * norm (B, "fro") == 0)
-    error("||C||*||B|| = 0; no dynamic connnection from inputs to outputs");
+  if (norm (C, "fro") * norm (B, "fro") == 0)
+    error ("||C||*||B|| = 0; no dynamic connnection from inputs to outputs");
   endif
-  xx = sqrt(norm(B, Inf) / norm(C, Inf));
+  xx = sqrt (norm (B, Inf) / norm (C, Inf));
   B = B / xx;  C = C * xx;
 
   ## partition matrices
-                        Bw = B(:,1:nw);         Bu = B(:,nw1:nin);
-  Cz = C(1:nz,:);       Dzw = D(1:nz,1:nw);     Dzu = D(1:nz,nw1:nin);
-  Cy = C(nz1:nout,:);   Dyw = D(nz1:nout,1:nw); Dyu = D(nz1:nout,nw1:nin);
+  Bw = B(:,1:nw);
+  Bu = B(:,nw1:nin);
+
+  Cz = C(1:nz,:);
+  Cy = C(nz1:nout,:);
+
+  Dzw = D(1:nz,1:nw);
+  Dzu = D(1:nz,nw1:nin);
+
+  Dyw = D(nz1:nout,1:nw);
+  Dyu = D(nz1:nout,nw1:nin);
 
   ## Check for loopo shifting
-  Dyu_nz = (norm(Dyu,Inf) != 0);
+  Dyu_nz = (norm (Dyu, Inf) != 0);
   if (Dyu_nz)
-    warning("is_dgkf: D22 nonzero; performing loop shifting");
+    warning ("is_dgkf: D22 nonzero; performing loop shifting");
   endif
 
   ## 12 - rank condition at w = 0
   xx =[A, Bu; Cz, Dzu];
-  [nr, nc] = size(xx);
-  irank = rank(xx);
+  [nr, nc] = size (xx);
+  irank = rank (xx);
   if (irank != nc)
     retval = 0;
-    warning(sprintf("rank([A Bu; Cz Dzu]) = %d, need %d; n=%d, nz=%d, nu=%d", ...
-        irank,nc,(Anc+Anz),nz,nu));
-    warning(" *** 12-rank condition violated at w = 0.");
+    warning ("rank([A Bu; Cz Dzu]) = %d, need %d; n=%d, nz=%d, nu=%d",
+             irank, nc, Anc+Anz, nz, nu);
+    warning (" *** 12-rank condition violated at w = 0");
   endif
 
   ## 21 - rank condition at w = 0
   xx =[A, Bw; Cy, Dyw];
-  [nr, nc] = size(xx);
-  irank = rank(xx);
+  [nr, nc] = size (xx);
+  irank = rank (xx);
   if (irank != nr)
     retval = 0;
-    warning(sprintf("rank([A Bw; Cy Dyw]) = %d, need %d; n=%d, ny=%d, nw=%d", ...
-        irank,nr,(Anc+Anz),ny,nw));
-    warning(" *** 21-rank condition violated at w = 0.");
+    warning ("rank([A Bw; Cy Dyw]) = %d, need %d; n=%d, ny=%d, nw=%d",
+             irank, nr, Anc+Anz, ny, nw);
+    warning (" *** 21-rank condition violated at w = 0");
   endif
 
   ## can Dzu be transformed to become [0 I]' or [I]?
   ## This ensures a normalized weight
-  [Qz, Ru] = qr(Dzu);
-  irank = rank(Ru);
+  [Qz, Ru] = qr (Dzu);
+  irank = rank (Ru);
   if (irank != nu)
     retval = 0;
-    warning(sprintf("*** rank(Dzu(%d x %d) = %d", nz, nu, irank));
-    warning(" *** Dzu does not have full column rank.");
+    warning ("*** rank(Dzu(%d x %d) = %d", nz, nu, irank);
+    warning ("*** Dzu does not have full column rank");
   endif
   if (nu >= nz)
     Qz = Qz(:,1:nu)';
@@ -219,12 +230,12 @@
 
   ## can Dyw be transformed to become [0 I] or [I]?
   ## This ensures a normalized weight
-  [Qw, Ry] = qr(Dyw');
-  irank = rank(Ry);
+  [Qw, Ry] = qr (Dyw');
+  irank = rank (Ry);
   if (irank != ny)
     retval = 0;
-    warning(sprintf("*** rank(Dyw(%d x %d) = %d", ny, nw, irank));
-    warning(" *** Dyw does not have full row rank.");
+    warning ("*** rank(Dyw(%d x %d) = %d", ny, nw, irank);
+    warning (" *** Dyw does not have full row rank");
   endif
 
   if (ny >= nw)
@@ -246,22 +257,22 @@
   Dyw = Ry\Dyw*Qw;
 
   ## pack the return structure
-  dgkf_struct.nw        = nw;
-  dgkf_struct.nu        = nu;
-  dgkf_struct.nz        = nz;
-  dgkf_struct.ny        = ny;
-  dgkf_struct.A         = A;
-  dgkf_struct.Bw        = Bw;
-  dgkf_struct.Bu        = Bu;
-  dgkf_struct.Cz        = Cz;
-  dgkf_struct.Cy        = Cy;
-  dgkf_struct.Dzw       = Dzw;
-  dgkf_struct.Dzu       = Dzu;
-  dgkf_struct.Dyw       = Dyw;
-  dgkf_struct.Dyu       = Dyu;
-  dgkf_struct.Ru        = Ru;
-  dgkf_struct.Ry        = Ry;
-  dgkf_struct.Dyu_nz    = Dyu_nz;
-  dgkf_struct.dflg      = dflg;
+  dgkf_struct.nw = nw;
+  dgkf_struct.nu = nu;
+  dgkf_struct.nz = nz;
+  dgkf_struct.ny = ny;
+  dgkf_struct.A  = A;
+  dgkf_struct.Bw = Bw;
+  dgkf_struct.Bu = Bu;
+  dgkf_struct.Cz = Cz;
+  dgkf_struct.Cy = Cy;
+  dgkf_struct.Dzw = Dzw;
+  dgkf_struct.Dzu = Dzu;
+  dgkf_struct.Dyw = Dyw;
+  dgkf_struct.Dyu = Dyu;
+  dgkf_struct.Ru = Ru;
+  dgkf_struct.Ry = Ry;
+  dgkf_struct.Dyu_nz = Dyu_nz;
+  dgkf_struct.dflg = dflg;
 
 endfunction