Mercurial > forge
changeset 9802:52de84056920 octave-forge
control-devel: first steps towards an interface for ident function
author | paramaniac |
---|---|
date | Wed, 21 Mar 2012 09:48:12 +0000 |
parents | 047f1fbc2924 |
children | 82d6156962c4 |
files | extra/control-devel/devel/destillation.m extra/control-devel/devel/glass_furnace.m extra/control-devel/devel/ident.m |
diffstat | 3 files changed, 35 insertions(+), 7 deletions(-) [+] |
line wrap: on
line diff
--- a/extra/control-devel/devel/destillation.m Wed Mar 21 00:41:25 2012 +0000 +++ b/extra/control-devel/devel/destillation.m Wed Mar 21 09:48:12 2012 +0000 @@ -65,7 +65,7 @@ dat = iddata (Y_dest, U_dest) -[sys, x0] = ident (dat) %, 5) % nobr? 5, 90, ? +[sys, x0] = ident (dat, 5) % s=5, n=4 [y, t] = lsim (sys, U_dest, [], x0);
--- a/extra/control-devel/devel/glass_furnace.m Wed Mar 21 00:41:25 2012 +0000 +++ b/extra/control-devel/devel/glass_furnace.m Wed Mar 21 09:48:12 2012 +0000 @@ -47,7 +47,7 @@ dat = iddata (Y, U) -[sys, x0] = ident (dat) +[sys, x0] = ident (dat, 10) % s=10, n=5 [y, t] = lsim (sys, U, [], x0);
--- a/extra/control-devel/devel/ident.m Wed Mar 21 00:41:25 2012 +0000 +++ b/extra/control-devel/devel/ident.m Wed Mar 21 09:48:12 2012 +0000 @@ -1,4 +1,6 @@ -function [sys, x0] = ident (dat, nobr) +function [sys, x0] = ident (dat, s = [], n = []) + + %nobr = 15; meth = 2; @@ -8,12 +10,38 @@ conct = 1; ctrl = 0; %1; rcond = 0.0; - tol = -1.0; + tol = -1.0; % 0; + + [ns, l, m, e] = size (dat); - [n, l, m, e] = size (dat); + if (isempty (s) && isempty (n)) + nsmp = ns(1); + nobr = fix ((nsmp+1)/(2*(m+l+1))); + ctrl = 0; # confirm system order estimate + % nsmp >= 2*(m+l+1)*nobr - 1 + % nobr <= (nsmp+1)/(2*(m+l+1)) + elseif (isempty (s)) + s = min (2*n, n+10); + 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 + elseif (isempty (n)) + nobr = s; + ctrl = 0; # confirm system order estimate + else # s & n non-empty + nsmp = ns(1); + nobr = fix ((nsmp+1)/(2*(m+l+1))); + if (s > nobr) + error ("ident: s > nobr"); + endif + nobr = s; + ## TODO: specify n for IB01BD + endif - nsmp = n(1) - nobr = fix ((nsmp+1)/(2*(m+l+1))) + %nsmp = ns(1) + %nobr = fix ((nsmp+1)/(2*(m+l+1))) % nsmp >= 2*(m+l+1)*nobr - 1 % nobr <= (nsmp+1)/(2*(m+l+1)) %nobr = 10