changeset 8667:ad8fbb590549 octave-forge

control-devel: touch up draft code
author paramaniac
date Mon, 24 Oct 2011 20:33:19 +0000
parents 285f7c59ee9b
children 49a585222db3
files extra/control-devel/inst/hnamodred.m
diffstat 1 files changed, 72 insertions(+), 19 deletions(-) [+]
line wrap: on
line diff
--- a/extra/control-devel/inst/hnamodred.m	Mon Oct 24 14:36:54 2011 +0000
+++ b/extra/control-devel/inst/hnamodred.m	Mon Oct 24 20:33:19 2011 +0000
@@ -1,31 +1,84 @@
-function [sysr, nr] = hnamodred (sys, nr = 0, sysv = [], sysw = [])
+function [sysr, nr] = hnamodred (sys, varargin)
 
+  if (nargin == 0)
+    print_usage ();
+  endif
+  
+  if (! isa (sys, "lti"))
+    error ("hnamodred: first argument must be an LTI system");
+  endif
+  
   [a, b, c, d, tsam, scaled] = ssdata (sys);
   dt = isdt (sys);
   
-  if (isempty (sysv))
-    av = bv = cv = dv = [];
-    jobv = 0;
-  else
-    sysv = ss (sysv);
-    [av, bv, cv, dv] = ssdata (sysv);
-    jobv = 1;
-  endif
-
-  if (isempty (sysw))
-    aw = bw = cw = dw = [];
-    jobw = 0;
-  else
-    sysw = ss (sysw);
-    [aw, bw, cw, dw] = ssdata (sysw);
-    jobw = 1;
-  endif
-
+  ## default arguments
+  av = bv = cv = dv = [];
+  jobv = 0;
+  aw = bw = cw = dw = [];
+  jobw = 0;
   jobinv = 2;
   tol1 = 1e-1; 
   tol2 = 1e-14;
   alpha = 0.0;
   ordsel = 1;
+  nr = 0
+
+  for k = 1 : 2 : (nargin-1)
+    prop = lower (varargin{k});
+    val = varargin{k+1};
+    switch (prop)
+      case {"left", "v"}
+        val = ss (val);  # val could be non-lti, therefore ssdata would fail
+        [av, bv, cv, dv, tsamv] = ssdata (val);
+        jobv = 1;
+
+      case {"right", "w"}
+        val = ss (val);
+        [aw, bw, cw, dw, tsamw] = ssdata (val);
+        jobw = 1;
+        ## TODO: check ct/dt
+
+      case {"order", "n", "nr"}
+        if (! issample (val, 0) || val != round (val))
+          error ("hnamodred: argument %s must be an integer >= 0", varargin{k});
+        endif
+        nr = val;
+        ordsel = 0;
+
+      case "tol1"
+        if (! is_real_scalar (val))
+          error ("hnamodred: argument %s must be a real scalar", varargin{k});
+        endif
+        tol1 = val;
+
+      case "tol2"
+        if (! is_real_scalar (val))
+          error ("hnamodred: argument %s must be a real scalar", varargin{k});
+        endif
+        tol2 = val;
+
+      case "alpha"
+        if (! is_real_scalar (val))
+          error ("hnamodred: argument %s must be a real scalar", varargin{k});
+        endif
+        if (dt)  # discrete-time
+          if (val < 0 || val > 1)
+            error ("hnamodred: argument %s must be 0 <= ALPHA <= 1", varargin{k});
+          endif
+        else     # continuous-time
+          if (val > 0)
+            error ("hnamodred: argument %s must be ALPHA <= 0", varargin{k});
+          endif
+        endif
+        alpha = val;
+
+
+      otherwise
+        error ("hnamodred: invalid property name");
+    endswitch
+  endfor
+  
+
 
   [ar, br, cr, dr, nr] = slab09jd (a, b, c, d, dt, scaled, nr, ordsel, alpha, \
                                    jobv, av, bv, cv, dv, \