changeset 9803:82d6156962c4 octave-forge

control-devel: first steps towards an interface for ident function (2)
author paramaniac
date Wed, 21 Mar 2012 10:21:26 +0000
parents 52de84056920
children 7a389d3ef821
files extra/control-devel/devel/destillation.m extra/control-devel/devel/glass_furnace.m extra/control-devel/devel/ident.m extra/control-devel/devel/test_slident.m extra/control-devel/src/slident.cc
diffstat 5 files changed, 29 insertions(+), 16 deletions(-) [+]
line wrap: on
line diff
--- a/extra/control-devel/devel/destillation.m	Wed Mar 21 09:48:12 2012 +0000
+++ b/extra/control-devel/devel/destillation.m	Wed Mar 21 10:21:26 2012 +0000
@@ -65,7 +65,7 @@
 
 dat = iddata (Y_dest, U_dest)
 
-[sys, x0] = ident (dat, 5)    % s=5, n=4
+[sys, x0] = ident (dat, 5, 4)    % s=5, n=4
 
 
 [y, t] = lsim (sys, U_dest, [], x0);
--- a/extra/control-devel/devel/glass_furnace.m	Wed Mar 21 09:48:12 2012 +0000
+++ b/extra/control-devel/devel/glass_furnace.m	Wed Mar 21 10:21:26 2012 +0000
@@ -47,7 +47,7 @@
 
 dat = iddata (Y, U)
 
-[sys, x0] = ident (dat, 10)     % s=10, n=5
+[sys, x0] = ident (dat, 10, 5)     % s=10, n=5
 
 
 [y, t] = lsim (sys, U, [], x0);
--- a/extra/control-devel/devel/ident.m	Wed Mar 21 09:48:12 2012 +0000
+++ b/extra/control-devel/devel/ident.m	Wed Mar 21 10:21:26 2012 +0000
@@ -18,6 +18,7 @@
     nsmp = ns(1);
     nobr = fix ((nsmp+1)/(2*(m+l+1)));
     ctrl = 0;  # confirm system order estimate
+    n = 0;
     % nsmp >= 2*(m+l+1)*nobr - 1
     % nobr <= (nsmp+1)/(2*(m+l+1))
   elseif (isempty (s))
@@ -25,11 +26,11 @@
     nsmp = ns(1);
     nobr = fix ((nsmp+1)/(2*(m+l+1)));
     nobr = min (nobr, s);
-    %% ctrl = 1;  # no confirmation
-    ctrl = 0; % setting of n not yet possible
+    ctrl = 1;  # no confirmation
   elseif (isempty (n))
     nobr = s;
     ctrl = 0;  # confirm system order estimate
+    n = 0;
   else         # s & n non-empty
     nsmp = ns(1);
     nobr = fix ((nsmp+1)/(2*(m+l+1)));
@@ -37,6 +38,7 @@
       error ("ident: s > nobr");
     endif
     nobr = s;
+    ctrl = 1;
     ## TODO: specify n for IB01BD
   endif
   
@@ -45,7 +47,7 @@
   % nsmp >= 2*(m+l+1)*nobr - 1
   % nobr <= (nsmp+1)/(2*(m+l+1))
 %nobr = 10
-  [a, b, c, d, q, ry, s, k, x0] = slident (dat.y{1}, dat.u{1}, nobr, meth, alg, jobd, batch, conct, ctrl, rcond, tol);
+  [a, b, c, d, q, ry, s, k, x0] = slident (dat.y{1}, dat.u{1}, nobr, n, meth, alg, jobd, batch, conct, ctrl, rcond, tol);
 
   sys = ss (a, b, c, d, -1);
 
--- a/extra/control-devel/devel/test_slident.m	Wed Mar 21 09:48:12 2012 +0000
+++ b/extra/control-devel/devel/test_slident.m	Wed Mar 21 10:21:26 2012 +0000
@@ -2030,8 +2030,9 @@
 ctrl = 1;
 rcond = 0.0;
 tol = -1.0;
+n = 0;
 
-[a, b, c, d, q, ry, s, k, x0] = slident (Y, U, nobr, meth, alg, jobd, batch, conct, ctrl, rcond, tol)
+[a, b, c, d, q, ry, s, k, x0] = slident (Y, U, nobr, n, meth, alg, jobd, batch, conct, ctrl, rcond, tol)
 
 
 ae = [  0.8924   0.3887   0.1285   0.1716
@@ -2090,6 +2091,7 @@
 % [y, t] = lsim (P, U);
 [y, t] = lsim (P, U, [], x0);
 
+err = norm (Y - y, 1) / norm (Y, 1)
 
 figure (3)
 plot (t, Y, 'b', t, y, 'r')
--- a/extra/control-devel/src/slident.cc	Wed Mar 21 09:48:12 2012 +0000
+++ b/extra/control-devel/src/slident.cc	Wed Mar 21 10:21:26 2012 +0000
@@ -95,7 +95,7 @@
     int nargin = args.length ();
     octave_value_list retval;
     
-    if (nargin != 11)
+    if (nargin != 12)
     {
         print_usage ();
     }
@@ -118,17 +118,18 @@
         Matrix y = args(0).matrix_value ();
         Matrix u = args(1).matrix_value ();
         int nobr = args(2).int_value ();
+        int nuser = args(3).int_value ();
         
-        const int imeth = args(3).int_value ();
-        const int ialg = args(4).int_value ();
-        const int ijobd = args(5).int_value ();
-        const int ibatch = args(6).int_value ();
-        const int iconct = args(7).int_value ();
-        const int ictrl = args(8).int_value ();
+        const int imeth = args(4).int_value ();
+        const int ialg = args(5).int_value ();
+        const int ijobd = args(6).int_value ();
+        const int ibatch = args(7).int_value ();
+        const int iconct = args(8).int_value ();
+        const int ictrl = args(9).int_value ();
         
-        double rcond = args(9).double_value ();
-        double tol = args(10).double_value ();
-        double tolb = args(9).double_value ();      // tolb = rcond
+        double rcond = args(10).double_value ();
+        double tol = args(11).double_value ();
+        double tolb = args(10).double_value ();      // tolb = rcond
 
             
         switch (imeth)
@@ -395,6 +396,14 @@
         int rs = 2*(m+l)*nobr;
         r.resize (rs, rs);
         
+        if (nuser > 0)
+        {
+            if (nuser < nobr)
+                n = nuser;
+            else
+                error ("ident: 'nuser' invalid");
+        }
+        
 ////////////////////////////////////////////////////////////////////////////////////
 //      SLICOT IB01BD - estimating system matrices, Kalman gain, and covariances  //
 ////////////////////////////////////////////////////////////////////////////////////