Mercurial > forge
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);