Mercurial > forge
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 // ////////////////////////////////////////////////////////////////////////////////////