From: <par...@us...> - 2011-11-30 14:04:12
|
Revision: 9225 http://octave.svn.sourceforge.net/octave/?rev=9225&view=rev Author: paramaniac Date: 2011-11-30 14:04:01 +0000 (Wed, 30 Nov 2011) Log Message: ----------- control-devel: finish sb16bd Modified Paths: -------------- trunk/octave-forge/extra/control-devel/devel/makefile_conred.m trunk/octave-forge/extra/control-devel/src/slsb16bd.cc Modified: trunk/octave-forge/extra/control-devel/devel/makefile_conred.m =================================================================== --- trunk/octave-forge/extra/control-devel/devel/makefile_conred.m 2011-11-30 13:05:10 UTC (rev 9224) +++ trunk/octave-forge/extra/control-devel/devel/makefile_conred.m 2011-11-30 14:04:01 UTC (rev 9225) @@ -21,7 +21,9 @@ SB03OT.f MB04OY.f MB03QD.f MB04ND.f MB03QY.f \ SB03OR.f SB03OY.f SB04PX.f MB04NY.f SB03OV.f -mkoctfile SB16BD.f AB09AD.f AB09BD.f SB08GD.f SB08HD.f \ +mkoctfile "-Wl,-framework" "-Wl,vecLib" \ + slsb16bd.cc \ + SB16BD.f AB09AD.f AB09BD.f SB08GD.f SB08HD.f \ TB01ID.f AB09AX.f MA02GD.f AB09BX.f TB01WD.f \ MA02DD.f MB03UD.f select.f AB09DD.f SB03OU.f \ MA02AD.f SB03OT.f MB04ND.f MB04OD.f SB03OR.f \ Modified: trunk/octave-forge/extra/control-devel/src/slsb16bd.cc =================================================================== --- trunk/octave-forge/extra/control-devel/src/slsb16bd.cc 2011-11-30 13:05:10 UTC (rev 9224) +++ trunk/octave-forge/extra/control-devel/src/slsb16bd.cc 2011-11-30 14:04:01 UTC (rev 9225) @@ -61,7 +61,7 @@ int nargin = args.length (); octave_value_list retval; - if (nargin != 19) + if (nargin != 15) { print_usage (); } @@ -69,10 +69,9 @@ { // arguments in char dico; - char jobc; - char jobo; + char jobd; char jobmr; - char weight; + char jobcf; char equil; char ordsel; @@ -85,21 +84,17 @@ const int iequil = args(5).int_value (); int ncr = args(6).int_value (); const int iordsel = args(7).int_value (); - double alpha = args(8).double_value (); + const int ijobd = args(8).int_value (); const int ijobmr = args(9).int_value (); - Matrix ac = args(10).matrix_value (); - Matrix bc = args(11).matrix_value (); - Matrix cc = args(12).matrix_value (); - Matrix dc = args(13).matrix_value (); + Matrix f = args(10).matrix_value (); + Matrix g = args(11).matrix_value (); + + const int ijobcf = args(12).int_value (); - const int iweight = args(14).int_value (); - const int ijobc = args(15).int_value (); - const int ijobo = args(16).int_value (); + double tol1 = args(13).double_value (); + double tol2 = args(14).double_value (); - double tol1 = args(17).double_value (); - double tol2 = args(18).double_value (); - if (idico == 0) dico = 'C'; else @@ -115,15 +110,15 @@ else ordsel = 'A'; - if (ijobc == 0) - jobc = 'S'; + if (ijobd == 0) + jobd = 'Z'; else - jobc = 'E'; + jobd = 'D'; - if (ijobo == 0) - jobo = 'S'; + if (ijobcf == 0) + jobcf = 'L'; else - jobo = 'E'; + jobcf = 'R'; switch (ijobmr) { @@ -143,88 +138,64 @@ error ("slsb16bd: argument jobmr invalid"); } - switch (iweight) - { - case 0: - weight = 'N'; - break; - case 1: - weight = 'O'; - break; - case 2: - weight = 'I'; - break; - case 3: - weight = 'P'; - break; - default: - error ("slsb16bd: argument weight invalid"); - } 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 nc = ac.rows (); int lda = max (1, n); int ldb = max (1, n); int ldc = max (1, p); - int ldd = max (1, p); + int ldd; + + if (jobd == 'Z') + ldd = 1; + else + ldd = max (1, p); - int ldac = max (1, nc); - int ldbc = max (1, nc); - int ldcc = max (1, m); + int ldf = max (1, m); + int ldg = max (1, n); int lddc = max (1, m); // arguments out - int ncs; - ColumnVector hsvc (n); + Matrix dc (lddc, p); + ColumnVector hsv (n); // workspace int liwork; - int liwrk1; - int liwrk2; + int pm; + int ldwork; + int lwr = max (1, n*(2*n+max(n,m+p)+5)+n*(n+1)/2); + switch (jobmr) { case 'B': - liwrk1 = 0; + pm = 0; break; case 'F': - liwrk1 = nc; + pm = n; break; - default: - liwrk1 = 2*nc; + default: // if JOBMR = 'S' or 'P' + pm = max (1, 2*n); } - if (weight == 'N') - liwrk2 = 0; - else - liwrk2 = 2*(m+p); - - liwork = max (1, liwrk1, liwrk2); - - int ldwork; - int lfreq; - int lsqred; - - if (weight == 'N') + if (ordsel == 'F' && ncr == n) { - if (equil == 'N') // if WEIGHT = 'N' and EQUIL = 'N' - lfreq = nc*(max (m, p) + 5); - else // if WEIGHT = 'N' and EQUIL = 'S' - lfreq = max (n, nc*(max (m, p) + 5)); - + liwork = 0; + ldwork = p*n; } - else // if WEIGHT = 'I' or 'O' or 'P' + else if (jobcf == 'L') { - lfreq = (n+nc)*(n+nc+2*m+2*p) + - max ((n+nc)*(n+nc+max(n+nc,m,p)+7), (m+p)*(m+p+4)); + liwork = max (pm, m); + ldwork = (n+m)*(m+p) + max (lwr, 4*m); } + else // if JOBCF = 'R' + { + liwork = max (pm, p); + ldwork = (n+p)*(m+p) + max (lwr, 4*p); + } - lsqred = max (1, 2*nc*nc+5*nc); - ldwork = 2*nc*nc + max (1, lfreq, lsqred); OCTAVE_LOCAL_BUFFER (int, iwork, liwork); OCTAVE_LOCAL_BUFFER (double, dwork, ldwork); @@ -300,19 +271,18 @@ } // resize - ac.resize (ncr, ncr); - bc.resize (ncr, p); // p: number of plant outputs - cc.resize (m, ncr); // m: number of plant inputs - hsvc.resize (ncs); + a.resize (ncr, ncr); // Ac + g.resize (ncr, p); // Bc + f.resize (m, ncr); // Cc + dc.resize (m, p); // Dc // return values - retval(0) = ac; - retval(1) = bc; - retval(2) = cc; + retval(0) = a; + retval(1) = g; + retval(2) = f; retval(3) = dc; retval(4) = octave_value (ncr); - retval(5) = hsvc; - retval(6) = octave_value (ncs); + retval(5) = hsv; } return retval; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |