changeset 9672:dab86f0cf54a octave-forge

control-devel: quicksave draft code (2)
author paramaniac
date Tue, 13 Mar 2012 10:29:54 +0000
parents 419a45c4c119
children ae49c70a62f8
files extra/control-devel/devel/data_ib01ad.m extra/control-devel/src/slib01ad.cc
diffstat 2 files changed, 87 insertions(+), 58 deletions(-) [+]
line wrap: on
line diff
--- a/extra/control-devel/devel/data_ib01ad.m	Tue Mar 13 09:11:51 2012 +0000
+++ b/extra/control-devel/devel/data_ib01ad.m	Tue Mar 13 10:29:54 2012 +0000
@@ -1,5 +1,6 @@
 % IB01AD EXAMPLE PROGRAM DATA
 %  15     0     1     1  1000    0.0   -1.0     M     C     N     O     N     N
+%  nobr,  n,    m,    l, nsmp,   rcond, tol,    meth, alg,  jobd, batch,conct,ctrl
 
 U = [
    6.41
--- a/extra/control-devel/src/slib01ad.cc	Tue Mar 13 09:11:51 2012 +0000
+++ b/extra/control-devel/src/slib01ad.cc	Tue Mar 13 10:29:54 2012 +0000
@@ -59,88 +59,116 @@
     int nargin = args.length ();
     octave_value_list retval;
     
-    if (nargin != 13)
+    if (nargin != 11)
     {
         print_usage ();
     }
     else
     {
         // arguments in
-        char dico;
+        char meth;
+        char alg;
         char jobd;
-        char jobmr;
-        char jobcf;
-        char ordsel;
+        char batch;
+        char conct;
+        char ctrl;
+        
+        Matrix y = args(0).matrix_value ();
+        Matrix u = args(1).matrix_value ();
+        int nobr = args(2).int_value ();
         
-        Matrix a = args(0).matrix_value ();
-        Matrix b = args(1).matrix_value ();
-        Matrix c = args(2).matrix_value ();
-        Matrix d = args(3).matrix_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 idico = args(4).int_value ();
-        int ncr = args(5).int_value ();
-        const int iordsel = args(6).int_value ();
-        const int ijobd = args(7).int_value ();
-        const int ijobmr = args(8).int_value ();
-                       
-        Matrix f = args(9).matrix_value ();
-        Matrix g = args(10).matrix_value ();
+        double rcond = args(9).double_value ();
+        double tol = args(10).double_value ();
+        
 
-        const int ijobcf = args(11).int_value ();
-        double tol = args(12).double_value ();
-
-        if (idico == 0)
-            dico = 'C';
-        else
-            dico = 'D';
-
-        if (iordsel == 0)
-            ordsel = 'F';
+        if (imeth == 0)
+            meth = 'M';
         else
-            ordsel = 'A';
-
-        if (ijobd == 0)
-            jobd = 'Z';
-        else
-            jobd = 'D';
+            meth = 'N';
 
-        if (ijobcf == 0)
-            jobcf = 'L';
+        switch (ialg)
+        {
+            case 0:
+                alg = 'C';
+                break;
+            case 1:
+                alg = 'F';
+                break;
+            case 2:
+                alg = 'Q';
+                break;
+            default:
+                error ("slib01ad: argument 'alg' invalid");
+        }
+        
+        if (ijobd == 0)
+            jobd = 'M';
         else
-            jobcf = 'R';
-
-        switch (ijobmr)
+            jobd = 'N';
+        
+        switch (ibatch)
         {
             case 0:
-                jobmr = 'B';
+                batch = 'F';
                 break;
             case 1:
-                jobmr = 'F';
+                batch = 'I';
+                break;
+            case 2:
+                batch = 'L';
+                break;
+            case 3:
+                batch = 'O';
                 break;
             default:
-                error ("slib01ad: argument jobmr invalid");
+                error ("slib01ad: argument 'batch' invalid");
         }
 
+        if (iconct == 0)
+            conct = 'C';
+        else
+            conct = 'N';
+
+        if (ictrl == 0)
+            ctrl = 'C';
+        else
+            ctrl = 'N';
+
 
-        int n = a.rows ();      // n: number of states
-        int m = b.columns ();   // m: number of inputs
-        int p = c.rows ();      // p: number of outputs
+        int m = u.columns ();   // m: number of inputs
+        int l = y.columns ();   // l: number of outputs
+        int nsmp = y.rows ();   // nsmp: number of samples
+        // y.rows == u.rows  is checked by iddata class
+        // TODO: check minimal nsmp size
+        
+        int ldu;
+        
+        if (m == 0)
+            ldu = 1;
+        else                    // m > 0
+            ldu = nsmp;
 
-        int lda = max (1, n);
-        int ldb = max (1, n);
-        int ldc = max (1, p);
-        int ldd;
-        
-        if (jobd == 'Z')
-            ldd = 1;
-        else
-            ldd = max (1, p);
-
-        int ldf = max (1, m);
-        int ldg = max (1, n);
+        int ldy = nsmp;
 
         // arguments out
-        ColumnVector hsv (n);
+        int ldr;
+        
+        if (meth == 'M' && jobd == 'M')
+            ldr = max (2*(m+l)*nobr, 3*m*nobr);
+        else if (meth == 'N' || (meth == 'M' && jobd == 'N'))
+            ldr = 2*(m+l)*nobr;
+        else
+            error ("slib01ad: could not handle 'ldr' case");
+        
+        Matrix r (ldr, 2*(m+l)*nobr);
+        ColumnVector sv (l*nobr);
 
         // workspace
         int liwork;
@@ -220,7 +248,7 @@
                 "coefficient matrix"};
 
 
-        error_msg ("ident", info, 6, err_msg);
+        error_msg ("ident", info, 2, err_msg);
         warning_msg ("ident", iwarn, 5, warn_msg);