diff scripts/control/system/sysmin.m @ 7135:8aa770b6c5bf

[project @ 2007-11-08 18:54:10 by jwe]
author jwe
date Thu, 08 Nov 2007 18:54:10 +0000
parents a1dbe9d80eee
children
line wrap: on
line diff
--- a/scripts/control/system/sysmin.m	Thu Nov 08 16:36:06 2007 +0000
+++ b/scripts/control/system/sysmin.m	Thu Nov 08 18:54:10 2007 +0000
@@ -51,17 +51,22 @@
 
 function [retsys, nc, no, cflg, oflg] = sysmin (sys, flg)
 
-  switch(nargin)
-  case(1), flg = 0;
-  case(2), jnk = flg;    # dummy operation
+  switch (nargin)
+  case 1
+    flg = 0;
+  case 2
+    jnk = flg;    # dummy operation
   otherwise,
     print_usage ();
   endswitch
-  dflg = is_digital(sys,2);
-  [n,nz,m,p] = sysdimensions(sys);
-  if(n*nz > 0)
+
+  dflg = is_digital (sys, 2);
+
+  [n, nz, m, p] = sysdimensions (sys);
+
+  if (n*nz > 0)
     # both continuous and discrete states
-    [aa,bb,cc,dd,tsam,n,nz,stnam,innam,outnam,yd] = sys2ss(sys);
+    [aa, bb, cc, dd, tsam, n, nz, stnam, innam, outnam, yd] = sys2ss (sys);
     crng = 1:n;
     drng = n+(1:nz);
 
@@ -77,24 +82,26 @@
 
     cstnam = stnam(crng);
     dstnam = stnam(drng);
-    cinnam = __sysconcat__(innam,stnam(drng));
-    coutnam = __sysconcat__(outnam,stnam(drng));
-    csys = ss(Ac,[Bc,Acd],[Cc;Adc]);
-    csys = syssetsignals(csys,"st",cstnam);
-    csys = syssetsignals(csys,"in",cinnam);
-    csys = syssetsignals(csys,"out",coutnam);
+    cinnam = __sysconcat__ (innam, stnam(drng));
+    coutnam = __sysconcat__ (outnam, stnam(drng));
+    csys = ss (Ac, [Bc, Acd], [Cc; Adc]);
+    csys = syssetsignals (csys, "st", cstnam);
+    csys = syssetsignals (csys, "in", cinnam);
+    csys = syssetsignals (csys, "out", coutnam);
 
     # reduce continuous system, recombine with discrete part
-    csys = sysmin(csys,flg);
-    cn = sysdimensions(csys);
+    csys = sysmin (csys, flg);
+    cn = sysdimensions (csys);
 
-    if(cn == 0)
+    if (cn == 0)
       # continuous states are removed; just reduce the discrete part
-      sys = sysprune(sys,1:p,1:m,drng);
-      retsys = sysmin(sys,flg);
+      sys = sysprune (sys, 1:p, 1:m, drng);
+      retsys = sysmin (sys, flg);
     else
       # extract updated parameters from reduced continuous system
-      [caa,cbb,ccc,cdd,ctsam,cn,cnz,cstnam,cinnam,coutnam] = sys2ss(csys);
+      [caa, cbb, ccc, cdd, ctsam, cn, cnz, cstnam, cinnam, coutnam] ...
+	  = sys2ss (csys);
+
       crng = 1:cn;
       Ac  = caa;
       Bc  = cbb(:,1:m);
@@ -103,45 +110,45 @@
       Adc = ccc(p + (1:nz),:);
 
       # recombine to reduce discrete part of the system
-      dinnam = __sysconcat__(innam,cstnam);
-      doutnam = __sysconcat__(outnam,cstnam);
-      dsys = ss(Ad,[Bd,Adc],[Cd;Acd],[],tsam);
-      dsys = syssetsignals(dsys,"st",dstnam);
-      dsys = syssetsignals(dsys,"in",dinnam);
-      dsys = syssetsignals(dsys,"out",doutnam);
+      dinnam = __sysconcat__ (innam, cstnam);
+      doutnam = __sysconcat__ (outnam, cstnam);
+      dsys = ss (Ad, [Bd, Adc], [Cd; Acd], [], tsam);
+      dsys = syssetsignals (dsys, "st", dstnam);
+      dsys = syssetsignals (dsys, "in", dinnam);
+      dsys = syssetsignals (dsys, "out", doutnam);
 
       # reduce discrete subsystem
-      dsys = sysmin(dsys);
-      [n1,nz] = sysdimensions(dsys);
-      if(nz == 0)
+      dsys = sysmin (dsys);
+      [n1, nz] = sysdimensions (dsys);
+      if (nz == 0)
         # discrete subsystem is not needed
-        retsys = sysprune(csys,1:p,1:m);
+        retsys = sysprune (csys, 1:p, 1:m);
       else
         # combine discrete, continuous subsystems
-        [Ad,dbb,dcc] = sys2ss(dsys);
-        dstnam = sysgetsignals(dsys,"st");
+        [Ad, dbb, dcc] = sys2ss (dsys);
+        dstnam = sysgetsignals (dsys, "st");
         Bd  = dbb(:,1:m);
         Adc = dbb(:,m+(1:cn));
         Cd  = dcc(1:p,:);
         Acd = dcc(p+(1:cn),:);
-        stnam = __sysconcat__(cstnam,dstnam);
+        stnam = __sysconcat__ (cstnam, dstnam);
         aa = [Ac, Acd; Adc, Ad];
         bb = [Bc; Bd];
         cc = [Cc, Cd];
-        retsys = ss([Ac, Acd; Adc, Ad], [Bc ; Bd], [Cc, Cd], dd, tsam, ...
-          cn, nz, stnam, innam, outnam, find(yd == 1));
-      end
+        retsys = ss ([Ac, Acd; Adc, Ad], [Bc ; Bd], [Cc, Cd], dd, tsam,
+		     cn, nz, stnam, innam, outnam, find(yd == 1));
+      endif
     endif
   else
-    Ts = sysgettsam(sys);
-    switch(flg)
-    case(0),
+    Ts = sysgettsam (sys);
+    switch (flg)
+    case 0
       ## reduce to a minimal system
-      [aa,bb,cc,dd] = sys2ss(sys);
-      [cflg,Uc] = is_controllable(aa,bb);
-      if(!cflg)
+      [aa, bb, cc, dd] = sys2ss (sys);
+      [cflg, Uc] = is_controllable (aa, bb);
+      if (! cflg)
         ## reduce to controllable states
-        if(!isempty(Uc))
+        if (! isempty (Uc))
           aa = Uc'*aa*Uc;
           bb = Uc'*bb;
           cc = cc*Uc;
@@ -149,10 +156,10 @@
           aa = bb = cc = [];
         endif
       endif
-      if(!isempty(aa))
-        [oflg,Uo] = is_observable(aa,cc);
-        if(!oflg)
-          if(!isempty(Uo))
+      if (! isempty (aa))
+        [oflg, Uo] = is_observable (aa, cc);
+        if (! oflg)
+          if (! isempty (Uo))
             aa = Uo'*aa*Uo;
             bb = Uo'*bb;
             cc = cc*Uo;
@@ -161,32 +168,40 @@
           endif
         endif
       endif
-      switch(dflg)
-      case(0),
-        nc = no = nn = columns(aa);
+      switch (dflg)
+      case 0
+        nc = no = nn = columns (aa);
         nz = 0;
-      case(1),
-        nc = no = nz = columns(aa);
+      case 1
+        nc = no = nz = columns (aa);
         nn = 0;
       endswitch
-      innam = sysgetsignals(sys,"in");
-      outnam= sysgetsignals(sys,"out");
-      retsys = ss(aa,bb,cc,dd,Ts,nn,nz,[],innam,outnam);
-    case(1),
+      innam = sysgetsignals (sys, "in");
+      outnam= sysgetsignals (sys, "out");
+      retsys = ss (aa, bb, cc, dd, Ts, nn, nz, [], innam, outnam);
+    case 1
       ## reduced model with physical states
-      [cflg,Uc] = is_controllable(sys); xc = find(max(abs(Uc')) != 0);
-      [oflg,Uo] = is_observable(sys);   xo = find(max(abs(Uo')) != 0);
-      xx = intersection(xc,xo);
-      if(isempty(xx)) xx = 0;  endif    # signal no states in reduced model
-      retsys = sysprune(sys,[],[],xx);
-    otherwise,
+      [cflg, Uc] = is_controllable (sys);
+      xc = find (max (abs (Uc')) != 0);
+      [oflg, Uo] = is_observable (sys);
+      xo = find (max (abs (Uo')) != 0);
+      xx = intersection (xc, xo);
+      ## signal no states in reduced model
+      if (isempty (xx))
+	xx = 0;
+      endif
+      retsys = sysprune (sys, [], [], xx);
+    otherwise
       error ("invalid value of flg = %d", flg);
     endswitch
-    if(sysdimensions(retsys,"st") > 0)
-      [cflg,Uc] = is_controllable(retsys); nc = columns(Uc);
-      [oflg,Uo] = is_observable(retsys);   no = columns(Uo);
+    if (sysdimensions (retsys, "st") > 0)
+      [cflg, Uc] = is_controllable (retsys);
+      nc = columns (Uc);
+      [oflg, Uo] = is_observable (retsys);
+      no = columns (Uo);
     else
       nc = no = 0;
     endif
   endif
+
 endfunction