From: <par...@us...> - 2010-08-18 11:52:42
|
Revision: 7550 http://octave.svn.sourceforge.net/octave/?rev=7550&view=rev Author: paramaniac Date: 2010-08-18 11:52:36 +0000 (Wed, 18 Aug 2010) Log Message: ----------- control: return scaling factor Modified Paths: -------------- trunk/octave-forge/main/control/inst/care.m trunk/octave-forge/main/control/inst/dare.m trunk/octave-forge/main/control/inst/dlyap.m trunk/octave-forge/main/control/inst/lyap.m Modified: trunk/octave-forge/main/control/inst/care.m =================================================================== --- trunk/octave-forge/main/control/inst/care.m 2010-08-17 19:10:00 UTC (rev 7549) +++ trunk/octave-forge/main/control/inst/care.m 2010-08-18 11:52:36 UTC (rev 7550) @@ -47,9 +47,12 @@ function [x, l, g] = care (a, b, q, r, s = []) - ## TODO : Add SLICOT SG02AD (Solution of continuous- or discrete-time - ## algebraic Riccati equations for descriptor systems) + ## TODO: Add SLICOT SG02AD (Solution of continuous- or discrete-time + ## algebraic Riccati equations for descriptor systems) + ## TODO: Check stabilizability and controllability more elegantly + ## (without incorporating cross terms into a and q) + if (nargin < 4 || nargin > 5) print_usage (); endif Modified: trunk/octave-forge/main/control/inst/dare.m =================================================================== --- trunk/octave-forge/main/control/inst/dare.m 2010-08-17 19:10:00 UTC (rev 7549) +++ trunk/octave-forge/main/control/inst/dare.m 2010-08-18 11:52:36 UTC (rev 7550) @@ -47,9 +47,12 @@ function [x, l, g] = dare (a, b, q, r, s = []) - ## TODO : Add SLICOT SG02AD (Solution of continuous- or discrete-time - ## algebraic Riccati equations for descriptor systems) + ## TODO: Add SLICOT SG02AD (Solution of continuous- or discrete-time + ## algebraic Riccati equations for descriptor systems) + ## TODO: Check stabilizability and controllability more elegantly + ## (without incorporating cross terms into a and q) + if (nargin < 4 || nargin > 5) print_usage (); endif Modified: trunk/octave-forge/main/control/inst/dlyap.m =================================================================== --- trunk/octave-forge/main/control/inst/dlyap.m 2010-08-17 19:10:00 UTC (rev 7549) +++ trunk/octave-forge/main/control/inst/dlyap.m 2010-08-18 11:52:36 UTC (rev 7550) @@ -37,8 +37,10 @@ ## Created: January 2010 ## Version: 0.1 -function x = dlyap (a, b, c, e) +function [x, scale] = dlyap (a, b, c, e) + scale = 1; + switch (nargin) case 2 # Lyapunov equation @@ -60,10 +62,6 @@ [x, scale] = slsb03md (a, -b, true); # AXA' - X = -B ## x /= scale; # 0 < scale <= 1 - - if (scale < 1) - warning ("dlyap: solution scaled by %g to prevent overflow", scale); - endif case 3 # Sylvester equation @@ -119,15 +117,15 @@ ## x /= scale; # 0 < scale <= 1 - if (scale < 1) - warning ("dlyap: solution scaled by %g to prevent overflow", scale); - endif - otherwise print_usage (); endswitch + if (scale < 1) + warning ("dlyap: solution scaled by %g to prevent overflow", scale); + endif + endfunction Modified: trunk/octave-forge/main/control/inst/lyap.m =================================================================== --- trunk/octave-forge/main/control/inst/lyap.m 2010-08-17 19:10:00 UTC (rev 7549) +++ trunk/octave-forge/main/control/inst/lyap.m 2010-08-18 11:52:36 UTC (rev 7550) @@ -37,8 +37,10 @@ ## Created: January 2010 ## Version: 0.1 -function x = lyap (a, b, c, e) +function [x, scale] = lyap (a, b, c, e) + scale = 1; + switch (nargin) case 2 # Lyapunov equation @@ -60,10 +62,6 @@ [x, scale] = slsb03md (a, -b, false); # AX + XA' = -B ## x /= scale; # 0 < scale <= 1 - - if (scale < 1) - warning ("lyap: solution scaled by %g to prevent overflow", scale); - endif case 3 # Sylvester equation @@ -119,15 +117,15 @@ ## x /= scale; # 0 < scale <= 1 - if (scale < 1) - warning ("lyap: solution scaled by %g to prevent overflow", scale); - endif - otherwise print_usage (); endswitch + if (scale < 1) + warning ("lyap: solution scaled by %g to prevent overflow", scale); + endif + endfunction This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <par...@us...> - 2010-08-29 11:45:53
|
Revision: 7598 http://octave.svn.sourceforge.net/octave/?rev=7598&view=rev Author: paramaniac Date: 2010-08-29 11:45:46 +0000 (Sun, 29 Aug 2010) Log Message: ----------- control: replace all ctranspose ' by transpose .' Modified Paths: -------------- trunk/octave-forge/main/control/inst/@lti/sminreal.m trunk/octave-forge/main/control/inst/@ss/__minreal__.m trunk/octave-forge/main/control/inst/__tf2ss__.m trunk/octave-forge/main/control/inst/__timeresp__.m trunk/octave-forge/main/control/inst/care.m trunk/octave-forge/main/control/inst/covar.m trunk/octave-forge/main/control/inst/dare.m trunk/octave-forge/main/control/inst/dlyap.m trunk/octave-forge/main/control/inst/gensig.m trunk/octave-forge/main/control/inst/gram.m trunk/octave-forge/main/control/inst/isdetectable.m trunk/octave-forge/main/control/inst/isobsv.m trunk/octave-forge/main/control/inst/kalman.m trunk/octave-forge/main/control/inst/lsim.m trunk/octave-forge/main/control/inst/lyap.m trunk/octave-forge/main/control/inst/obsv.m trunk/octave-forge/main/control/inst/place.m trunk/octave-forge/main/control/inst/rlocus.m Modified: trunk/octave-forge/main/control/inst/@lti/sminreal.m =================================================================== --- trunk/octave-forge/main/control/inst/@lti/sminreal.m 2010-08-29 09:35:15 UTC (rev 7597) +++ trunk/octave-forge/main/control/inst/@lti/sminreal.m 2010-08-29 11:45:46 UTC (rev 7598) @@ -37,8 +37,8 @@ [cflg, Uc] = isctrb (sys); [oflg, Uo] = isobsv (sys); - xc = find (max (abs (Uc')) != 0); - xo = find (max (abs (Uo')) != 0); + xc = find (max (abs (Uc.')) != 0); + xo = find (max (abs (Uo.')) != 0); st_idx = intersect (xc, xo); sys = __sysprune__ (sys, ":", ":", st_idx); Modified: trunk/octave-forge/main/control/inst/@ss/__minreal__.m =================================================================== --- trunk/octave-forge/main/control/inst/@ss/__minreal__.m 2010-08-29 09:35:15 UTC (rev 7597) +++ trunk/octave-forge/main/control/inst/@ss/__minreal__.m 2010-08-29 11:45:46 UTC (rev 7598) @@ -38,8 +38,8 @@ if (! cflg) if (! isempty (Uc)) - A = Uc' * A * Uc; - B = Uc' * B; + A = Uc.' * A * Uc; + B = Uc.' * B; C = C * Uc; else A = B = C = []; @@ -56,8 +56,8 @@ if (! oflg) if (! isempty (Uo)) - A = Uo' * A * Uo; - B = Uo' * B; + A = Uo.' * A * Uo; + B = Uo.' * B; C = C * Uo; else A = B = C = []; Modified: trunk/octave-forge/main/control/inst/__tf2ss__.m =================================================================== --- trunk/octave-forge/main/control/inst/__tf2ss__.m 2010-08-29 09:35:15 UTC (rev 7597) +++ trunk/octave-forge/main/control/inst/__tf2ss__.m 2010-08-29 11:45:46 UTC (rev 7598) @@ -87,8 +87,8 @@ endif ## force num, den to be row vectors - num = vec (num)'; - den = vec (den)'; + num = vec (num).'; + den = vec (den).'; nn = length (num); nd = length (den); if (nn > nd) Modified: trunk/octave-forge/main/control/inst/__timeresp__.m =================================================================== --- trunk/octave-forge/main/control/inst/__timeresp__.m 2010-08-29 09:35:15 UTC (rev 7597) +++ trunk/octave-forge/main/control/inst/__timeresp__.m 2010-08-29 11:45:46 UTC (rev 7598) @@ -58,7 +58,7 @@ p = rows (C); # number of outputs ## time vector - t = (0 : dt : tfinal)'; + t = (0 : dt : tfinal).'; l_t = length (t); switch (resptype) Modified: trunk/octave-forge/main/control/inst/care.m =================================================================== --- trunk/octave-forge/main/control/inst/care.m 2010-08-29 09:35:15 UTC (rev 7597) +++ trunk/octave-forge/main/control/inst/care.m 2010-08-29 11:45:46 UTC (rev 7598) @@ -91,8 +91,8 @@ srows, scols, brows, bcols); endif - ao = a - (b/r)*s'; - qo = q - (s/r)*s'; + ao = a - (b/r)*s.'; + qo = q - (s/r)*s.'; endif ## check stabilizability @@ -123,13 +123,13 @@ x = slsb02od (a, b, q, r, b, false, false); ## corresponding gain matrix - g = r \ (b'*x); + g = r \ (b.'*x); else ## unique stabilizing solution x = slsb02od (a, b, q, r, s, false, true); ## corresponding gain matrix - g = r \ (b'*x + s'); + g = r \ (b.'*x + s.'); endif ## closed-loop poles @@ -151,7 +151,7 @@ %! %! r = 3; %! -%! [x, l, g] = care (a, b, c'*c, r); +%! [x, l, g] = care (a, b, c.'*c, r); %! %! xe = [ 0.5895 1.8216 %! 1.8216 8.8188]; @@ -180,7 +180,7 @@ %! 0.0 %! 1.0]; %! -%! [x, l, g] = care (a, b, c'*c, d'*d); +%! [x, l, g] = care (a, b, c.'*c, d.'*d); %! %! xe = [ 1.7321 1.0000 %! 1.0000 1.7321]; Modified: trunk/octave-forge/main/control/inst/covar.m =================================================================== --- trunk/octave-forge/main/control/inst/covar.m 2010-08-29 09:35:15 UTC (rev 7597) +++ trunk/octave-forge/main/control/inst/covar.m 2010-08-29 11:45:46 UTC (rev 7598) @@ -47,11 +47,11 @@ error ("covar: system is not strictly proper"); endif - q = lyap (a, b*w*b'); - p = c*q*c'; + q = lyap (a, b*w*b.'); + p = c*q*c.'; else - q = dlyap (a, b*w*b'); - p = c*q*c' + d*w*d'; + q = dlyap (a, b*w*b.'); + p = c*q*c.' + d*w*d.'; endif endfunction Modified: trunk/octave-forge/main/control/inst/dare.m =================================================================== --- trunk/octave-forge/main/control/inst/dare.m 2010-08-29 09:35:15 UTC (rev 7597) +++ trunk/octave-forge/main/control/inst/dare.m 2010-08-29 11:45:46 UTC (rev 7598) @@ -91,8 +91,8 @@ srows, scols, brows, bcols); endif - ao = a - (b/r)*s'; - qo = q - (s/r)*s'; + ao = a - (b/r)*s.'; + qo = q - (s/r)*s.'; endif ## check stabilizability @@ -123,13 +123,13 @@ x = slsb02od (a, b, q, r, b, true, false); ## corresponding gain matrix - g = (r + b'*x*b) \ (b'*x*a); + g = (r + b.'*x*b) \ (b.'*x*a); else ## unique stabilizing solution x = slsb02od (a, b, q, r, s, true, true); ## corresponding gain matrix - g = (r + b'*x*b) \ (b'*x*a + s'); + g = (r + b.'*x*b) \ (b.'*x*a + s.'); endif ## closed-loop poles Modified: trunk/octave-forge/main/control/inst/dlyap.m =================================================================== --- trunk/octave-forge/main/control/inst/dlyap.m 2010-08-29 09:35:15 UTC (rev 7597) +++ trunk/octave-forge/main/control/inst/dlyap.m 2010-08-29 11:45:46 UTC (rev 7598) @@ -139,7 +139,7 @@ %! 24.0 32.0 8.0 %! 15.0 8.0 40.0]; %! -%! X = dlyap (A', -B); +%! X = dlyap (A.', -B); %! %! X_exp = [2.0000 1.0000 1.0000 %! 1.0000 3.0000 0.0000 Modified: trunk/octave-forge/main/control/inst/gensig.m =================================================================== --- trunk/octave-forge/main/control/inst/gensig.m 2010-08-29 09:35:15 UTC (rev 7597) +++ trunk/octave-forge/main/control/inst/gensig.m 2010-08-29 11:45:46 UTC (rev 7598) @@ -72,7 +72,7 @@ tsam = tau / 64; endif - t = (0 : tsam : tfinal)'; + t = (0 : tsam : tfinal).'; switch (lower (sigtype(1:2))) case "si" Modified: trunk/octave-forge/main/control/inst/gram.m =================================================================== --- trunk/octave-forge/main/control/inst/gram.m 2010-08-29 09:35:15 UTC (rev 7597) +++ trunk/octave-forge/main/control/inst/gram.m 2010-08-29 11:45:46 UTC (rev 7598) @@ -19,9 +19,9 @@ ## -*- texinfo -*- ## @deftypefn {Function File} {@var{W} =} gram (@var{sys}, @var{mode}) ## @deftypefnx {Function File} {@var{Wc} =} gram (@var{a}, @var{b}) -## @code{gram (@var{sys}, 'c')} returns the controllability gramian of +## @code{gram (@var{sys}, "c")} returns the controllability gramian of ## the (continuous- or discrete-time) system @var{sys}. -## @code{gram (@var{sys}, 'o')} returns the observability gramian of the +## @code{gram (@var{sys}, "o")} returns the observability gramian of the ## (continuous- or discrete-time) system @var{sys}. ## @code{gram (@var{a}, @var{b})} returns the controllability gramian ## @var{Wc} of the continuous-time system @math{dx/dt = a x + b u}; @@ -52,8 +52,8 @@ [a, b, c] = ssdata (sys); if (strcmp (argin2, "o")) - a = a'; - b = c'; + a = a.'; + b = c.'; elseif (! strcmp (argin2, "c")) print_usage (); endif @@ -71,9 +71,9 @@ endif if (isct (sys)) - W = lyap (a, b*b'); # let lyap do the error checking about dimensions + W = lyap (a, b*b.'); # let lyap do the error checking about dimensions else # discrete-time system - W = dlyap (a, b*b'); # let dlyap do the error checking about dimensions + W = dlyap (a, b*b.'); # let dlyap do the error checking about dimensions endif endfunction @@ -83,21 +83,21 @@ %! a = [-1 0 0; 1/2 -1 0; 1/2 0 -1]; %! b = [1 0; 0 -1; 0 1]; %! c = [0 0 1; 1 1 0]; ## it doesn't matter what the value of c is -%! Wc = gram (ss (a, b, c), 'c'); -%! assert (a * Wc + Wc * a' + b * b', zeros (size (a))) +%! Wc = gram (ss (a, b, c), "c"); +%! assert (a * Wc + Wc * a.' + b * b.', zeros (size (a))) %!test %! a = [-1 0 0; 1/2 -1 0; 1/2 0 -1]; %! b = [1 0; 0 -1; 0 1]; ## it doesn't matter what the value of b is %! c = [0 0 1; 1 1 0]; -%! Wo = gram (ss (a, b, c), 'o'); -%! assert (a' * Wo + Wo * a + c' * c, zeros (size (a))) +%! Wo = gram (ss (a, b, c), "o"); +%! assert (a.' * Wo + Wo * a + c.' * c, zeros (size (a))) %!test %! a = [-1 0 0; 1/2 -1 0; 1/2 0 -1]; %! b = [1 0; 0 -1; 0 1]; %! Wc = gram (a, b); -%! assert (a * Wc + Wc * a' + b * b', zeros (size (a))) +%! assert (a * Wc + Wc * a.' + b * b.', zeros (size (a))) %!test %! a = [-1 0 0; 1/2 1 0; 1/2 0 -1] / 2; @@ -105,8 +105,8 @@ %! c = [0 0 1; 1 1 0]; ## it doesn't matter what the value of c is %! d = zeros (rows (c), columns (b)); ## it doesn't matter what the value of d is %! Ts = 0.1; ## Ts != 0 -%! Wc = gram (ss (a, b, c, d, Ts), 'c'); -%! assert (a * Wc * a' - Wc + b * b', zeros (size (a)), 1e-12) +%! Wc = gram (ss (a, b, c, d, Ts), "c"); +%! assert (a * Wc * a.' - Wc + b * b.', zeros (size (a)), 1e-12) %!test %! a = [-1 0 0; 1/2 1 0; 1/2 0 -1] / 2; @@ -114,5 +114,5 @@ %! c = [0 0 1; 1 1 0]; %! d = zeros (rows (c), columns (b)); ## it doesn't matter what the value of d is %! Ts = 0.1; ## Ts != 0 -%! Wo = gram (ss (a, b, c, d, Ts), 'o'); -%! assert (a' * Wo * a - Wo + c' * c, zeros (size (a)), 1e-12) \ No newline at end of file +%! Wo = gram (ss (a, b, c, d, Ts), "o"); +%! assert (a.' * Wo * a - Wo + c.' * c, zeros (size (a)), 1e-12) \ No newline at end of file Modified: trunk/octave-forge/main/control/inst/isdetectable.m =================================================================== --- trunk/octave-forge/main/control/inst/isdetectable.m 2010-08-29 09:35:15 UTC (rev 7597) +++ trunk/octave-forge/main/control/inst/isdetectable.m 2010-08-29 11:45:46 UTC (rev 7598) @@ -57,7 +57,7 @@ endif endif - retval = isstabilizable (a', c', tol, dflg); + retval = isstabilizable (a.', c.', tol, dflg); endfunction Modified: trunk/octave-forge/main/control/inst/isobsv.m =================================================================== --- trunk/octave-forge/main/control/inst/isobsv.m 2010-08-29 09:35:15 UTC (rev 7597) +++ trunk/octave-forge/main/control/inst/isobsv.m 2010-08-29 11:45:46 UTC (rev 7598) @@ -21,7 +21,7 @@ ## @deftypefnx {Function File} {[@var{retval}, @var{u}] =} isobsv (@var{sys}, @var{tol}) ## Logical check for system observability. ## -## Default: tol = @code{tol = 10*norm(a,'fro')*eps} +## Default: tol = @code{tol = 10*norm(a,"fro")*eps} ## ## Returns 1 if the system @var{sys} or the pair (@var{a}, @var{c}) is ## observable, 0 if not. @@ -55,9 +55,9 @@ print_usage (); endif if (exist ("tol")) - [retval, U] = isctrb (a', c', tol); + [retval, U] = isctrb (a.', c.', tol); else - [retval, U] = isctrb (a', c'); + [retval, U] = isctrb (a.', c.'); endif endfunction Modified: trunk/octave-forge/main/control/inst/kalman.m =================================================================== --- trunk/octave-forge/main/control/inst/kalman.m 2010-08-29 09:35:15 UTC (rev 7597) +++ trunk/octave-forge/main/control/inst/kalman.m 2010-08-29 11:45:46 UTC (rev 7598) @@ -91,20 +91,20 @@ h = d(sensors, stoch); if (isempty (s)) - rbar = r + h*q*h'; - sbar = g * q*h'; + rbar = r + h*q*h.'; + sbar = g * q*h.'; else - rbar = r + h*s + s'*h' + h*q*h'; - sbar = g * (q*h' + s); + rbar = r + h*s + s.'*h.' + h*q*h.'; + sbar = g * (q*h.' + s); endif if (isct (sys)) - [x, l, k] = care (a', c', g*q*g', rbar, sbar); + [x, l, k] = care (a.', c.', g*q*g.', rbar, sbar); else - [x, l, k] = dare (a', c', g*q*g', rbar, sbar); + [x, l, k] = dare (a.', c.', g*q*g.', rbar, sbar); endif - k = k'; + k = k.'; est = estim (sys, k, sensors, known); Modified: trunk/octave-forge/main/control/inst/lsim.m =================================================================== --- trunk/octave-forge/main/control/inst/lsim.m 2010-08-29 09:35:15 UTC (rev 7597) +++ trunk/octave-forge/main/control/inst/lsim.m 2010-08-29 11:45:46 UTC (rev 7598) @@ -75,7 +75,7 @@ m = columns (G); # number of inputs p = rows (C); # number of outputs - t = (0 : dt : tfinal)'; # time vector + t = (0 : dt : tfinal).'; # time vector trows = length (t); if (urows != trows) @@ -101,9 +101,9 @@ ## simulation for k = 1 : trows - y(k, :) = C * x + D * u(k, :)'; + y(k, :) = C * x + D * u(k, :).'; x_arr(k, :) = x; - x = F * x + G * u(k, :)'; + x = F * x + G * u(k, :).'; endfor if (! nargout) # plot information Modified: trunk/octave-forge/main/control/inst/lyap.m =================================================================== --- trunk/octave-forge/main/control/inst/lyap.m 2010-08-29 09:35:15 UTC (rev 7597) +++ trunk/octave-forge/main/control/inst/lyap.m 2010-08-29 11:45:46 UTC (rev 7598) @@ -173,7 +173,7 @@ %! -73.0 -70.0 -25.0 %! -28.0 -25.0 -18.0]; %! -%! X = lyap (A', -B, [], E'); +%! X = lyap (A.', -B, [], E.'); %! %! X_exp = [-2.0000 -1.0000 0.0000 %! -1.0000 -3.0000 -1.0000 Modified: trunk/octave-forge/main/control/inst/obsv.m =================================================================== --- trunk/octave-forge/main/control/inst/obsv.m 2010-08-29 09:35:15 UTC (rev 7597) +++ trunk/octave-forge/main/control/inst/obsv.m 2010-08-29 11:45:46 UTC (rev 7598) @@ -40,7 +40,7 @@ print_usage (); endif - ob = ctrb (a', c')'; + ob = ctrb (a.', c.').'; endfunction Modified: trunk/octave-forge/main/control/inst/place.m =================================================================== --- trunk/octave-forge/main/control/inst/place.m 2010-08-29 09:35:15 UTC (rev 7597) +++ trunk/octave-forge/main/control/inst/place.m 2010-08-29 11:45:46 UTC (rev 7598) @@ -58,8 +58,8 @@ ## @example ## @group ## Place is also suitable to design estimator gains: -## L = place (A', C', p)' -## L = place (sys.', p)' % useful for discrete-time systems +## L = place (A.', C.', p).' +## L = place (sys.', p).' % useful for discrete-time systems ## @end group ## @end example ## @end deftypefn Modified: trunk/octave-forge/main/control/inst/rlocus.m =================================================================== --- trunk/octave-forge/main/control/inst/rlocus.m 2010-08-29 09:35:15 UTC (rev 7597) +++ trunk/octave-forge/main/control/inst/rlocus.m 2010-08-29 11:45:46 UTC (rev 7598) @@ -146,7 +146,7 @@ ngain = max (30, ngain); gvec = linspace (mink, maxk, ngain); if (length (k_break)) - gvec = sort ([gvec, vec(k_break)']); + gvec = sort ([gvec, vec(k_break).']); endif ## Find the open loop zeros and the initial poles @@ -175,7 +175,7 @@ done = (nargin == 4); # perform a smoothness check while (! done && ngain < 1000) done = 1 ; # assume done - dp = abs (diff (rlpol'))'; + dp = abs (diff (rlpol.')).'; maxdp = max (dp); ## search for poles whose neighbors are distant @@ -306,7 +306,7 @@ endif # reorder entries in each column of rlpol to be by their nearest-neighbors - dp = diff (rlpol')'; + dp = diff (rlpol.').'; drp = max (real (dp)); dip = max (imag (dp)); idx = find (drp > tolx | dip > toly); @@ -324,9 +324,9 @@ mindist = min (dval); sidx = min (find (dval == mindist)) + ii - 1; if (sidx != ii) - c1 = norm (diff(vals')); + c1 = norm (diff(vals.')); [vals(ii,2), vals(sidx,2)] = swap (vals(ii,2), vals(sidx,2)); - c2 = norm (diff (vals')); + c2 = norm (diff (vals.')); if (c1 > c2) ## perform the swap [rlpol(ii,jdx), rlpol(sidx,jdx)] = swap (rlpol(ii,jdx), rlpol(sidx,jdx)); @@ -339,9 +339,6 @@ endfunction -function [a1, b1] = swap (a, b) +function [b, a] = swap (a, b) - a1 = b; - b1 = a; - endfunction This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <par...@us...> - 2010-08-29 20:56:59
|
Revision: 7600 http://octave.svn.sourceforge.net/octave/?rev=7600&view=rev Author: paramaniac Date: 2010-08-29 20:56:51 +0000 (Sun, 29 Aug 2010) Log Message: ----------- control: beef up isctrb, isobsv, ss:minreal by Slicot, add a test Modified Paths: -------------- trunk/octave-forge/main/control/inst/@ss/__minreal__.m trunk/octave-forge/main/control/inst/isctrb.m trunk/octave-forge/main/control/inst/isobsv.m trunk/octave-forge/main/control/inst/ltimodels.m Modified: trunk/octave-forge/main/control/inst/@ss/__minreal__.m =================================================================== --- trunk/octave-forge/main/control/inst/@ss/__minreal__.m 2010-08-29 19:19:52 UTC (rev 7599) +++ trunk/octave-forge/main/control/inst/@ss/__minreal__.m 2010-08-29 20:56:51 UTC (rev 7600) @@ -68,16 +68,4 @@ retsys = ss (A, B, C, sys.d); retsys.lti = sys.lti; # retain i/o names and tsam - warning ("ss: minreal: use result with caution"); - endfunction - - -## FIXME: algorithm fails for the example below -## -## P = ss (-2, 3, 4, 5) -## C = inv (P) -## L = P * C -## Lm = minreal (L) -## -## Lm.d should be 1 \ No newline at end of file Modified: trunk/octave-forge/main/control/inst/isctrb.m =================================================================== --- trunk/octave-forge/main/control/inst/isctrb.m 2010-08-29 19:19:52 UTC (rev 7599) +++ trunk/octave-forge/main/control/inst/isctrb.m 2010-08-29 20:56:51 UTC (rev 7600) @@ -20,6 +20,8 @@ ## @deftypefn {Function File} {[@var{retval}, @var{u}] =} isctrb (@var{sys}, @var{tol}) ## @deftypefnx {Function File} {[@var{retval}, @var{u}] =} isctrb (@var{a}, @var{b}, @var{tol}) ## Logical check for system controllability. +## Uses SLICOT AB01OD by courtesy of NICONET e.V. +## <http://www.slicot.org> ## ## @strong{Inputs} ## @table @var @@ -29,7 +31,7 @@ ## @itemx b ## @var{n} by @var{n}, @var{n} by @var{m} matrices, respectively ## @item tol -## optional roundoff parameter. Default value: @code{10*eps} +## optional roundoff parameter. Default value: 0 ## @end table ## ## @strong{Outputs} @@ -41,18 +43,7 @@ ## @item u ## @var{u} is an orthogonal basis of the controllable subspace. ## @end table -## -## @strong{Method} -## Controllability is determined by applying Arnoldi iteration with -## complete re-orthogonalization to obtain an orthogonal basis of the -## Krylov subspace -## @example -## span ([b,a*b,...,a^@{n-1@}*b]). -## @end example -## The Arnoldi iteration is executed with @code{krylov} if the system -## has a single input; otherwise a block Arnoldi iteration is performed -## with @code{krylovb}. -## @seealso{size, rows, columns, length, ismatrix, isscalar, isvector, is_observable, is_stabilizable, is_detectable, krylov, krylovb} +## @seealso{isobsv} ## @end deftypefn ## Author: A. S. Hodel <a.s...@en...> @@ -62,63 +53,36 @@ ## Adapted-By: Lukas Reichlin <luk...@gm...> ## Date: October 2009 -## Version: 0.1 +## Version: 0.2 -function [retval, U] = isctrb (a, b, tol) +function [retval, U] = isctrb (A, B = 0, tol = 0) - deftol = 1; # assume default tolerance - if (nargin < 1 || nargin > 3) print_usage (); - elseif (isa (a, "lti")) - ## system structure passed. - [a, bs] = ssdata (a); + elseif (isa (A, "lti")) # isctrb (sys), isctrb (sys, tol) if (nargin > 2) print_usage (); - elseif (nargin == 2) - tol = b; # get tolerance - deftol = 0; endif - b = bs; - else - ## a,b arguments sent directly. - if (nargin < 2) - print_usage (); - else - deftol = 1; - endif + tol = B; + [A, B] = ssdata (A); + elseif (nargin < 2) # isctrb (A, B), isctrb (A, B, tol) + print_usage (); endif - ## check for default tolerance - if (deftol) - if (isa (a, "single") || isa (b, "single")) - tol = 1000 * eps("single"); - else - tol = 1000*eps; - endif - endif - ## check tol dimensions if (! isscalar (tol)) error ("isctrb: tol(%dx%d) must be a scalar", rows (tol), columns (tol)); - elseif (! issample (tol)) - error ("isctrb: tol=%e must be positive", tol); endif ## check dimensions compatibility - n = rows (a); - [nr, nc] = size (b); - - if (n == 0 || n != nr || nc == 0 || ! issquare (a)) - warning ("isctrb: a(%dx%d), b(%dx%d)", - rows(a), columns(a), nr, nc); - retval = 0; - else - ## call block-krylov subspace routine to get an orthogonal basis - ## of the controllable subspace. - [U, H, Ucols] = krylov (a, b, n, tol, 1); - retval = (Ucols == n); + if (isempty (A) || isempty (B) || rows (A) != rows (B) || ! issquare (A)) + error ("isctrb: A(%dx%d), B(%dx%d)", + rows (A), columns (A), rows (B), columns (B)); endif + [Ac, Bc, U, ncont] = slab01od (A, B, tol); +U = U(:, 1:ncont); + retval = (ncont == rows (A)); + endfunction Modified: trunk/octave-forge/main/control/inst/isobsv.m =================================================================== --- trunk/octave-forge/main/control/inst/isobsv.m 2010-08-29 19:19:52 UTC (rev 7599) +++ trunk/octave-forge/main/control/inst/isobsv.m 2010-08-29 20:56:51 UTC (rev 7600) @@ -28,7 +28,7 @@ ## ## See @command{isctrb} for detailed description of arguments ## and default values. -## @seealso{size, rows, columns, length, ismatrix, isscalar, isvector} +## @seealso{isctrb} ## @end deftypefn ## Author: A. S. Hodel <a.s...@en...> @@ -37,27 +37,26 @@ ## Adapted-By: Lukas Reichlin <luk...@gm...> ## Date: October 2009 -## Version: 0.1 +## Version: 0.2 -function [retval, U] = isobsv (a, c, tol) +function [retval, U] = isobsv (A, C = [], tol = []) - if (nargin < 1) + if (nargin < 1 || nargin > 3) print_usage (); - elseif (isa (a, "lti")) - ## system form - if (nargin == 2) - tol = c; - elseif (nargin > 2) + elseif (isa (A, "lti")) # isobsv (sys), isobsv (sys, tol) + if (nargin > 2) print_usage (); endif - [a, b, c] = ssdata (a); - elseif (nargin > 3) + tol = C; + [A, B, C] = ssdata (A); + elseif (nargin < 2) # isobsv (A, C), isobsv (A, C, tol) print_usage (); endif - if (exist ("tol")) - [retval, U] = isctrb (a.', c.', tol); + + if (isempty (tol)) + [retval, U] = isctrb (A.', C.'); else - [retval, U] = isctrb (a.', c.'); + [retval, U] = isctrb (A.', C.', tol); endif endfunction Modified: trunk/octave-forge/main/control/inst/ltimodels.m =================================================================== --- trunk/octave-forge/main/control/inst/ltimodels.m 2010-08-29 19:19:52 UTC (rev 7599) +++ trunk/octave-forge/main/control/inst/ltimodels.m 2010-08-29 20:56:51 UTC (rev 7600) @@ -208,3 +208,17 @@ %! Me = [Ae, -Be; -Ce, De]; %! %!assert (M, Me, 1e-4); + +## ss: minreal +%!shared C, D +%! +%! A = ss (-2, 3, 4, 5); +%! B = A / A; +%! C = minreal (B); +%! D = ss (1); +%! +%!assert (C.a, D.a); +%!assert (C.b, D.b); +%!assert (C.c, D.c); +%!assert (C.d, D.d); + This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <par...@us...> - 2010-08-29 23:49:37
|
Revision: 7603 http://octave.svn.sourceforge.net/octave/?rev=7603&view=rev Author: paramaniac Date: 2010-08-29 23:49:31 +0000 (Sun, 29 Aug 2010) Log Message: ----------- control: simplify input argument check Modified Paths: -------------- trunk/octave-forge/main/control/inst/isdetectable.m trunk/octave-forge/main/control/inst/isstabilizable.m Modified: trunk/octave-forge/main/control/inst/isdetectable.m =================================================================== --- trunk/octave-forge/main/control/inst/isdetectable.m 2010-08-29 23:01:44 UTC (rev 7602) +++ trunk/octave-forge/main/control/inst/isdetectable.m 2010-08-29 23:49:31 UTC (rev 7603) @@ -40,21 +40,17 @@ function retval = isdetectable (a, c = [], tol = [], dflg = 0) - if (nargin < 1) + if (nargin < 1 || nargin > 4) print_usage (); - elseif (isa (a, "lti")) - ## system form - if (nargin == 2) - tol = c; - elseif (nargin > 2) + elseif (isa (a, "lti")) # system passed + if (nargin > 2) print_usage (); endif + tol = c; dflg = isdt (a); [a, b, c] = ssdata (a); - else - if (nargin > 4 || nargin == 1) - print_usage (); - endif + elseif (nargin == 1) # a,b arguments sent directly + print_usage (); endif retval = isstabilizable (a.', c.', tol, dflg); Modified: trunk/octave-forge/main/control/inst/isstabilizable.m =================================================================== --- trunk/octave-forge/main/control/inst/isstabilizable.m 2010-08-29 23:01:44 UTC (rev 7602) +++ trunk/octave-forge/main/control/inst/isstabilizable.m 2010-08-29 23:49:31 UTC (rev 7603) @@ -49,21 +49,17 @@ function retval = isstabilizable (a, b = [], tol = [], dflg = 0) - if (nargin < 1) + if (nargin < 1 || nargin > 4) print_usage (); elseif (isa (a, "lti")) # system passed - if (nargin == 2) - tol = b; # get tolerance - elseif (nargin > 2) + if (nargin > 2) print_usage (); endif - disc = isdt(a); + tol = b; + dflg = isdt (a); [a, b] = ssdata (a); - else # a,b arguments sent directly - if (nargin > 4 || nargin == 1) - print_usage (); - endif - disc = dflg; + elseif (nargin == 1) # a,b arguments sent directly + print_usage (); endif if (isempty (tol)) @@ -88,29 +84,29 @@ specflag = 0; for k = 1 : n - if (! disc) - ## Continuous time case - rL = real (L(k)); - if (rL >= 0) + if (dflg) + ## Discrete time case + rL = abs (L(k)); + if (rL >= 1) H = [eye(n)*L(k)-a, b]; f = (rank (H, tol) == n); if (f == 0) retval = 0; - if (rL == 0) - specflag = 1; + if (rL == 1) + specflag = 1; endif endif endif else - ## Discrete time case - rL = abs (L(k)); - if (rL >= 1) + ## Continuous time case + rL = real (L(k)); + if (rL >= 0) H = [eye(n)*L(k)-a, b]; f = (rank (H, tol) == n); if (f == 0) retval = 0; - if (rL == 1) - specflag = 1; + if (rL == 0) + specflag = 1; endif endif endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <par...@us...> - 2010-08-30 01:09:28
|
Revision: 7604 http://octave.svn.sourceforge.net/octave/?rev=7604&view=rev Author: paramaniac Date: 2010-08-30 01:09:22 +0000 (Mon, 30 Aug 2010) Log Message: ----------- control: add nested subsref (stuff like sys(1,1).num{1,1}(1)) and tests Modified Paths: -------------- trunk/octave-forge/main/control/inst/@lti/subsref.m trunk/octave-forge/main/control/inst/ltimodels.m Modified: trunk/octave-forge/main/control/inst/@lti/subsref.m =================================================================== --- trunk/octave-forge/main/control/inst/@lti/subsref.m 2010-08-29 23:49:31 UTC (rev 7603) +++ trunk/octave-forge/main/control/inst/@lti/subsref.m 2010-08-30 01:09:22 UTC (rev 7604) @@ -21,33 +21,37 @@ ## Author: Lukas Reichlin <luk...@gm...> ## Created: September 2009 -## Version: 0.1 +## Version: 0.2 -function ret = subsref (sys, s) +function a = subsref (a, s) if (isempty (s)) error ("lti: subsref: missing index"); endif - switch (s(1).type) - case "()" - idx = s(1).subs; - if (numel (idx) == 2) - ret = __sysprune__ (sys, idx{1}, idx{2}); - elseif (numel (idx) == 1) - ret = __freqresp__ (sys, idx{1}); - else - error ("lti: subsref: need one or two indices"); - endif + for k = 1 : numel (s) + if (isa (a, "lti")) + switch (s(k).type) + case "()" + idx = s(k).subs; + if (numel (idx) == 2) + a = __sysprune__ (a, idx{1}, idx{2}); + elseif (numel (idx) == 1) + a = __freqresp__ (a, idx{1}); + else + error ("lti: subsref: need one or two indices"); + endif + case "." + fld = s(k).subs; + a = get (a, fld); + ## warning ("lti: subsref: do not use subsref for development"); + otherwise + error ("lti: subsref: invalid subscript type"); + endswitch + else # not an LTI model + a = subsref (a, s(k:end)); + return; + endif + endfor - case "." - fld = s.subs; - ret = get (sys, fld); - ## warning ("lti: subsref: do not use subsref for development"); - - otherwise - error ("lti: subsref: invalid subscript type"); - - endswitch - endfunction \ No newline at end of file Modified: trunk/octave-forge/main/control/inst/ltimodels.m =================================================================== --- trunk/octave-forge/main/control/inst/ltimodels.m 2010-08-29 23:49:31 UTC (rev 7603) +++ trunk/octave-forge/main/control/inst/ltimodels.m 2010-08-30 01:09:22 UTC (rev 7604) @@ -222,3 +222,25 @@ %!assert (C.c, D.c); %!assert (C.d, D.d); +## tf: minreal +%!shared a, b, c, d +%! s = tf ("s"); +%! G1 = (s+1)*s*5/(s+1)/(s^2+s+1); +%! G2 = tf ([1, 1, 1], [2, 2, 2]); +%! G1min = minreal (G1); +%! G2min = minreal (G2); +%! a = G1min.num{1, 1}; +%! b = G1min.den{1, 1}; +%! c = G2min.num{1, 1}; +%! d = G2min.den{1, 1}; +%!assert (a, [5, 0], 1e-4); +%!assert (b, [1, 1, 1], 1e-4); +%!assert (c, 0.5, 1e-4); +%!assert (d, 1, 1e-4); + +## lti: subsref +%!shared a +%! s = tf ("s"); +%! G = (s+1)*s*5/(s+1)/(s^2+s+1); +%! a = G(1,1).num{1,1}(1); +%!assert (a, 5, 1e-4); \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <par...@us...> - 2010-08-30 10:19:17
|
Revision: 7606 http://octave.svn.sourceforge.net/octave/?rev=7606&view=rev Author: paramaniac Date: 2010-08-30 10:19:10 +0000 (Mon, 30 Aug 2010) Log Message: ----------- control: commit forgotten changes from previous revisions Modified Paths: -------------- trunk/octave-forge/main/control/inst/hinfsyn.m trunk/octave-forge/main/control/inst/isctrb.m trunk/octave-forge/main/control/inst/ltimodels.m Modified: trunk/octave-forge/main/control/inst/hinfsyn.m =================================================================== --- trunk/octave-forge/main/control/inst/hinfsyn.m 2010-08-30 08:13:17 UTC (rev 7605) +++ trunk/octave-forge/main/control/inst/hinfsyn.m 2010-08-30 10:19:10 UTC (rev 7606) @@ -77,7 +77,6 @@ ## Created: December 2009 ## Version: 0.1 -## TODO: find optimal instead of suboptimal controller ## TODO: improve compatibility for nargin >= 4 function [K, varargout] = hinfsyn (P, nmeas, ncon, gmax = 1e15) Modified: trunk/octave-forge/main/control/inst/isctrb.m =================================================================== --- trunk/octave-forge/main/control/inst/isctrb.m 2010-08-30 08:13:17 UTC (rev 7605) +++ trunk/octave-forge/main/control/inst/isctrb.m 2010-08-30 10:19:10 UTC (rev 7606) @@ -82,7 +82,9 @@ endif [Ac, Bc, U, ncont] = slab01od (A, B, tol); -U = U(:, 1:ncont); + + U = U(:, 1:ncont); + retval = (ncont == rows (A)); endfunction Modified: trunk/octave-forge/main/control/inst/ltimodels.m =================================================================== --- trunk/octave-forge/main/control/inst/ltimodels.m 2010-08-30 08:13:17 UTC (rev 7605) +++ trunk/octave-forge/main/control/inst/ltimodels.m 2010-08-30 10:19:10 UTC (rev 7606) @@ -243,4 +243,40 @@ %! s = tf ("s"); %! G = (s+1)*s*5/(s+1)/(s^2+s+1); %! a = G(1,1).num{1,1}(1); -%!assert (a, 5, 1e-4); \ No newline at end of file +%!assert (a, 5, 1e-4); + +## staircase (SLICOT AB01OD) +%!shared Ac, Bc, Ace, Bce +%! A = [ 17.0 24.0 1.0 8.0 15.0 +%! 23.0 5.0 7.0 14.0 16.0 +%! 4.0 6.0 13.0 20.0 22.0 +%! 10.0 12.0 19.0 21.0 3.0 +%! 11.0 18.0 25.0 2.0 9.0]; +%! +%! B = [ -1.0 -4.0 +%! 4.0 9.0 +%! -9.0 -16.0 +%! 16.0 25.0 +%! -25.0 -36.0]; +%! +%! tol = 0; +%! +%! A = A.'; # There's a little mistake in the example +%! # program of routine AB01OD in SLICOT 5.0 +%! +%! [Ac, Bc, U, ncont] = slab01od (A, B, tol); +%! +%! Ace = [ 12.8848 3.2345 11.8211 3.3758 -0.8982 +%! 4.4741 -12.5544 5.3509 5.9403 1.4360 +%! 14.4576 7.6855 23.1452 26.3872 -29.9557 +%! 0.0000 1.4805 27.4668 22.6564 -0.0072 +%! 0.0000 0.0000 -30.4822 0.6745 18.8680]; +%! +%! Bce = [ 31.1199 47.6865 +%! 3.2480 0.0000 +%! 0.0000 0.0000 +%! 0.0000 0.0000 +%! 0.0000 0.0000]; +%! +%!assert (Ac, Ace, 1e-4); +%!assert (Bc, Bce, 1e-4); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <par...@us...> - 2010-08-30 14:11:27
|
Revision: 7608 http://octave.svn.sourceforge.net/octave/?rev=7608&view=rev Author: paramaniac Date: 2010-08-30 14:11:21 +0000 (Mon, 30 Aug 2010) Log Message: ----------- contro: avoid unnecessary argument checking Modified Paths: -------------- trunk/octave-forge/main/control/inst/h2syn.m trunk/octave-forge/main/control/inst/hinfsyn.m trunk/octave-forge/main/control/inst/isctrb.m Modified: trunk/octave-forge/main/control/inst/h2syn.m =================================================================== --- trunk/octave-forge/main/control/inst/h2syn.m 2010-08-30 14:07:36 UTC (rev 7607) +++ trunk/octave-forge/main/control/inst/h2syn.m 2010-08-30 14:11:21 UTC (rev 7608) @@ -113,7 +113,7 @@ endif if (! isdetectable (P(p1+1 : p, :))) - error ("h2syn: (A, C2) must be detectable"); + error ("h2syn: (C2, A) must be detectable"); endif ## H-2 synthesis Modified: trunk/octave-forge/main/control/inst/hinfsyn.m =================================================================== --- trunk/octave-forge/main/control/inst/hinfsyn.m 2010-08-30 14:07:36 UTC (rev 7607) +++ trunk/octave-forge/main/control/inst/hinfsyn.m 2010-08-30 14:11:21 UTC (rev 7608) @@ -116,7 +116,7 @@ endif if (! isdetectable (P(p1+1 : p, :))) - error ("hinfsyn: (A, C2) must be detectable"); + error ("hinfsyn: (C2, A) must be detectable"); endif ## H-infinity synthesis Modified: trunk/octave-forge/main/control/inst/isctrb.m =================================================================== --- trunk/octave-forge/main/control/inst/isctrb.m 2010-08-30 14:07:36 UTC (rev 7607) +++ trunk/octave-forge/main/control/inst/isctrb.m 2010-08-30 14:11:21 UTC (rev 7608) @@ -67,6 +67,9 @@ [A, B] = ssdata (A); elseif (nargin < 2) # isctrb (A, B), isctrb (A, B, tol) print_usage (); + elseif (isempty (A) || isempty (B) || rows (A) != rows (B) || ! issquare (A)) + error ("isctrb: A(%dx%d), B(%dx%d)", + rows (A), columns (A), rows (B), columns (B)); endif ## check tol dimensions @@ -75,12 +78,6 @@ rows (tol), columns (tol)); endif - ## check dimensions compatibility - if (isempty (A) || isempty (B) || rows (A) != rows (B) || ! issquare (A)) - error ("isctrb: A(%dx%d), B(%dx%d)", - rows (A), columns (A), rows (B), columns (B)); - endif - [Ac, Bc, U, ncont] = slab01od (A, B, tol); U = U(:, 1:ncont); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <par...@us...> - 2010-08-30 16:40:04
|
Revision: 7609 http://octave.svn.sourceforge.net/octave/?rev=7609&view=rev Author: paramaniac Date: 2010-08-30 16:39:58 +0000 (Mon, 30 Aug 2010) Log Message: ----------- control: trim argument checking for ARE solvers Modified Paths: -------------- trunk/octave-forge/main/control/inst/care.m trunk/octave-forge/main/control/inst/dare.m Modified: trunk/octave-forge/main/control/inst/care.m =================================================================== --- trunk/octave-forge/main/control/inst/care.m 2010-08-30 14:11:21 UTC (rev 7608) +++ trunk/octave-forge/main/control/inst/care.m 2010-08-30 16:39:58 UTC (rev 7609) @@ -43,22 +43,17 @@ ## Author: Lukas Reichlin <luk...@gm...> ## Created: November 2009 -## Version: 0.2 +## Version: 0.3 function [x, l, g] = care (a, b, q, r, s = []) ## TODO: Add SLICOT SG02AD (Solution of continuous- or discrete-time ## algebraic Riccati equations for descriptor systems) - ## TODO: Check stabilizability and controllability more elegantly - ## (without incorporating cross terms into a and q) - if (nargin < 4 || nargin > 5) print_usage (); endif - [brows, bcols] = size (b); - if (! issquare (a)) error ("care: a is not square"); endif @@ -71,50 +66,35 @@ error ("care: r is not square"); endif - if (rows (a) != brows) - error ("care: a, b are not conformable"); + if (rows (a) != rows (b)) + error ("care: (a, b) not conformable"); endif - if (columns (r) != bcols) - error ("care: b, r are not conformable"); + if (columns (r) != columns (b)) + error ("care: (b, r) not conformable"); endif - ## incorporate cross term into a and q - if (isempty (s)) - ao = a; - qo = q; - else - [srows, scols] = size (s); % [n2, m2] - - if (srows != brows || scols != bcols) - error ("care: s (%dx%d) must be identically dimensioned with b (%dx%d)", - srows, scols, brows, bcols); - endif - - ao = a - (b/r)*s.'; - qo = q - (s/r)*s.'; + if (! isempty (s) && any (size (s) != size (b))) + error ("care: s (%dx%d) must be identically dimensioned with b (%dx%d)", + rows (s), columns (s), rows (b), columns (b)); endif ## check stabilizability - if (! isstabilizable (ao, b, [], 0)) - error ("care: a and b not stabilizable"); + if (! isstabilizable (a, b, [], 0)) + error ("care: (a, b) not stabilizable"); endif - ## check detectability - dflag = isdetectable (ao, qo, [], 0); - - if (dflag == 0) - warning ("care: (a,q) not detectable"); - elseif (dflag == -1) - error ("care: (a,q) has poles on imaginary axis"); + ## check positive semi-definiteness + if (isempty (s)) + t = zeros (size (b)); + else + t = s; endif - ## to allow lqe design, don't force - ## qo to be positive semi-definite + m = [q, t; t.', r]; - ## checking positive definiteness - if (isdefinite (r) <= 0) - error ("care: r must be positive definite"); + if (isdefinite (m) < 0) + error ("care: require [q, s; s.', r] >= 0"); endif ## solve the riccati equation Modified: trunk/octave-forge/main/control/inst/dare.m =================================================================== --- trunk/octave-forge/main/control/inst/dare.m 2010-08-30 14:11:21 UTC (rev 7608) +++ trunk/octave-forge/main/control/inst/dare.m 2010-08-30 16:39:58 UTC (rev 7609) @@ -43,22 +43,17 @@ ## Author: Lukas Reichlin <luk...@gm...> ## Created: October 2009 -## Version: 0.2 +## Version: 0.3 function [x, l, g] = dare (a, b, q, r, s = []) ## TODO: Add SLICOT SG02AD (Solution of continuous- or discrete-time ## algebraic Riccati equations for descriptor systems) - ## TODO: Check stabilizability and controllability more elegantly - ## (without incorporating cross terms into a and q) - if (nargin < 4 || nargin > 5) print_usage (); endif - [brows, bcols] = size (b); - if (! issquare (a)) error ("dare: a is not square"); endif @@ -71,50 +66,35 @@ error ("dare: r is not square"); endif - if (rows (a) != brows) - error ("dare: a, b are not conformable"); + if (rows (a) != rows (b)) + error ("dare: (a, b) not conformable"); endif - if (columns (r) != bcols) - error ("dare: b, r are not conformable"); + if (columns (r) != columns (b)) + error ("dare: (b, r) not conformable"); endif - ## incorporate cross term into a and q - if (isempty (s)) - ao = a; - qo = q; - else - [srows, scols] = size (s); % [n2, m2] - - if (srows != brows || scols != bcols) - error ("dare: s (%dx%d) must be identically dimensioned with b (%dx%d)", - srows, scols, brows, bcols); - endif - - ao = a - (b/r)*s.'; - qo = q - (s/r)*s.'; + if (! isempty (s) && any (size (s) != size (b))) + error ("dare: s (%dx%d) must be identically dimensioned with b (%dx%d)", + rows (s), columns (s), rows (b), columns (b)); endif ## check stabilizability - if (! isstabilizable (ao, b, [], 1)) - error ("dare: a and b not stabilizable"); + if (! isstabilizable (a, b, [], 1)) + error ("dare: (a, b) not stabilizable"); endif - ## check detectability - dflag = isdetectable (ao, qo, [], 1); - - if (dflag == 0) - warning ("dare: (a,q) not detectable"); - elseif (dflag == -1) - error ("dare: (a,q) has non-minimal modes near unit circle"); + ## check positive semi-definiteness + if (isempty (s)) + t = zeros (size (b)); + else + t = s; endif - ## to allow lqe design, don't force - ## qo to be positive semi-definite + m = [q, t; t.', r]; - ## checking positive definiteness - if (isdefinite (r) <= 0) - error ("dare: r must be positive definite"); + if (isdefinite (m) < 0) + error ("dare: require [q, s; s.', r] >= 0"); endif ## solve the riccati equation This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <par...@us...> - 2010-08-30 18:23:46
|
Revision: 7610 http://octave.svn.sourceforge.net/octave/?rev=7610&view=rev Author: paramaniac Date: 2010-08-30 18:23:40 +0000 (Mon, 30 Aug 2010) Log Message: ----------- control: revamp isstabilizable.m and isdetectable.m Modified Paths: -------------- trunk/octave-forge/main/control/inst/isdetectable.m trunk/octave-forge/main/control/inst/isstabilizable.m Modified: trunk/octave-forge/main/control/inst/isdetectable.m =================================================================== --- trunk/octave-forge/main/control/inst/isdetectable.m 2010-08-30 16:39:58 UTC (rev 7609) +++ trunk/octave-forge/main/control/inst/isdetectable.m 2010-08-30 18:23:40 UTC (rev 7610) @@ -17,17 +17,41 @@ ## <http://www.gnu.org/licenses/>. ## -*- texinfo -*- -## @deftypefn {Function File} {@var{retval} =} isdetectable (@var{a}, @var{c}, @var{tol}, @var{dflg}) +## @deftypefn {Function File} {@var{retval} =} isdetectable (@var{sys}) ## @deftypefnx {Function File} {@var{retval} =} isdetectable (@var{sys}, @var{tol}) -## Test for detectability (observability of unstable modes) of (@var{a}, @var{c}). +## @deftypefnx {Function File} {@var{retval} =} isdetectable (@var{a}, @var{c}) +## @deftypefnx {Function File} {@var{retval} =} isdetectable (@var{a}, @var{c}, @var{tol}) +## @deftypefnx {Function File} {@var{retval} =} isdetectable (@var{a}, @var{c}, @var{[]}, @var{dflg}) +## @deftypefnx {Function File} {@var{retval} =} isdetectable (@var{a}, @var{c}, @var{tol}, @var{dflg}) +## Logical test for system detectability (observability of unstable modes). ## -## Returns 1 if the system @var{a} or the pair (@var{a}, @var{c}) is -## detectable, 0 if not, and -1 if the system has unobservable modes at the -## imaginary axis (unit circle for discrete-time systems). +## @strong{Inputs} +## @table @var +## @item sys +## LTI system. +## @item a +## State transition matrix. +## @item c +## Measurement matrix. +## @item tol +## Optional tolerance for stability. Default value is 0. +## @item dflg = 0 +## Matrices (a, c) are part of a continuous-time system. Default Value. +## @item dflg = 1 +## Matrices (a, c) are part of a discrete-time system. +## @end table ## -## @strong{See} @command{is_stabilizable} for detailed description of +## @strong{Outputs} +## @table @var +## @item retval = 0 +## System is not detectable. +## @item retval = 1 +## System is detectable. +## @end table +## +## See @command{isstabilizable} for detailed description of ## arguments and computational method. -## @seealso{isstabilizable, size, rows, columns, length, ismatrix, isscalar, isvector} +## @seealso{isstabilizable, isstable, isctrb, isobsv} ## @end deftypefn ## Author: A. S. Hodel <a.s...@en...> @@ -36,7 +60,7 @@ ## Adapted-By: Lukas Reichlin <luk...@gm...> ## Date: October 2009 -## Version: 0.1 +## Version: 0.2 function retval = isdetectable (a, c = [], tol = [], dflg = 0) @@ -49,8 +73,8 @@ tol = c; dflg = isdt (a); [a, b, c] = ssdata (a); - elseif (nargin == 1) # a,b arguments sent directly - print_usage (); + elseif (nargin == 1) # a,c arguments sent directly + print_usage (); # a,c dimension checked inside isstabilizable endif retval = isstabilizable (a.', c.', tol, dflg); Modified: trunk/octave-forge/main/control/inst/isstabilizable.m =================================================================== --- trunk/octave-forge/main/control/inst/isstabilizable.m 2010-08-30 16:39:58 UTC (rev 7609) +++ trunk/octave-forge/main/control/inst/isstabilizable.m 2010-08-30 18:23:40 UTC (rev 7610) @@ -17,24 +17,50 @@ ## <http://www.gnu.org/licenses/>. ## -*- texinfo -*- -## @deftypefn {Function File} {@var{retval} =} isstabilizable (@var{sys}, @var{tol}) +## @deftypefn {Function File} {@var{retval} =} isstabilizable (@var{sys}) +## @deftypefnx {Function File} {@var{retval} =} isstabilizable (@var{sys}, @var{tol}) +## @deftypefnx {Function File} {@var{retval} =} isstabilizable (@var{a}, @var{b}) +## @deftypefnx {Function File} {@var{retval} =} isstabilizable (@var{a}, @var{b}, @var{tol}) +## @deftypefnx {Function File} {@var{retval} =} isstabilizable (@var{a}, @var{b}, @var{[]}, @var{dflg}) ## @deftypefnx {Function File} {@var{retval} =} isstabilizable (@var{a}, @var{b}, @var{tol}, @var{dflg}) -## Logical check for system stabilizability (i.e., all unstable modes are controllable). -## Returns 1 if the system is stabilizable, 0 if the system is not stabilizable, -1 -## if the system has non stabilizable modes at the imaginary axis (unit circle for -## discrete-time systems. +## Logical check for system stabilizability (i.e., all unstable modes are controllable). ## -## Test for stabilizability is performed via Hautus Lemma. If -## @iftex -## @tex -## @var{dflg}$\neq$0 -## @end tex -## @end iftex -## @ifinfo -## @var{dflg}!=0 -## @end ifinfo -## assume that discrete-time matrices (a,b) are supplied. -## @seealso{size, rows, columns, length, ismatrix, isscalar, isvector, is_observable, is_stabilizable, is_detectable} +## @strong{Inputs} +## @table @var +## @item sys +## LTI system. +## @item a +## State transition matrix. +## @item b +## Input matrix. +## @item tol +## Optional tolerance for stability. Default value is 0. +## @item dflg = 0 +## Matrices (a, b) are part of a continuous-time system. Default Value. +## @item dflg = 1 +## Matrices (a, b) are part of a discrete-time system. +## @end table +## +## @strong{Outputs} +## @table @var +## @item retval = 0 +## System is not stabilizable. +## @item retval = 1 +## System is stabilizable. +## @end table +## +## @example +## @group +## Method +## - Calculate staircase form (SLICOT AB01OD) +## - Extract unobservable part of state transition matrix +## - Calculate eigenvalues of unobservable part +## - Check whether +## real (ev) < -tol*(1 + abs (ev)) continuous-time +## abs (ev) < 1 - tol discrete-time +## @end group +## @end example +## @seealso{isdetectable, isstable, isctrb, isobsv} ## @end deftypefn ## Author: A. S. Hodel <a.s...@en...> @@ -42,10 +68,9 @@ ## Updated by A. S. Hodel (sc...@en...) Aubust, 1995 to use krylovb ## Updated by John Ingram (in...@en...) July, 1996 to accept systems -## FIXME: where has the version which uses krylovb gone? ## Adapted-By: Lukas Reichlin <luk...@gm...> ## Date: October 2009 -## Version: 0.1 +## Version: 0.2 function retval = isstabilizable (a, b = [], tol = [], dflg = 0) @@ -60,63 +85,29 @@ [a, b] = ssdata (a); elseif (nargin == 1) # a,b arguments sent directly print_usage (); + elseif (! issquare (a) || rows (a) != rows (b)) + error ("isstabilizable: a must be square and conformal to b") endif if (isempty (tol)) - tol = 200 * eps; + tol = 0; endif - ## Checking dimensions - n = rows (a); - [nr, m] = size (b); + ## controllability staircase form + [ac, bc, u, ncont] = slab01od (a, b, tol); - if (! issquare (a)) - error ("isstabilizable: a must be square"); - endif - - if (nr != n) - error ("isstabilizable: (a,b) not conformal"); - endif - - ## Computing the eigenvalue of A - L = eig (a); - retval = 1; - specflag = 0; + ## extract uncontrollable part of staircase form + uncont_idx = ncont+1 : rows (a); + auncont = ac(uncont_idx, uncont_idx); - for k = 1 : n - if (dflg) - ## Discrete time case - rL = abs (L(k)); - if (rL >= 1) - H = [eye(n)*L(k)-a, b]; - f = (rank (H, tol) == n); - if (f == 0) - retval = 0; - if (rL == 1) - specflag = 1; - endif - endif - endif - else - ## Continuous time case - rL = real (L(k)); - if (rL >= 0) - H = [eye(n)*L(k)-a, b]; - f = (rank (H, tol) == n); - if (f == 0) - retval = 0; - if (rL == 0) - specflag = 1; - endif - endif - endif - endif - endfor + ## calculate poles of uncontrollable part + eigw = eig (auncont); - if (specflag == 1) - ## This means that the system has uncontrollable modes at the imaginary axis - ## (or at the unit circle for discrete time systems) - retval = -1; + ## check whether uncontrollable poles are stable + if (dflg) + retval = all (abs (eigw) < 1 - tol); + else + retval = all (real (eigw) < -tol*(1 + abs (eigw))); endif endfunction This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <par...@us...> - 2010-08-31 00:36:57
|
Revision: 7613 http://octave.svn.sourceforge.net/octave/?rev=7613&view=rev Author: paramaniac Date: 2010-08-31 00:36:50 +0000 (Tue, 31 Aug 2010) Log Message: ----------- control: improve argument checking, include forgotten tests Modified Paths: -------------- trunk/octave-forge/main/control/inst/ctrb.m trunk/octave-forge/main/control/inst/obsv.m trunk/octave-forge/main/control/inst/test_control.m Modified: trunk/octave-forge/main/control/inst/ctrb.m =================================================================== --- trunk/octave-forge/main/control/inst/ctrb.m 2010-08-30 20:24:38 UTC (rev 7612) +++ trunk/octave-forge/main/control/inst/ctrb.m 2010-08-31 00:36:50 UTC (rev 7613) @@ -26,15 +26,17 @@ ## Created: November 4, 1997 ## based on is_controllable.m of Scottedward Hodel -function co = ctrb (sys_or_a, b) +function co = ctrb (a, b) - if (nargin == 1) - [a, b] = ssdata (sys_or_a); - elseif (nargin == 2) - a = sys_or_a; + if (nargin == 1) # ctrb (sys) + if (! isa (a, "lti")) + error ("ctrb: argument must be an lti system"); + endif + [a, b] = ssdata (a); + elseif (nargin == 2) # ctrb (a, b) if (! isnumeric (a) || ! isnumeric (b) || - rows(a) != rows (b) || ! issquare (a)) - error ("ctrb: invalid arguments"); + rows (a) != rows (b) || ! issquare (a)) + error ("ctrb: invalid arguments (a, b)"); endif else print_usage (); Modified: trunk/octave-forge/main/control/inst/obsv.m =================================================================== --- trunk/octave-forge/main/control/inst/obsv.m 2010-08-30 20:24:38 UTC (rev 7612) +++ trunk/octave-forge/main/control/inst/obsv.m 2010-08-31 00:36:50 UTC (rev 7613) @@ -26,15 +26,17 @@ ## Author: Kai P. Mueller <mu...@if...> ## Created: November 4, 1997 -function ob = obsv (sys_or_a, c) +function ob = obsv (a, c) - if (nargin == 1) - [a, b, c] = ssdata (sys_or_a); - elseif (nargin == 2) - a = sys_or_a; + if (nargin == 1) # obsv (sys) + if (! isa (a, "lti")) + error ("obsv: argument must be an lti system"); + endif + [a, b, c] = ssdata (a); + elseif (nargin == 2) # obsv (a, c) if (! isnumeric (a) || ! isnumeric (c) || - columns(a) != columns (c) || ! issquare (a)) - error ("obsv: invalid arguments"); + columns (a) != columns (c) || ! issquare (a)) + error ("obsv: invalid arguments (a, c)"); endif else print_usage (); Modified: trunk/octave-forge/main/control/inst/test_control.m =================================================================== --- trunk/octave-forge/main/control/inst/test_control.m 2010-08-30 20:24:38 UTC (rev 7612) +++ trunk/octave-forge/main/control/inst/test_control.m 2010-08-31 00:36:50 UTC (rev 7613) @@ -22,21 +22,33 @@ ## Author: Lukas Reichlin <luk...@gm...> ## Created: May 2010 -## Version: 0.1 +## Version: 0.2 +## test collection test ltimodels + +## robust control test hinfsyn test h2syn -test place + +## ARE solvers test care +## test dare # TODO: add missing test +test kalman -test kalman +## Lyapunov test lyap test dlyap test gram test covar +## various oct-files +test place +test hsvd + +## various m-files test margin test sigma test initial -test hsvd \ No newline at end of file +test ctrb +test obsv \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <par...@us...> - 2010-08-31 13:34:57
|
Revision: 7614 http://octave.svn.sourceforge.net/octave/?rev=7614&view=rev Author: paramaniac Date: 2010-08-31 13:06:08 +0000 (Tue, 31 Aug 2010) Log Message: ----------- control: improve error checking Modified Paths: -------------- trunk/octave-forge/main/control/inst/@lti/set.m trunk/octave-forge/main/control/inst/@ss/ss.m trunk/octave-forge/main/control/inst/@tf/tf.m trunk/octave-forge/main/control/inst/__ssmatdim__.m trunk/octave-forge/main/control/inst/gensig.m trunk/octave-forge/main/control/inst/issample.m Modified: trunk/octave-forge/main/control/inst/@lti/set.m =================================================================== --- trunk/octave-forge/main/control/inst/@lti/set.m 2010-08-31 00:36:50 UTC (rev 7613) +++ trunk/octave-forge/main/control/inst/@lti/set.m 2010-08-31 13:06:08 UTC (rev 7614) @@ -47,9 +47,7 @@ else # sys = set (sys, "prop1", val1, ...) - n = (nargin-1) / 2; - - if (n != round (n)) + if (rem (nargin-1, 2)) error ("lti: set: properties and values must come in pairs"); endif @@ -79,7 +77,6 @@ otherwise sys = __set__ (sys, prop, val); - endswitch endfor Modified: trunk/octave-forge/main/control/inst/@ss/ss.m =================================================================== --- trunk/octave-forge/main/control/inst/@ss/ss.m 2010-08-31 00:36:50 UTC (rev 7613) +++ trunk/octave-forge/main/control/inst/@ss/ss.m 2010-08-31 13:06:08 UTC (rev 7614) @@ -1,4 +1,4 @@ -## Copyright (C) 2009 Lukas F. Reichlin +## Copyright (C) 2009 - 2010 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## @@ -25,9 +25,9 @@ ## Author: Lukas Reichlin <luk...@gm...> ## Created: September 2009 -## Version: 0.1 +## Version: 0.2 -function sys = ss (a, b, c, d, varargin) +function sys = ss (a = [], b = [], c = [], d = [], varargin) ## model precedence: frd > ss > zpk > tf > double %inferiorto ("frd"); @@ -36,12 +36,8 @@ argc = 0; switch (nargin) - case 0 - a = []; - b = []; - c = []; - d = []; - tsam = -1; + case 0 # ss () + ## tsam = -1; # noting is done here, but "case 0" needed to prevent "otherwise" case 1 if (isa (a, "ss")) # already in ss form @@ -56,7 +52,7 @@ a = []; b = zeros (0, columns (d)); c = zeros (rows (d), 0); - tsam = -1; + ## tsam = -1; else print_usage (); endif @@ -64,13 +60,13 @@ case 2 print_usage (); - case 3 # a, b, c without d + case 3 # a, b, c without d ss (a, b, c) d = zeros (rows (c), columns (b)); tsam = 0; - case 4 # continuous system - tsam = 0; + case 4 # continuous system ss (a, b, c, d), ss ([], [], [], d) [b, c] = __gaincheck__ (b, c, d); + tsam = 0; otherwise # default case [b, c] = __gaincheck__ (b, c, d); @@ -79,7 +75,6 @@ if (issample (varargin{1}, 1)) # sys = ss (a, b, c, d, tsam, "prop1, "val1", ...) tsam = varargin{1}; argc--; - if (argc > 0) varargin = varargin(2:end); endif @@ -94,17 +89,15 @@ tsam = -1; endif - [nu, nx, ny] = __ssmatdim__ (a, b, c, d); + [m, n, p] = __ssmatdim__ (a, b, c, d); - stname = repmat ({""}, nx, 1); + stname = repmat ({""}, n, 1); - ssdata = struct ("a", a, - "b", b, - "c", c, - "d", d, + ssdata = struct ("a", a, "b", b, + "c", c, "d", d, "stname", {stname}); - ltisys = lti (ny, nu, tsam); + ltisys = lti (p, m, tsam); sys = class (ssdata, "ss", ltisys); @@ -118,6 +111,7 @@ function [b, c] = __gaincheck__ (b, c, d) ## catch the case sys = ss ([], [], [], d) + ## don't forget to set tsam = -1 if (isempty (b) && isempty (c)) b = zeros (0, columns (d)); c = zeros (rows(d), 0); Modified: trunk/octave-forge/main/control/inst/@tf/tf.m =================================================================== --- trunk/octave-forge/main/control/inst/@tf/tf.m 2010-08-31 00:36:50 UTC (rev 7613) +++ trunk/octave-forge/main/control/inst/@tf/tf.m 2010-08-31 13:06:08 UTC (rev 7614) @@ -1,4 +1,4 @@ -## Copyright (C) 2009 Lukas F. Reichlin +## Copyright (C) 2009 - 2010 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## @@ -25,9 +25,9 @@ ## Author: Lukas Reichlin <luk...@gm...> ## Created: September 2009 -## Version: 0.1 +## Version: 0.2 -function sys = tf (num, den, varargin) +function sys = tf (num = {}, den = {}, varargin) ## model precedence: frd > ss > zpk > tf > double %inferiorto ("frd", "ss", "zpk"); # error if de-commented. bug in octave? @@ -37,8 +37,6 @@ switch (nargin) case 0 - num = {}; - den = {}; tsam = -1; tfvar = "x"; # undefined Modified: trunk/octave-forge/main/control/inst/__ssmatdim__.m =================================================================== --- trunk/octave-forge/main/control/inst/__ssmatdim__.m 2010-08-31 00:36:50 UTC (rev 7613) +++ trunk/octave-forge/main/control/inst/__ssmatdim__.m 2010-08-31 13:06:08 UTC (rev 7614) @@ -16,23 +16,23 @@ ## along with this program. If not, see <http://www.gnu.org/licenses/>. ## -*- texinfo -*- -## Number of inputs, states and outputs of state space matrices. +## Number of inputs (m), states (n) and outputs (p) of state space matrices. ## For internal use only. ## Author: Lukas Reichlin <luk...@gm...> ## Created: September 2009 ## Version: 0.1 -function [nu, nx, ny] = __ssmatdim__ (a, b, c, d) +function [m, n, p] = __ssmatdim__ (a, b, c, d) [arows, acols] = size (a); [brows, bcols] = size (b); [crows, ccols] = size (c); [drows, dcols] = size (d); - nu = bcols; # = dcols - nx = arows; # = acols - ny = crows; # = drows + m = bcols; # = dcols + n = arows; # = acols + p = crows; # = drows if (! issquare (a) && ! isempty (a)) error ("ss: system matrix a(%dx%d) is not square", arows, acols); Modified: trunk/octave-forge/main/control/inst/gensig.m =================================================================== --- trunk/octave-forge/main/control/inst/gensig.m 2010-08-31 00:36:50 UTC (rev 7613) +++ trunk/octave-forge/main/control/inst/gensig.m 2010-08-31 13:06:08 UTC (rev 7614) @@ -1,4 +1,4 @@ -## Copyright (C) 2009 Lukas F. Reichlin +## Copyright (C) 2009 - 2010 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## @@ -52,7 +52,7 @@ ## Author: Lukas Reichlin <luk...@gm...> ## Created: August 2009 -## Version: 0.1 +## Version: 0.2 function [u, t] = gensig (sigtype, tau, tfinal, tsam) @@ -64,12 +64,20 @@ error ("gensig: first argument must be a string"); endif + if (! issample (tau)) + error ("gensig: second argument is not a valid period"); + endif + if (nargin < 3) tfinal = 5 * tau; + elseif (! issample (tfinal)) + error ("gensig: third argument is not a valid final time"); endif if (nargin < 4) tsam = tau / 64; + elseif (! issample (tsam)) + error ("gensig: fourth argument is not a valid sampling time"); endif t = (0 : tsam : tfinal).'; @@ -84,7 +92,7 @@ case "pu" u = rem (t, tau) < (1 - 1000*eps) * tsam; otherwise - error ("gensig: invalid signal type"); + error ("gensig: ""%s"" is an invalid signal type", sigtype); endswitch endfunction Modified: trunk/octave-forge/main/control/inst/issample.m =================================================================== --- trunk/octave-forge/main/control/inst/issample.m 2010-08-31 00:36:50 UTC (rev 7613) +++ trunk/octave-forge/main/control/inst/issample.m 2010-08-31 13:06:08 UTC (rev 7614) @@ -16,8 +16,10 @@ ## -*- texinfo -*- ## @deftypefn {Function File} {} issample (@var{ts}) +## @deftypefnx {Function File} {} issample (@var{ts}, @var{-1}) ## Return true if @var{ts} is a valid sampling time -## (real, scalar, > 0). +## (real, scalar, > 0). If a second argument != 0 +## is passed, -1 becomes a valid sample time as well. ## @end deftypefn ## Author: A. S. Hodel <a.s...@en...> @@ -25,7 +27,7 @@ ## Adapted-By: Lukas Reichlin <luk...@gm...> ## Date: September 2009 -## Version: 0.1 +## Version: 0.2 function bool = issample (tsam, flg = 0) @@ -34,9 +36,9 @@ endif if (flg) - bool = (isscalar (tsam) && (tsam >= 0 || tsam == -1)); + bool = (isnumeric (tsam) && isscalar (tsam) && (tsam >= 0 || tsam == -1)); else - bool = (isscalar (tsam) && (tsam == abs (tsam)) && (tsam != 0)); + bool = (isnumeric (tsam) && isscalar (tsam) && (tsam == abs (tsam)) && (tsam != 0)); endif endfunction This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <par...@us...> - 2010-08-31 15:21:38
|
Revision: 7615 http://octave.svn.sourceforge.net/octave/?rev=7615&view=rev Author: paramaniac Date: 2010-08-31 14:51:02 +0000 (Tue, 31 Aug 2010) Log Message: ----------- control: exterminate nasty bugs, add tests just to be on the safe side Modified Paths: -------------- trunk/octave-forge/main/control/inst/issample.m trunk/octave-forge/main/control/inst/test_control.m Modified: trunk/octave-forge/main/control/inst/issample.m =================================================================== --- trunk/octave-forge/main/control/inst/issample.m 2010-08-31 13:06:08 UTC (rev 7614) +++ trunk/octave-forge/main/control/inst/issample.m 2010-08-31 14:51:02 UTC (rev 7615) @@ -16,10 +16,10 @@ ## -*- texinfo -*- ## @deftypefn {Function File} {} issample (@var{ts}) -## @deftypefnx {Function File} {} issample (@var{ts}, @var{-1}) +## @deftypefnx {Function File} {} issample (@var{ts}, @var{flg}) ## Return true if @var{ts} is a valid sampling time ## (real, scalar, > 0). If a second argument != 0 -## is passed, -1 becomes a valid sample time as well. +## is passed, -1 and 0 become valid sample times as well. ## @end deftypefn ## Author: A. S. Hodel <a.s...@en...> @@ -35,10 +35,33 @@ print_usage (); endif - if (flg) - bool = (isnumeric (tsam) && isscalar (tsam) && (tsam >= 0 || tsam == -1)); - else - bool = (isnumeric (tsam) && isscalar (tsam) && (tsam == abs (tsam)) && (tsam != 0)); + if (flg == 0) # allow -1 and 0 + bool = (isnumeric (tsam) && isscalar (tsam) && \ + (! iscomplex (tsam)) && (tsam > 0)); + else # refuse -1 and 0 + bool = (isnumeric (tsam) && isscalar (tsam) && \ + (! iscomplex (tsam)) && (tsam >= 0 || tsam == -1)); endif endfunction + + +## flg == 0 +%!assert (issample (1), true) +%!assert (issample (pi), true) +%!assert (issample (0), false) +%!assert (issample (-1), false) +%!assert (issample (-1, 0), false) +%!assert (issample ("a"), false) +%!assert (issample (eye (2)), false) +%!assert (issample (2+2i), false) + +## flg != 0 +%!assert (issample (-1, 1), true) +%!assert (issample (-1, -1), true) +%!assert (issample (pi, 1), true) +%!assert (issample (0, 1), true) +%!assert (issample ("b", 1), false) +%!assert (issample (-1, "ab"), true) +%!assert (issample (rand (3,2), 1), false) +%!assert (issample (2+2i, 1), false) Modified: trunk/octave-forge/main/control/inst/test_control.m =================================================================== --- trunk/octave-forge/main/control/inst/test_control.m 2010-08-31 13:06:08 UTC (rev 7614) +++ trunk/octave-forge/main/control/inst/test_control.m 2010-08-31 14:51:02 UTC (rev 7615) @@ -51,4 +51,5 @@ test sigma test initial test ctrb -test obsv \ No newline at end of file +test obsv +test issample \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <par...@us...> - 2010-09-03 12:32:38
|
Revision: 7646 http://octave.svn.sourceforge.net/octave/?rev=7646&view=rev Author: paramaniac Date: 2010-09-03 12:32:32 +0000 (Fri, 03 Sep 2010) Log Message: ----------- control: doc Modified Paths: -------------- trunk/octave-forge/main/control/inst/lqr.m trunk/octave-forge/main/control/inst/sigma.m Modified: trunk/octave-forge/main/control/inst/lqr.m =================================================================== --- trunk/octave-forge/main/control/inst/lqr.m 2010-09-03 11:16:27 UTC (rev 7645) +++ trunk/octave-forge/main/control/inst/lqr.m 2010-09-03 12:32:32 UTC (rev 7646) @@ -20,8 +20,8 @@ ## @deftypefnx {Function File} {[@var{g}, @var{x}, @var{l}] =} lqr (@var{sys}, @var{q}, @var{r}, @var{s}) ## @deftypefnx {Function File} {[@var{g}, @var{x}, @var{l}] =} lqr (@var{a}, @var{b}, @var{q}, @var{r}) ## @deftypefnx {Function File} {[@var{g}, @var{x}, @var{l}] =} lqr (@var{a}, @var{b}, @var{q}, @var{r}, @var{s}) -## Return linear-quadratic state-feedback gain matrix g for a LTI system as well as -## the solution x of the associated riccati equation and the closed-loop poles l. +## Linear-quadratic regulator. Return linear-quadratic state-feedback gain matrix g for a LTI system +## as well as the solution x of the associated riccati equation and the closed-loop poles l. ## @seealso{care, dare} ## @end deftypefn Modified: trunk/octave-forge/main/control/inst/sigma.m =================================================================== --- trunk/octave-forge/main/control/inst/sigma.m 2010-09-03 11:16:27 UTC (rev 7645) +++ trunk/octave-forge/main/control/inst/sigma.m 2010-09-03 12:32:32 UTC (rev 7646) @@ -20,10 +20,9 @@ ## @deftypefnx{Function File} {[@var{sv}, @var{w}] =} sigma (@var{sys}, @var{w}) ## @deftypefnx{Function File} {[@var{sv}, @var{w}] =} sigma (@var{sys}, @var{[]}, @var{ptype}) ## @deftypefnx{Function File} {[@var{sv}, @var{w}] =} sigma (@var{sys}, @var{w}, @var{ptype}) -## If no output arguments are given, the singular value plot of a MIMO -## system is printed on the screen; -## otherwise, the singular values of the LTI system are -## computed and returned. +## Singular values of frequency response. If no output arguments are given, +## the singular value plot of a MIMO system is printed on the screen; +## otherwise, the singular values of the LTI system are computed and returned. ## ## @strong{Inputs} ## @table @var @@ -31,7 +30,7 @@ ## LTI system. ## @item w ## Optional vector of frequency values. If @var{w} is not specified, it -## will be calculated by the zeros and poles of the system. +## is calculated by the zeros and poles of the system. ## @item ptype = 0 ## Singular values of the frequency response H of system sys. Default Value. ## @item ptype = 1 This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <par...@us...> - 2010-09-04 17:30:49
|
Revision: 7649 http://octave.svn.sourceforge.net/octave/?rev=7649&view=rev Author: paramaniac Date: 2010-09-04 17:30:43 +0000 (Sat, 04 Sep 2010) Log Message: ----------- control: upgrade texinfo strings of time response functions Modified Paths: -------------- trunk/octave-forge/main/control/inst/impulse.m trunk/octave-forge/main/control/inst/initial.m trunk/octave-forge/main/control/inst/lsim.m trunk/octave-forge/main/control/inst/step.m Modified: trunk/octave-forge/main/control/inst/impulse.m =================================================================== --- trunk/octave-forge/main/control/inst/impulse.m 2010-09-04 13:45:06 UTC (rev 7648) +++ trunk/octave-forge/main/control/inst/impulse.m 2010-09-04 17:30:43 UTC (rev 7649) @@ -21,6 +21,35 @@ ## @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} impulse (@var{sys}, @var{tfinal}) ## @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} impulse (@var{sys}, @var{tfinal}, @var{dt}) ## Impulse response of LTI system. +## If no output arguments are given, the response is printed on the screen. +## +## @strong{Inputs} +## @table @var +## @item sys +## LTI model. +## @item t +## Time vector. Should be evenly spaced. If not specified, it is calculated by +## the poles of the system to reflect adequately the response transients. +## @item tfinal +## Optional simulation horizon. If not specified, it is calculated by +## the poles of the system to reflect adequately the response transients. +## @item dt +## Optional sampling time. Be sure to choose it small enough to capture transient +## phenomena. If not specified, it is calculated by the poles of the system. +## @end table +## +## @strong{Outputs} +## @table @var +## @item y +## Output response array. Has as many rows as time samples (length of t) +## and as many columns as outputs. +## @item t +## Time row vector. +## @item x +## State trajectories array. Has length(t) rows and as many columns as states. +## @end table +## +## @seealso{initial, lsim, step} ## @end deftypefn ## Author: Lukas Reichlin <luk...@gm...> Modified: trunk/octave-forge/main/control/inst/initial.m =================================================================== --- trunk/octave-forge/main/control/inst/initial.m 2010-09-04 13:45:06 UTC (rev 7648) +++ trunk/octave-forge/main/control/inst/initial.m 2010-09-04 17:30:43 UTC (rev 7649) @@ -21,8 +21,7 @@ ## @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} initial (@var{sys}, @var{x0}, @var{tfinal}) ## @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} initial (@var{sys}, @var{x0}, @var{tfinal}, @var{dt}) ## Initial condition response of state-space model. -## If no output arguments are given, the response is printed on the screen; -## otherwise, the response is computed and returned. +## If no output arguments are given, the response is printed on the screen. ## ## @strong{Inputs} ## @table @var @@ -30,12 +29,15 @@ ## State-space model. ## @item x0 ## Vector of initial conditions for each state. +## @item t +## Optional time vector. Should be evenly spaced. If not specified, it is calculated +## by the poles of the system to reflect adequately the response transients. ## @item tfinal -## Optional simulation horizon. If not specified, it will be calculated by +## Optional simulation horizon. If not specified, it is calculated by ## the poles of the system to reflect adequately the response transients. ## @item dt ## Optional sampling time. Be sure to choose it small enough to capture transient -## phenomena. If not specified, it will be calculated by the poles of the system. +## phenomena. If not specified, it is calculated by the poles of the system. ## @end table ## ## @strong{Outputs} Modified: trunk/octave-forge/main/control/inst/lsim.m =================================================================== --- trunk/octave-forge/main/control/inst/lsim.m 2010-09-04 13:45:06 UTC (rev 7648) +++ trunk/octave-forge/main/control/inst/lsim.m 2010-09-04 17:30:43 UTC (rev 7649) @@ -21,6 +21,32 @@ ## @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} lsim (@var{sys}, @var{u}, @var{t}, @var{x0}, @var{method}) ## Simulate LTI model response to arbitrary inputs. If no output arguments are given, ## the system response is plotted on the screen. +## +## @strong{Inputs} +## @table @var +## @item sys +## LTI model. +## @item t +## Time vector. Should be evenly spaced. +## @item x0 +## Vector of initial conditions for each state. +## @item method +## Discretization method for continuous-time models. Default value is zoh +## (zero-order hold). All methods from c2d are supported. +## @end table +## +## @strong{Outputs} +## @table @var +## @item y +## Output response array. Has as many rows as time samples (length of t) +## and as many columns as outputs. +## @item t +## Time row vector. +## @item x +## State trajectories array. Has length(t) rows and as many columns as states. +## @end table +## +## @seealso{impulse, initial, step} ## @end deftypefn ## Author: Lukas Reichlin <luk...@gm...> Modified: trunk/octave-forge/main/control/inst/step.m =================================================================== --- trunk/octave-forge/main/control/inst/step.m 2010-09-04 13:45:06 UTC (rev 7648) +++ trunk/octave-forge/main/control/inst/step.m 2010-09-04 17:30:43 UTC (rev 7649) @@ -21,6 +21,35 @@ ## @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} step (@var{sys}, @var{tfinal}) ## @deftypefnx{Function File} {[@var{y}, @var{t}, @var{x}] =} step (@var{sys}, @var{tfinal}, @var{dt}) ## Step response of LTI system. +## If no output arguments are given, the response is printed on the screen. +## +## @strong{Inputs} +## @table @var +## @item sys +## LTI model. +## @item t +## Time vector. Should be evenly spaced. If not specified, it is calculated by +## the poles of the system to reflect adequately the response transients. +## @item tfinal +## Optional simulation horizon. If not specified, it is calculated by +## the poles of the system to reflect adequately the response transients. +## @item dt +## Optional sampling time. Be sure to choose it small enough to capture transient +## phenomena. If not specified, it is calculated by the poles of the system. +## @end table +## +## @strong{Outputs} +## @table @var +## @item y +## Output response array. Has as many rows as time samples (length of t) +## and as many columns as outputs. +## @item t +## Time row vector. +## @item x +## State trajectories array. Has length(t) rows and as many columns as states. +## @end table +## +## @seealso{impulse, initial, lsim} ## @end deftypefn ## Author: Lukas Reichlin <luk...@gm...> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <par...@us...> - 2010-09-04 18:18:23
|
Revision: 7650 http://octave.svn.sourceforge.net/octave/?rev=7650&view=rev Author: paramaniac Date: 2010-09-04 18:18:17 +0000 (Sat, 04 Sep 2010) Log Message: ----------- control: upgrade texinfo strings of frequency response functions Modified Paths: -------------- trunk/octave-forge/main/control/inst/bode.m trunk/octave-forge/main/control/inst/dcgain.m trunk/octave-forge/main/control/inst/freqresp.m trunk/octave-forge/main/control/inst/nichols.m trunk/octave-forge/main/control/inst/nyquist.m trunk/octave-forge/main/control/inst/rlocus.m trunk/octave-forge/main/control/inst/sigma.m Modified: trunk/octave-forge/main/control/inst/bode.m =================================================================== --- trunk/octave-forge/main/control/inst/bode.m 2010-09-04 17:30:43 UTC (rev 7649) +++ trunk/octave-forge/main/control/inst/bode.m 2010-09-04 18:18:17 UTC (rev 7650) @@ -18,7 +18,29 @@ ## -*- texinfo -*- ## @deftypefn {Function File} {[@var{mag}, @var{pha}, @var{w}] =} bode (@var{sys}) ## @deftypefnx {Function File} {[@var{mag}, @var{pha}, @var{w}] =} bode (@var{sys}, @var{w}) -## Bode diagram of LTI model's frequency response. +## Bode diagram of frequency response. If no output arguments are given, +## the response is printed on the screen. +## +## @strong{Inputs} +## @table @var +## @item sys +## LTI system. Must be a single-input and single-output (SISO) system. +## @item w +## Optional vector of frequency values. If @var{w} is not specified, it +## is calculated by the zeros and poles of the system. +## @end table +## +## @strong{Outputs} +## @table @var +## @item mag +## Vector of magnitude. Has length of frequency vector @var{w}. +## @item pha +## Vector of phase. Has length of frequency vector @var{w}. +## @item w +## Vector of frequency values used. +## @end table +## +## @seealso{nichols, nyquist, svd} ## @end deftypefn ## Author: Lukas Reichlin <luk...@gm...> Modified: trunk/octave-forge/main/control/inst/dcgain.m =================================================================== --- trunk/octave-forge/main/control/inst/dcgain.m 2010-09-04 17:30:43 UTC (rev 7649) +++ trunk/octave-forge/main/control/inst/dcgain.m 2010-09-04 18:18:17 UTC (rev 7650) @@ -18,6 +18,21 @@ ## -*- texinfo -*- ## @deftypefn {Function File} {@var{k} =} dcgain (@var{sys}) ## DC gain of LTI model. +## +## @strong{Inputs} +## @table @var +## @item sys +## LTI system. +## @end table +## +## @strong{Outputs} +## @table @var +## @item k +## DC gain matrice. For a system with m inputs and p outputs, the array @var{k} +## has dimensions [p, m]. +## @end table +## +## @seealso{freqresp} ## @end deftypefn ## Author: Lukas Reichlin <luk...@gm...> Modified: trunk/octave-forge/main/control/inst/freqresp.m =================================================================== --- trunk/octave-forge/main/control/inst/freqresp.m 2010-09-04 17:30:43 UTC (rev 7649) +++ trunk/octave-forge/main/control/inst/freqresp.m 2010-09-04 18:18:17 UTC (rev 7650) @@ -17,7 +17,25 @@ ## -*- texinfo -*- ## @deftypefn{Function File} {@var{H} =} freqresp (@var{sys}, @var{w}) -## Evaluate frequency response at given frequencies. +## Evaluate frequency response at given frequencies. +## +## @strong{Inputs} +## @table @var +## @item sys +## LTI system. +## @item w +## Vector of frequency values. +## @end table +## +## @strong{Outputs} +## @table @var +## @item H +## Array of frequency response. For a system with m inputs and p outputs, the array @var{H} +## has dimensions [p, m, length (w)]. +## The frequency response at the frequency w(k) is given by H(:,:,k). +## @end table +## +## @seealso{dcgain} ## @end deftypefn ## Author: Lukas Reichlin <luk...@gm...> Modified: trunk/octave-forge/main/control/inst/nichols.m =================================================================== --- trunk/octave-forge/main/control/inst/nichols.m 2010-09-04 17:30:43 UTC (rev 7649) +++ trunk/octave-forge/main/control/inst/nichols.m 2010-09-04 18:18:17 UTC (rev 7650) @@ -18,7 +18,29 @@ ## -*- texinfo -*- ## @deftypefn {Function File} {[@var{mag}, @var{pha}, @var{w}] =} nichols (@var{sys}) ## @deftypefnx {Function File} {[@var{mag}, @var{pha}, @var{w}] =} nichols (@var{sys}, @var{w}) -## Nichols chart of LTI model's frequency response. +## Nichols chart of frequency response. If no output arguments are given, +## the response is printed on the screen. +## +## @strong{Inputs} +## @table @var +## @item sys +## LTI system. Must be a single-input and single-output (SISO) system. +## @item w +## Optional vector of frequency values. If @var{w} is not specified, it +## is calculated by the zeros and poles of the system. +## @end table +## +## @strong{Outputs} +## @table @var +## @item mag +## Vector of magnitude. Has length of frequency vector @var{w}. +## @item pha +## Vector of phase. Has length of frequency vector @var{w}. +## @item w +## Vector of frequency values used. +## @end table +## +## @seealso{bode, nyquist, svd} ## @end deftypefn ## Author: Lukas Reichlin <luk...@gm...> Modified: trunk/octave-forge/main/control/inst/nyquist.m =================================================================== --- trunk/octave-forge/main/control/inst/nyquist.m 2010-09-04 17:30:43 UTC (rev 7649) +++ trunk/octave-forge/main/control/inst/nyquist.m 2010-09-04 18:18:17 UTC (rev 7650) @@ -18,7 +18,29 @@ ## -*- texinfo -*- ## @deftypefn {Function File} {[@var{re}, @var{im}, @var{w}] =} nyquist (@var{sys}) ## @deftypefnx {Function File} {[@var{re}, @var{im}, @var{w}] =} nyquist (@var{sys}, @var{w}) -## Nyquist diagram of LTI model's frequency response. +## Nyquist diagram of frequency response. If no output arguments are given, +## the response is printed on the screen. +## +## @strong{Inputs} +## @table @var +## @item sys +## LTI system. Must be a single-input and single-output (SISO) system. +## @item w +## Optional vector of frequency values. If @var{w} is not specified, it +## is calculated by the zeros and poles of the system. +## @end table +## +## @strong{Outputs} +## @table @var +## @item re +## Vector of real parts. Has length of frequency vector @var{w}. +## @item im +## Vector of imaginary parts. Has length of frequency vector @var{w}. +## @item w +## Vector of frequency values used. +## @end table +## +## @seealso{bode, nichols, svd} ## @end deftypefn ## Author: Lukas Reichlin <luk...@gm...> Modified: trunk/octave-forge/main/control/inst/rlocus.m =================================================================== --- trunk/octave-forge/main/control/inst/rlocus.m 2010-09-04 17:30:43 UTC (rev 7649) +++ trunk/octave-forge/main/control/inst/rlocus.m 2010-09-04 18:18:17 UTC (rev 7650) @@ -59,6 +59,10 @@ ## Updated by Kristi McGowan July 1996 for intelligent gain selection ## Updated by John Ingram July 1996 for systems +## Adapted-By: Lukas Reichlin <luk...@gm...> +## Date: December 2009 +## Version: 0.1 + ## TODO: Improve compatibility function [rldata_r, k_break, rlpol, gvec, real_ax_pts] = rlocus (sys, increment, min_k, max_k) Modified: trunk/octave-forge/main/control/inst/sigma.m =================================================================== --- trunk/octave-forge/main/control/inst/sigma.m 2010-09-04 17:30:43 UTC (rev 7649) +++ trunk/octave-forge/main/control/inst/sigma.m 2010-09-04 18:18:17 UTC (rev 7650) @@ -21,13 +21,12 @@ ## @deftypefnx{Function File} {[@var{sv}, @var{w}] =} sigma (@var{sys}, @var{[]}, @var{ptype}) ## @deftypefnx{Function File} {[@var{sv}, @var{w}] =} sigma (@var{sys}, @var{w}, @var{ptype}) ## Singular values of frequency response. If no output arguments are given, -## the singular value plot of a MIMO system is printed on the screen; -## otherwise, the singular values of the LTI system are computed and returned. +## the singular value plot is printed on the screen; ## ## @strong{Inputs} ## @table @var ## @item sys -## LTI system. +## LTI system. Multiple inputs and/or outputs (MIMO systems) would make practical sense. ## @item w ## Optional vector of frequency values. If @var{w} is not specified, it ## is calculated by the zeros and poles of the system. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <par...@us...> - 2010-09-04 18:56:25
|
Revision: 7651 http://octave.svn.sourceforge.net/octave/?rev=7651&view=rev Author: paramaniac Date: 2010-09-04 18:56:19 +0000 (Sat, 04 Sep 2010) Log Message: ----------- control: upgrade texinfo strings of robust control functions Modified Paths: -------------- trunk/octave-forge/main/control/inst/augw.m trunk/octave-forge/main/control/inst/h2syn.m trunk/octave-forge/main/control/inst/hinfsyn.m trunk/octave-forge/main/control/inst/mixsyn.m Modified: trunk/octave-forge/main/control/inst/augw.m =================================================================== --- trunk/octave-forge/main/control/inst/augw.m 2010-09-04 18:18:17 UTC (rev 7650) +++ trunk/octave-forge/main/control/inst/augw.m 2010-09-04 18:56:19 UTC (rev 7651) @@ -19,6 +19,28 @@ ## @deftypefn{Function File} {@var{P} =} augw (@var{G}, @var{W1}, @var{W2}, @var{W3}) ## Extend plant for stacked S/KS/T problem. Subsequently, the robust control problem ## can be solved by h2syn or hinfsyn. +## +## @strong{Inputs} +## @table @var +## @item G +## LTI model of plant. +## @item W1 +## LTI model of performance weight. Bounds the largest singular values of sensitivity @var{S}. +## Model must be empty, SISO or of appropriate size. +## @item W2 +## LTI model to penalize large control inputs. Bounds the largest singular values of @var{KS}. +## Model must be empty, SISO or of appropriate size. +## @item W3 +## LTI model of robustness and noise sensitivity weight. Bounds the largest singular values of +## complementary sensitivity @var{T}. Model must be empty, SISO or of appropriate size. +## @end table +## +## @strong{Outputs} +## @table @var +## @item P +## State-space model of augmented plant. +## @end table +## ## @example ## @group ## Modified: trunk/octave-forge/main/control/inst/h2syn.m =================================================================== --- trunk/octave-forge/main/control/inst/h2syn.m 2010-09-04 18:18:17 UTC (rev 7650) +++ trunk/octave-forge/main/control/inst/h2syn.m 2010-09-04 18:56:19 UTC (rev 7651) @@ -26,12 +26,12 @@ ## @item P ## Generalized plant. ## @item nmeas -## Number of measured outputs e. The last nmeas outputs of P are connected to the -## inputs of controller K. The remaining outputs z (indices 1 to p-nmeas) are used +## Number of measured outputs e. The last nmeas outputs of @var{P} are connected to the +## inputs of controller @var{K}. The remaining outputs z (indices 1 to p-nmeas) are used ## to calculate the H-2 norm. ## @item ncon -## Number of controlled inputs u. The last ncon inputs of P are connected to the -## outputs of controller K. The remaining inputs r (indices 1 to m-ncon) are excited +## Number of controlled inputs u. The last ncon inputs of @var{P} are connected to the +## outputs of controller @var{K}. The remaining inputs r (indices 1 to m-ncon) are excited ## by a harmonic test signal. ## @end table ## @@ -40,9 +40,9 @@ ## @item K ## State-space model of the H-2 optimal controller. ## @item N -## State-space model of the lower LFT of P and K. +## State-space model of the lower LFT of @var{P} and @var{K}. ## @item gamma -## H-2 norm of N. +## H-2 norm of @var{N}. ## @end table ## ## @example Modified: trunk/octave-forge/main/control/inst/hinfsyn.m =================================================================== --- trunk/octave-forge/main/control/inst/hinfsyn.m 2010-09-04 18:18:17 UTC (rev 7650) +++ trunk/octave-forge/main/control/inst/hinfsyn.m 2010-09-04 18:56:19 UTC (rev 7651) @@ -27,15 +27,15 @@ ## @item P ## Generalized plant. ## @item nmeas -## Number of measured outputs e. The last nmeas outputs of P are connected to the -## inputs of controller K. The remaining outputs z (indices 1 to p-nmeas) are used +## Number of measured outputs e. The last nmeas outputs of @var{P} are connected to the +## inputs of controller @var{K}. The remaining outputs z (indices 1 to p-nmeas) are used ## to calculate the H-infinity norm. ## @item ncon -## Number of controlled inputs u. The last ncon inputs of P are connected to the -## outputs of controller K. The remaining inputs r (indices 1 to m-ncon) are excited +## Number of controlled inputs u. The last ncon inputs of @var{P} are connected to the +## outputs of controller @var{K}. The remaining inputs r (indices 1 to m-ncon) are excited ## by a harmonic test signal. ## @item gmax -## The maximum value of the H-infinity norm of N. It is assumed that gmax is +## The maximum value of the H-infinity norm of @var{N}. It is assumed that @var{gmax} is ## sufficiently large so that the controller is admissible. ## @end table ## @@ -44,9 +44,9 @@ ## @item K ## State-space model of the H-infinity (sub-)optimal controller. ## @item N -## State-space model of the lower LFT of P and K. +## State-space model of the lower LFT of @var{P} and @var{K}. ## @item gamma -## L-infinity norm of N. +## L-infinity norm of @var{N}. ## @end table ## ## @example Modified: trunk/octave-forge/main/control/inst/mixsyn.m =================================================================== --- trunk/octave-forge/main/control/inst/mixsyn.m 2010-09-04 18:18:17 UTC (rev 7650) +++ trunk/octave-forge/main/control/inst/mixsyn.m 2010-09-04 18:56:19 UTC (rev 7651) @@ -17,12 +17,38 @@ ## -*- texinfo -*- ## @deftypefn{Function File} {[@var{K}, @var{N}, @var{gamma}] =} mixsyn (@var{G}, @var{W1}, @var{W2}, @var{W3}) -## Solve stacked S/KS/T H-inf problem, i.e. bound the largest singular values +## Solve stacked S/KS/T H-inf problem. Bound the largest singular values ## of S (for performance), K S (to penalize large inputs) and ## T (for robustness and to avoid sensitivity to noise). ## In other words, the inputs r are excited by a harmonic test signal. ## Then the algorithm tries to find a controller K which minimizes -## the H-infinity norm calculated from the outputs z. +## the H-infinity norm calculated from the outputs z. +## +## @strong{Inputs} +## @table @var +## @item G +## LTI model of plant. +## @item W1 +## LTI model of performance weight. Bounds the largest singular values of sensitivity @var{S}. +## Model must be empty, SISO or of appropriate size. +## @item W2 +## LTI model to penalize large control inputs. Bounds the largest singular values of @var{KS}. +## Model must be empty, SISO or of appropriate size. +## @item W3 +## LTI model of robustness and noise sensitivity weight. Bounds the largest singular values of +## complementary sensitivity @var{T}. Model must be empty, SISO or of appropriate size. +## @end table +## +## @strong{Outputs} +## @table @var +## @item K +## State-space model of the H-infinity (sub-)optimal controller. +## @item N +## State-space model of the lower LFT of @var{P} and @var{K}. +## @item gamma +## L-infinity norm of @var{N}. +## @end table +## ## @example ## @group ## This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <par...@us...> - 2010-09-04 19:36:47
|
Revision: 7653 http://octave.svn.sourceforge.net/octave/?rev=7653&view=rev Author: paramaniac Date: 2010-09-04 19:36:41 +0000 (Sat, 04 Sep 2010) Log Message: ----------- control: upgrade texinfo strings of constructors Modified Paths: -------------- trunk/octave-forge/main/control/inst/@ss/ss.m trunk/octave-forge/main/control/inst/@tf/tf.m Modified: trunk/octave-forge/main/control/inst/@ss/ss.m =================================================================== --- trunk/octave-forge/main/control/inst/@ss/ss.m 2010-09-04 19:00:55 UTC (rev 7652) +++ trunk/octave-forge/main/control/inst/@ss/ss.m 2010-09-04 19:36:41 UTC (rev 7653) @@ -17,10 +17,34 @@ ## -*- texinfo -*- ## @deftypefn {Function File} {@var{sys} =} ss (@var{sys}) +## @deftypefnx {Function File} {@var{sys} =} ss (@var{d}) ## @deftypefnx {Function File} {@var{sys} =} ss (@var{a}, @var{b}, @var{c}) ## @deftypefnx {Function File} {@var{sys} =} ss (@var{a}, @var{b}, @var{c}, @var{d}) ## @deftypefnx {Function File} {@var{sys} =} ss (@var{a}, @var{b}, @var{c}, @var{d}, @var{tsam}) ## Create or convert to state-space model. +## +## @strong{Inputs} +## @table @var +## @item a +## State transition matrix. +## @item b +## Input matrix. +## @item c +## Measurement matrix. +## @item d +## Feedthrough matrix. +## @item tsam +## Sampling time. If @var{tsam} is not specified, a continuous-time +## model is assumed. +## @end table +## +## @strong{Outputs} +## @table @var +## @item sys +## State-space model. +## @end table +## +## @seealso{tf} ## @end deftypefn ## Author: Lukas Reichlin <luk...@gm...> Modified: trunk/octave-forge/main/control/inst/@tf/tf.m =================================================================== --- trunk/octave-forge/main/control/inst/@tf/tf.m 2010-09-04 19:00:55 UTC (rev 7652) +++ trunk/octave-forge/main/control/inst/@tf/tf.m 2010-09-04 19:36:41 UTC (rev 7653) @@ -17,10 +17,30 @@ ## -*- texinfo -*- ## @deftypefn {Function File} {@var{s} =} tf (@var{"s"}) +## @deftypefnx {Function File} {@var{z} =} tf (@var{"z"}, @var{tsam}) ## @deftypefnx {Function File} {@var{sys} =} tf (@var{sys}) ## @deftypefnx {Function File} {@var{sys} =} tf (@var{num}, @var{den}) ## @deftypefnx {Function File} {@var{sys} =} tf (@var{num}, @var{den}, @var{tsam}) ## Create or convert to transfer function model. +## +## @strong{Inputs} +## @table @var +## @item num +## Numerator or cell of numerators. +## @item den +## Denominator or cell of denominators. +## @item tsam +## Sampling time. If @var{tsam} is not specified, a continuous-time +## model is assumed. +## @end table +## +## @strong{Outputs} +## @table @var +## @item sys +## Transfer function model. +## @end table +## +## @seealso{ss} ## @end deftypefn ## Author: Lukas Reichlin <luk...@gm...> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <par...@us...> - 2010-09-04 20:23:44
|
Revision: 7654 http://octave.svn.sourceforge.net/octave/?rev=7654&view=rev Author: paramaniac Date: 2010-09-04 20:23:38 +0000 (Sat, 04 Sep 2010) Log Message: ----------- control: upgrade texinfo, add test Modified Paths: -------------- trunk/octave-forge/main/control/inst/care.m trunk/octave-forge/main/control/inst/dare.m trunk/octave-forge/main/control/inst/test_control.m Modified: trunk/octave-forge/main/control/inst/care.m =================================================================== --- trunk/octave-forge/main/control/inst/care.m 2010-09-04 19:36:41 UTC (rev 7653) +++ trunk/octave-forge/main/control/inst/care.m 2010-09-04 20:23:38 UTC (rev 7654) @@ -18,11 +18,34 @@ ## -*- texinfo -*- ## @deftypefn {Function File} {[@var{x}, @var{l}, @var{g}] =} care (@var{a}, @var{b}, @var{q}, @var{r}) ## @deftypefnx {Function File} {[@var{x}, @var{l}, @var{g}] =} care (@var{a}, @var{b}, @var{q}, @var{r}, @var{s}) -## Return unique stabilizing solution x of the continuous-time -## Riccati equation as well as the closed-loop poles l and the -## corresponding gain matrix g. +## Solve continuous-time algebraic Riccati equation (ARE). ## Uses SLICOT SB02OD by courtesy of NICONET e.V. ## <http://www.slicot.org> +## +## @strong{Inputs} +## @table @var +## @item a +## Real matrix. +## @item b +## Real matrix. +## @item q +## Real matrix. +## @item r +## Real matrix. +## @item s +## Optional real matrix. If @var{s} is not specified, a zero matrix is assumed. +## @end table +## +## @strong{Outputs} +## @table @var +## @item x +## Unique stabilizing solution of the continuous-time Riccati equation. +## @item l +## Closed-loop poles. +## @item g +## Corresponding gain matrix. +## @end table +## ## @example ## @group ## -1 @@ -36,6 +59,8 @@ ## ## -1 ## G = R (B'X + S') +## +## L = eig (A - B*G) ## @end group ## @end example ## @seealso{dare, lqr, dlqr, kalman} Modified: trunk/octave-forge/main/control/inst/dare.m =================================================================== --- trunk/octave-forge/main/control/inst/dare.m 2010-09-04 19:36:41 UTC (rev 7653) +++ trunk/octave-forge/main/control/inst/dare.m 2010-09-04 20:23:38 UTC (rev 7654) @@ -18,11 +18,34 @@ ## -*- texinfo -*- ## @deftypefn {Function File} {[@var{x}, @var{l}, @var{g}] =} dare (@var{a}, @var{b}, @var{q}, @var{r}) ## @deftypefnx {Function File} {[@var{x}, @var{l}, @var{g}] =} dare (@var{a}, @var{b}, @var{q}, @var{r}, @var{s}) -## Return unique stabilizing solution x of the discrete-time -## Riccati equation as well as the closed-loop poles l and the -## corresponding gain matrix g. +## Solve discrete-time algebraic Riccati equation (ARE). ## Uses SLICOT SB02OD by courtesy of NICONET e.V. ## <http://www.slicot.org> +## +## @strong{Inputs} +## @table @var +## @item a +## Real matrix. +## @item b +## Real matrix. +## @item q +## Real matrix. +## @item r +## Real matrix. +## @item s +## Optional real matrix. If @var{s} is not specified, a zero matrix is assumed. +## @end table +## +## @strong{Outputs} +## @table @var +## @item x +## Unique stabilizing solution of the discrete-time Riccati equation. +## @item l +## Closed-loop poles. +## @item g +## Corresponding gain matrix. +## @end table +## ## @example ## @group ## -1 @@ -36,6 +59,8 @@ ## ## -1 ## G = (B'XB + R) (B'XA + S') +## +## L = eig (A - B*G) ## @end group ## @end example ## @seealso{care, lqr, dlqr, kalman} @@ -120,4 +145,27 @@ endfunction -## TODO: add a test \ No newline at end of file +%!shared x, l, g, xe, le, ge +%! a = [ 0.4 1.7 +%! 0.9 3.8]; +%! +%! b = [ 0.8 +%! 2.1]; +%! +%! c = [ 1 -1]; +%! +%! r = 3; +%! +%! [x, l, g] = dare (a, b, c.'*c, r); +%! +%! xe = [ 1.5354 1.2623 +%! 1.2623 10.5596]; +%! +%! le = [-0.0022 +%! 0.2454]; +%! +%! ge = [ 0.4092 1.7283]; +%! +%!assert (x, xe, 1e-4); +%!assert (l, le, 1e-4); +%!assert (g, ge, 1e-4); \ No newline at end of file Modified: trunk/octave-forge/main/control/inst/test_control.m =================================================================== --- trunk/octave-forge/main/control/inst/test_control.m 2010-09-04 19:36:41 UTC (rev 7653) +++ trunk/octave-forge/main/control/inst/test_control.m 2010-09-04 20:23:38 UTC (rev 7654) @@ -33,7 +33,7 @@ ## ARE solvers test care -## test dare # TODO: add missing test +test dare test kalman ## Lyapunov This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <par...@us...> - 2010-09-04 21:12:51
|
Revision: 7655 http://octave.svn.sourceforge.net/octave/?rev=7655&view=rev Author: paramaniac Date: 2010-09-04 21:12:41 +0000 (Sat, 04 Sep 2010) Log Message: ----------- control: upgrade texinfo strings Modified Paths: -------------- trunk/octave-forge/main/control/inst/dlqr.m trunk/octave-forge/main/control/inst/lqr.m Modified: trunk/octave-forge/main/control/inst/dlqr.m =================================================================== --- trunk/octave-forge/main/control/inst/dlqr.m 2010-09-04 20:23:38 UTC (rev 7654) +++ trunk/octave-forge/main/control/inst/dlqr.m 2010-09-04 21:12:41 UTC (rev 7655) @@ -20,8 +20,46 @@ ## @deftypefnx {Function File} {[@var{g}, @var{x}, @var{l}] =} dlqr (@var{sys}, @var{q}, @var{r}, @var{s}) ## @deftypefnx {Function File} {[@var{g}, @var{x}, @var{l}] =} dlqr (@var{a}, @var{b}, @var{q}, @var{r}) ## @deftypefnx {Function File} {[@var{g}, @var{x}, @var{l}] =} dlqr (@var{a}, @var{b}, @var{q}, @var{r}, @var{s}) -## Return linear-quadratic state-feedback gain matrix g for a LTI system as well as -## the solution x of the associated riccati equation and the closed-loop poles l. +## Linear-quadratic regulator for discrete-time systems. +## +## @strong{Inputs} +## @table @var +## @item sys +## Continuous or discrete-time LTI model. +## @item a +## State transition matrix of discrete-time system. +## @item b +## Input matrix of discrete-time system. +## @item q +## State weighting matrix. +## @item r +## Control weighting matrix. +## @item s +## Optional cross term matrix. If @var{s} is not specified, a zero matrix is assumed. +## @end table +## +## @strong{Outputs} +## @table @var +## @item g +## State feedback matrix. +## @item x +## Unique stabilizing solution of the discrete-time Riccati equation. +## @item l +## Closed-loop poles. +## @end table +## +## @example +## @group +## x[k+1] = A x[k] + B u[k], x[0] = x0 +## +## /inf +## J(x0) = | (x' Q x + u' R u + 2 x' S u) dt +## /0 +## +## L = eig (A - B*G) +## @end group +## @end example +## @seealso{dare, care, lqr} ## @end deftypefn ## Author: Lukas Reichlin <luk...@gm...> Modified: trunk/octave-forge/main/control/inst/lqr.m =================================================================== --- trunk/octave-forge/main/control/inst/lqr.m 2010-09-04 20:23:38 UTC (rev 7654) +++ trunk/octave-forge/main/control/inst/lqr.m 2010-09-04 21:12:41 UTC (rev 7655) @@ -20,9 +20,47 @@ ## @deftypefnx {Function File} {[@var{g}, @var{x}, @var{l}] =} lqr (@var{sys}, @var{q}, @var{r}, @var{s}) ## @deftypefnx {Function File} {[@var{g}, @var{x}, @var{l}] =} lqr (@var{a}, @var{b}, @var{q}, @var{r}) ## @deftypefnx {Function File} {[@var{g}, @var{x}, @var{l}] =} lqr (@var{a}, @var{b}, @var{q}, @var{r}, @var{s}) -## Linear-quadratic regulator. Return linear-quadratic state-feedback gain matrix g for a LTI system -## as well as the solution x of the associated riccati equation and the closed-loop poles l. -## @seealso{care, dare} +## Linear-quadratic regulator. +## +## @strong{Inputs} +## @table @var +## @item sys +## Continuous or discrete-time LTI model. +## @item a +## State transition matrix of continuous-time system. +## @item b +## Input matrix of continuous-time system. +## @item q +## State weighting matrix. +## @item r +## Control weighting matrix. +## @item s +## Optional cross term matrix. If @var{s} is not specified, a zero matrix is assumed. +## @end table +## +## @strong{Outputs} +## @table @var +## @item g +## State feedback matrix. +## @item x +## Unique stabilizing solution of the continuous-time Riccati equation. +## @item l +## Closed-loop poles. +## @end table +## +## @example +## @group +## . +## x = A x + B u, x(0) = x0 +## +## /inf +## J(x0) = | (x' Q x + u' R u + 2 x' S u) dt +## /0 +## +## L = eig (A - B*G) +## @end group +## @end example +## @seealso{care, dare, dlqr} ## @end deftypefn ## Author: Lukas Reichlin <luk...@gm...> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <par...@us...> - 2010-09-04 21:28:30
|
Revision: 7656 http://octave.svn.sourceforge.net/octave/?rev=7656&view=rev Author: paramaniac Date: 2010-09-04 21:28:24 +0000 (Sat, 04 Sep 2010) Log Message: ----------- control: upgrade even more texinfo strings Modified Paths: -------------- trunk/octave-forge/main/control/inst/estim.m trunk/octave-forge/main/control/inst/kalman.m Modified: trunk/octave-forge/main/control/inst/estim.m =================================================================== --- trunk/octave-forge/main/control/inst/estim.m 2010-09-04 21:12:41 UTC (rev 7655) +++ trunk/octave-forge/main/control/inst/estim.m 2010-09-04 21:28:24 UTC (rev 7656) @@ -19,6 +19,26 @@ ## @deftypefn {Function File} {@var{est} =} estim (@var{sys}, @var{l}) ## @deftypefnx {Function File} {@var{est} =} estim (@var{sys}, @var{l}, @var{sensors}, @var{known}) ## Return state estimator for a given estimator gain +## +## @strong{Inputs} +## @table @var +## @item sys +## LTI model. +## @item l +## State feedback matrix. +## @item sensors +## Indices of measured output signals y from @var{sys}. If omitted, all outputs are measured. +## @item known +## Indices of known input signals u (deterministic) to @var{sys}. All other inputs to @var{sys} +## are assumed stochastic. If argument @var{known} is omitted, no inputs u are known. +## @end table +## +## @strong{Outputs} +## @table @var +## @item est +## State-space model of estimator. +## @end table +## @seealso{kalman, place} ## @end deftypefn ## Author: Lukas Reichlin <luk...@gm...> Modified: trunk/octave-forge/main/control/inst/kalman.m =================================================================== --- trunk/octave-forge/main/control/inst/kalman.m 2010-09-04 21:12:41 UTC (rev 7655) +++ trunk/octave-forge/main/control/inst/kalman.m 2010-09-04 21:28:24 UTC (rev 7656) @@ -22,20 +22,6 @@ ## @deftypefnx {Function File} {[@var{est}, @var{g}, @var{x}] =} kalman (@var{sys}, @var{q}, @var{r}, @var{s}, @var{sensors}, @var{known}) ## Design Kalman estimator for LTI systems. ## -## @example -## @group -## u +-------+ ^ -## +---------------------------->| |-------> y -## | +-------+ + y | est | ^ -## u ----+--->| |----->(+)------>| |-------> x -## | sys | ^ + +-------+ -## w -------->| | | -## +-------+ | v -## -## Q = cov (w, w') R = cov (v, v') S = cov (w, v') -## @end group -## @end example -## ## @strong{Inputs} ## @table @var ## @item sys @@ -45,12 +31,12 @@ ## @item R ## Covariance of white measurement noise. ## @item S -## Optional cross term covariance. Default value is S = 0. +## Optional cross term covariance. Default value is zero. ## @item sensors -## Indices of measured output signals y from sys. If omitted, all outputs are measured. +## Indices of measured output signals y from @var{sys}. If omitted, all outputs are measured. ## @item known -## Indices of known input signals u (deterministic) to sys. All other inputs to sys -## are assumed stochastic. If argument known is omitted, no inputs u are known. +## Indices of known input signals u (deterministic) to @var{sys}. All other inputs to @var{sys} +## are assumed stochastic. If argument @var{known} is omitted, no inputs u are known. ## @end table ## ## @strong{Outputs} @@ -62,6 +48,21 @@ ## @item X ## Solution of the Riccati equation. ## @end table +## +## @example +## @group +## u +-------+ ^ +## +---------------------------->| |-------> y +## | +-------+ + y | est | ^ +## u ----+--->| |----->(+)------>| |-------> x +## | sys | ^ + +-------+ +## w -------->| | | +## +-------+ | v +## +## Q = cov (w, w') R = cov (v, v') S = cov (w, v') +## @end group +## @end example +## ## @seealso{care, dare, estim, lqr} ## @end deftypefn This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <par...@us...> - 2010-09-04 22:10:52
|
Revision: 7657 http://octave.svn.sourceforge.net/octave/?rev=7657&view=rev Author: paramaniac Date: 2010-09-04 22:10:46 +0000 (Sat, 04 Sep 2010) Log Message: ----------- control: texinfo updates Modified Paths: -------------- trunk/octave-forge/main/control/inst/covar.m trunk/octave-forge/main/control/inst/kalman.m Modified: trunk/octave-forge/main/control/inst/covar.m =================================================================== --- trunk/octave-forge/main/control/inst/covar.m 2010-09-04 21:28:24 UTC (rev 7656) +++ trunk/octave-forge/main/control/inst/covar.m 2010-09-04 22:10:46 UTC (rev 7657) @@ -17,9 +17,25 @@ ## -*- texinfo -*- ## @deftypefn{Function File} {[@var{p}, @var{q}] =} covar (@var{sys}, @var{w}) -## Return the (steady-state) output covariance p as well as the state -## covariance q for a lti model sys driven by the Gaussian white noise -## inputs of intensity w. +## Return the steady-state covariance. +## +## @strong{Inputs} +## @table @var +## @item sys +## LTI model. +## @item w +## Intensity of white noise inputs which drive @var{sys}. +## @end table +## +## @strong{Outputs} +## @table @var +## @item p +## Output covariance. +## @item q +## State covariance. +## @end table +## +## @seealso{lyap, dlyap} ## @end deftypefn ## Author: Lukas Reichlin <luk...@gm...> Modified: trunk/octave-forge/main/control/inst/kalman.m =================================================================== --- trunk/octave-forge/main/control/inst/kalman.m 2010-09-04 21:28:24 UTC (rev 7656) +++ trunk/octave-forge/main/control/inst/kalman.m 2010-09-04 22:10:46 UTC (rev 7657) @@ -26,11 +26,11 @@ ## @table @var ## @item sys ## Nominal plant model. -## @item Q +## @item q ## Covariance of white process noise. -## @item R +## @item r ## Covariance of white measurement noise. -## @item S +## @item s ## Optional cross term covariance. Default value is zero. ## @item sensors ## Indices of measured output signals y from @var{sys}. If omitted, all outputs are measured. @@ -43,9 +43,9 @@ ## @table @var ## @item est ## State-space model of the Kalman estimator. -## @item G +## @item g ## Estimator gain. -## @item X +## @item x ## Solution of the Riccati equation. ## @end table ## This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <par...@us...> - 2010-09-05 05:54:24
|
Revision: 7658 http://octave.svn.sourceforge.net/octave/?rev=7658&view=rev Author: paramaniac Date: 2010-09-05 05:54:14 +0000 (Sun, 05 Sep 2010) Log Message: ----------- control: work on texinfo strings Modified Paths: -------------- trunk/octave-forge/main/control/inst/@tf/tf.m trunk/octave-forge/main/control/inst/dlyap.m trunk/octave-forge/main/control/inst/gensig.m trunk/octave-forge/main/control/inst/isctrb.m trunk/octave-forge/main/control/inst/isobsv.m trunk/octave-forge/main/control/inst/lyap.m Modified: trunk/octave-forge/main/control/inst/@tf/tf.m =================================================================== --- trunk/octave-forge/main/control/inst/@tf/tf.m 2010-09-04 22:10:46 UTC (rev 7657) +++ trunk/octave-forge/main/control/inst/@tf/tf.m 2010-09-05 05:54:14 UTC (rev 7658) @@ -26,9 +26,11 @@ ## @strong{Inputs} ## @table @var ## @item num -## Numerator or cell of numerators. +## Numerator or cell of numerators. Row vector containing the exponents +## of the polynomial in descending order. ## @item den -## Denominator or cell of denominators. +## Denominator or cell of denominators. Row vector containing the exponents +## of the polynomial in descending order. ## @item tsam ## Sampling time. If @var{tsam} is not specified, a continuous-time ## model is assumed. Modified: trunk/octave-forge/main/control/inst/dlyap.m =================================================================== --- trunk/octave-forge/main/control/inst/dlyap.m 2010-09-04 22:10:46 UTC (rev 7657) +++ trunk/octave-forge/main/control/inst/dlyap.m 2010-09-05 05:54:14 UTC (rev 7658) @@ -22,6 +22,7 @@ ## Solve discrete-time Lyapunov or Sylvester equations. ## Uses SLICOT SB03MD, SB04QD and SG03AD by courtesy of NICONET e.V. ## <http://www.slicot.org> +## ## @example ## @group ## AXA' - X + B = 0 (Lyapunov Equation) Modified: trunk/octave-forge/main/control/inst/gensig.m =================================================================== --- trunk/octave-forge/main/control/inst/gensig.m 2010-09-04 22:10:46 UTC (rev 7657) +++ trunk/octave-forge/main/control/inst/gensig.m 2010-09-05 05:54:14 UTC (rev 7658) @@ -34,7 +34,7 @@ ## @item tau ## Duration of one period in seconds. ## @item tfinal -## Optional duration of the signal in seconds. Default duration is 5 periods +## Optional duration of the signal in seconds. Default duration is 5 periods. ## @item tsam ## Optional sampling time in seconds. Default spacing is tau/64. ## @end table Modified: trunk/octave-forge/main/control/inst/isctrb.m =================================================================== --- trunk/octave-forge/main/control/inst/isctrb.m 2010-09-04 22:10:46 UTC (rev 7657) +++ trunk/octave-forge/main/control/inst/isctrb.m 2010-09-05 05:54:14 UTC (rev 7658) @@ -17,7 +17,9 @@ ## <http://www.gnu.org/licenses/>. ## -*- texinfo -*- -## @deftypefn {Function File} {[@var{retval}, @var{u}] =} isctrb (@var{sys}, @var{tol}) +## @deftypefn {Function File} {[@var{retval}, @var{u}] =} isctrb (@var{sys}) +## @deftypefnx {Function File} {[@var{retval}, @var{u}] =} isctrb (@var{sys}, @var{tol}) +## @deftypefnx {Function File} {[@var{retval}, @var{u}] =} isctrb (@var{a}, @var{b}) ## @deftypefnx {Function File} {[@var{retval}, @var{u}] =} isctrb (@var{a}, @var{b}, @var{tol}) ## Logical check for system controllability. ## Uses SLICOT AB01OD by courtesy of NICONET e.V. @@ -26,23 +28,23 @@ ## @strong{Inputs} ## @table @var ## @item sys -## system data structure +## LTI model. ## @item a -## @itemx b -## @var{n} by @var{n}, @var{n} by @var{m} matrices, respectively +## State transition matrix. +## @item b +## Input matrix. ## @item tol -## optional roundoff parameter. Default value: 0 +## Optional roundoff parameter. Default value is zero. ## @end table ## ## @strong{Outputs} ## @table @var ## @item retval -## Logical flag; returns true (1) if the system @var{sys} or the -## pair (@var{a}, @var{b}) is controllable, whichever was passed as input -## arguments. +## Logical flag; true (1) if the system is controllable. ## @item u -## @var{u} is an orthogonal basis of the controllable subspace. +## An orthogonal basis of the controllable subspace. ## @end table +## ## @seealso{isobsv} ## @end deftypefn Modified: trunk/octave-forge/main/control/inst/isobsv.m =================================================================== --- trunk/octave-forge/main/control/inst/isobsv.m 2010-09-04 22:10:46 UTC (rev 7657) +++ trunk/octave-forge/main/control/inst/isobsv.m 2010-09-05 05:54:14 UTC (rev 7658) @@ -17,17 +17,34 @@ ## <http://www.gnu.org/licenses/>. ## -*- texinfo -*- -## @deftypefn {Function File} {[@var{retval}, @var{u}] =} isobsv (@var{a}, @var{c}, @var{tol}) +## @deftypefn {Function File} {[@var{retval}, @var{u}] =} isobsv (@var{sys}) ## @deftypefnx {Function File} {[@var{retval}, @var{u}] =} isobsv (@var{sys}, @var{tol}) +## @deftypefnx {Function File} {[@var{retval}, @var{u}] =} isobsv (@var{a}, @var{c}) +## @deftypefnx {Function File} {[@var{retval}, @var{u}] =} isobsv (@var{a}, @var{c}, @var{tol}) ## Logical check for system observability. +## Uses SLICOT AB01OD by courtesy of NICONET e.V. +## <http://www.slicot.org> ## -## Default: tol = @code{tol = 10*norm(a,"fro")*eps} +## @strong{Inputs} +## @table @var +## @item sys +## LTI model. +## @item a +## State transition matrix. +## @item c +## Measurement matrix. +## @item tol +## Optional roundoff parameter. Default value is zero. +## @end table ## -## Returns 1 if the system @var{sys} or the pair (@var{a}, @var{c}) is -## observable, 0 if not. +## @strong{Outputs} +## @table @var +## @item retval +## Logical flag; true (1) if the system is observable. +## @item u +## An orthogonal basis of the observable subspace. +## @end table ## -## See @command{isctrb} for detailed description of arguments -## and default values. ## @seealso{isctrb} ## @end deftypefn Modified: trunk/octave-forge/main/control/inst/lyap.m =================================================================== --- trunk/octave-forge/main/control/inst/lyap.m 2010-09-04 22:10:46 UTC (rev 7657) +++ trunk/octave-forge/main/control/inst/lyap.m 2010-09-05 05:54:14 UTC (rev 7658) @@ -22,6 +22,7 @@ ## Solve continuous-time Lyapunov or Sylvester equations. ## Uses SLICOT SB03MD, SB04MD and SG03AD by courtesy of NICONET e.V. ## <http://www.slicot.org> +## ## @example ## @group ## AX + XA' + B = 0 (Lyapunov Equation) This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <par...@us...> - 2010-09-05 06:42:29
|
Revision: 7659 http://octave.svn.sourceforge.net/octave/?rev=7659&view=rev Author: paramaniac Date: 2010-09-05 06:42:21 +0000 (Sun, 05 Sep 2010) Log Message: ----------- control: change texinfo, variable names and author Modified Paths: -------------- trunk/octave-forge/main/control/inst/isctrb.m trunk/octave-forge/main/control/inst/isdetectable.m trunk/octave-forge/main/control/inst/isobsv.m trunk/octave-forge/main/control/inst/isstabilizable.m Modified: trunk/octave-forge/main/control/inst/isctrb.m =================================================================== --- trunk/octave-forge/main/control/inst/isctrb.m 2010-09-05 05:54:14 UTC (rev 7658) +++ trunk/octave-forge/main/control/inst/isctrb.m 2010-09-05 06:42:21 UTC (rev 7659) @@ -1,26 +1,25 @@ -## Copyright (C) 1993, 1994, 1995, 2000, 2002, 2004, 2005, 2006, 2007 -## Auburn University. All rights reserved. +## Copyright (C) 2009 - 2010 Lukas F. Reichlin ## +## This file is part of LTI Syncope. ## -## This program is free software; you can redistribute it and/or modify it -## under the terms of the GNU General Public License as published by -## the Free Software Foundation; either version 3 of the License, or (at -## your option) any later version. +## LTI Syncope is free software: you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation, either version 3 of the License, or +## (at your option) any later version. ## -## This program is distributed in the hope that it will be useful, but -## WITHOUT ANY WARRANTY; without even the implied warranty of -## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -## General Public License for more details. +## LTI Syncope is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License -## along with this program; see the file COPYING. If not, see -## <http://www.gnu.org/licenses/>. +## along with this program. If not, see <http://www.gnu.org/licenses/>. ## -*- texinfo -*- -## @deftypefn {Function File} {[@var{retval}, @var{u}] =} isctrb (@var{sys}) -## @deftypefnx {Function File} {[@var{retval}, @var{u}] =} isctrb (@var{sys}, @var{tol}) -## @deftypefnx {Function File} {[@var{retval}, @var{u}] =} isctrb (@var{a}, @var{b}) -## @deftypefnx {Function File} {[@var{retval}, @var{u}] =} isctrb (@var{a}, @var{b}, @var{tol}) +## @deftypefn {Function File} {[@var{bool}, @var{u}] =} isctrb (@var{sys}) +## @deftypefnx {Function File} {[@var{bool}, @var{u}] =} isctrb (@var{sys}, @var{tol}) +## @deftypefnx {Function File} {[@var{bool}, @var{u}] =} isctrb (@var{a}, @var{b}) +## @deftypefnx {Function File} {[@var{bool}, @var{u}] =} isctrb (@var{a}, @var{b}, @var{tol}) ## Logical check for system controllability. ## Uses SLICOT AB01OD by courtesy of NICONET e.V. ## <http://www.slicot.org> @@ -39,8 +38,10 @@ ## ## @strong{Outputs} ## @table @var -## @item retval -## Logical flag; true (1) if the system is controllable. +## @item bool = 0 +## System is not controllable. +## @item bool = 1 +## System is controllable. ## @item u ## An orthogonal basis of the controllable subspace. ## @end table @@ -48,30 +49,25 @@ ## @seealso{isobsv} ## @end deftypefn -## Author: A. S. Hodel <a.s...@en...> -## Created: August 1993 -## Updated by A. S. Hodel (sc...@en...) Aubust, 1995 to use krylovb -## Updated by John Ingram (in...@en...) July, 1996 for packed systems - -## Adapted-By: Lukas Reichlin <luk...@gm...> -## Date: October 2009 +## Author: Lukas Reichlin <luk...@gm...> +## Created: October 2009 ## Version: 0.2 -function [retval, U] = isctrb (A, B = 0, tol = 0) +function [bool, u] = isctrb (a, b = 0, tol = 0) if (nargin < 1 || nargin > 3) print_usage (); - elseif (isa (A, "lti")) # isctrb (sys), isctrb (sys, tol) + elseif (isa (a, "lti")) # isctrb (sys), isctrb (sys, tol) if (nargin > 2) print_usage (); endif - tol = B; - [A, B] = ssdata (A); - elseif (nargin < 2) # isctrb (A, B), isctrb (A, B, tol) + tol = b; + [a, b] = ssdata (a); + elseif (nargin < 2) # isctrb (a, b), isctrb (a, b, tol) print_usage (); - elseif (isempty (A) || isempty (B) || rows (A) != rows (B) || ! issquare (A)) - error ("isctrb: A(%dx%d), B(%dx%d)", - rows (A), columns (A), rows (B), columns (B)); + elseif (isempty (a) || isempty (b) || rows (a) != rows (b) || ! issquare (a)) + error ("isctrb: a(%dx%d), b(%dx%d) not conformal", + rows (a), columns (a), rows (b), columns (b)); endif ## check tol dimensions @@ -80,10 +76,10 @@ rows (tol), columns (tol)); endif - [Ac, Bc, U, ncont] = slab01od (A, B, tol); + [ac, bc, u, ncont] = slab01od (a, b, tol); - U = U(:, 1:ncont); + u = u(:, 1:ncont); - retval = (ncont == rows (A)); + bool = (ncont == rows (a)); endfunction Modified: trunk/octave-forge/main/control/inst/isdetectable.m =================================================================== --- trunk/octave-forge/main/control/inst/isdetectable.m 2010-09-05 05:54:14 UTC (rev 7658) +++ trunk/octave-forge/main/control/inst/isdetectable.m 2010-09-05 06:42:21 UTC (rev 7659) @@ -1,29 +1,30 @@ -## Copyright (C) 1993, 1994, 1995, 2000, 2002, 2003, 2004, 2005, 2006, -## 2007 Auburn University. All rights reserved. +## Copyright (C) 2009 - 2010 Lukas F. Reichlin ## +## This file is part of LTI Syncope. ## -## This program is free software; you can redistribute it and/or modify it -## under the terms of the GNU General Public License as published by -## the Free Software Foundation; either version 3 of the License, or (at -## your option) any later version. +## LTI Syncope is free software: you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation, either version 3 of the License, or +## (at your option) any later version. ## -## This program is distributed in the hope that it will be useful, but -## WITHOUT ANY WARRANTY; without even the implied warranty of -## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -## General Public License for more details. +## LTI Syncope is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License -## along with this program; see the file COPYING. If not, see -## <http://www.gnu.org/licenses/>. +## along with this program. If not, see <http://www.gnu.org/licenses/>. ## -*- texinfo -*- -## @deftypefn {Function File} {@var{retval} =} isdetectable (@var{sys}) -## @deftypefnx {Function File} {@var{retval} =} isdetectable (@var{sys}, @var{tol}) -## @deftypefnx {Function File} {@var{retval} =} isdetectable (@var{a}, @var{c}) -## @deftypefnx {Function File} {@var{retval} =} isdetectable (@var{a}, @var{c}, @var{tol}) -## @deftypefnx {Function File} {@var{retval} =} isdetectable (@var{a}, @var{c}, @var{[]}, @var{dflg}) -## @deftypefnx {Function File} {@var{retval} =} isdetectable (@var{a}, @var{c}, @var{tol}, @var{dflg}) -## Logical test for system detectability (observability of unstable modes). +## @deftypefn {Function File} {@var{bool} =} isdetectable (@var{sys}) +## @deftypefnx {Function File} {@var{bool} =} isdetectable (@var{sys}, @var{tol}) +## @deftypefnx {Function File} {@var{bool} =} isdetectable (@var{a}, @var{c}) +## @deftypefnx {Function File} {@var{bool} =} isdetectable (@var{a}, @var{c}, @var{tol}) +## @deftypefnx {Function File} {@var{bool} =} isdetectable (@var{a}, @var{c}, @var{[]}, @var{dflg}) +## @deftypefnx {Function File} {@var{bool} =} isdetectable (@var{a}, @var{c}, @var{tol}, @var{dflg}) +## Logical test for system detectability. All unstable modes must be observable or +## all unobservable states must be stable. Uses SLICOT AB01OD by courtesy of NICONET e.V. +## <http://www.slicot.org> ## ## @strong{Inputs} ## @table @var @@ -36,48 +37,43 @@ ## @item tol ## Optional tolerance for stability. Default value is 0. ## @item dflg = 0 -## Matrices (a, c) are part of a continuous-time system. Default Value. +## Matrices (@var{a}, @var{c}) are part of a continuous-time system. Default Value. ## @item dflg = 1 -## Matrices (a, c) are part of a discrete-time system. +## Matrices (@var{a}, @var{c}) are part of a discrete-time system. ## @end table ## ## @strong{Outputs} ## @table @var -## @item retval = 0 +## @item bool = 0 ## System is not detectable. -## @item retval = 1 +## @item bool = 1 ## System is detectable. ## @end table ## -## See @command{isstabilizable} for detailed description of -## arguments and computational method. +## See @command{isstabilizable} for description of computational method. ## @seealso{isstabilizable, isstable, isctrb, isobsv} ## @end deftypefn -## Author: A. S. Hodel <a.s...@en...> -## Created: August 1993 -## Updated by John Ingram (in...@en...) July 1996. - -## Adapted-By: Lukas Reichlin <luk...@gm...> -## Date: October 2009 +## Author: Lukas Reichlin <luk...@gm...> +## Created: October 2009 ## Version: 0.2 -function retval = isdetectable (a, c = [], tol = [], dflg = 0) +function bool = isdetectable (a, c = [], tol = [], dflg = 0) if (nargin < 1 || nargin > 4) print_usage (); - elseif (isa (a, "lti")) # system passed + elseif (isa (a, "lti")) # isdetectable (sys), isdetectable (sys, tol) if (nargin > 2) print_usage (); endif tol = c; dflg = isdt (a); [a, b, c] = ssdata (a); - elseif (nargin == 1) # a,c arguments sent directly - print_usage (); # a,c dimension checked inside isstabilizable + elseif (nargin == 1) # isdetectable (a, c, ...) + print_usage (); endif - retval = isstabilizable (a.', c.', tol, dflg); + bool = isstabilizable (a.', c.', tol, dflg); # arguments checked inside endfunction Modified: trunk/octave-forge/main/control/inst/isobsv.m =================================================================== --- trunk/octave-forge/main/control/inst/isobsv.m 2010-09-05 05:54:14 UTC (rev 7658) +++ trunk/octave-forge/main/control/inst/isobsv.m 2010-09-05 06:42:21 UTC (rev 7659) @@ -1,26 +1,25 @@ -## Copyright (C) 1993, 1994, 1995, 2000, 2002, 2004, 2005, 2006, 2007 -## Auburn University. All rights reserved. +## Copyright (C) 2009 - 2010 Lukas F. Reichlin ## +## This file is part of LTI Syncope. ## -## This program is free software; you can redistribute it and/or modify it -## under the terms of the GNU General Public License as published by -## the Free Software Foundation; either version 3 of the License, or (at -## your option) any later version. +## LTI Syncope is free software: you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation, either version 3 of the License, or +## (at your option) any later version. ## -## This program is distributed in the hope that it will be useful, but -## WITHOUT ANY WARRANTY; without even the implied warranty of -## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -## General Public License for more details. +## LTI Syncope is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License -## along with this program; see the file COPYING. If not, see -## <http://www.gnu.org/licenses/>. +## along with this program. If not, see <http://www.gnu.org/licenses/>. ## -*- texinfo -*- -## @deftypefn {Function File} {[@var{retval}, @var{u}] =} isobsv (@var{sys}) -## @deftypefnx {Function File} {[@var{retval}, @var{u}] =} isobsv (@var{sys}, @var{tol}) -## @deftypefnx {Function File} {[@var{retval}, @var{u}] =} isobsv (@var{a}, @var{c}) -## @deftypefnx {Function File} {[@var{retval}, @var{u}] =} isobsv (@var{a}, @var{c}, @var{tol}) +## @deftypefn {Function File} {[@var{bool}, @var{u}] =} isobsv (@var{sys}) +## @deftypefnx {Function File} {[@var{bool}, @var{u}] =} isobsv (@var{sys}, @var{tol}) +## @deftypefnx {Function File} {[@var{bool}, @var{u}] =} isobsv (@var{a}, @var{c}) +## @deftypefnx {Function File} {[@var{bool}, @var{u}] =} isobsv (@var{a}, @var{c}, @var{tol}) ## Logical check for system observability. ## Uses SLICOT AB01OD by courtesy of NICONET e.V. ## <http://www.slicot.org> @@ -39,8 +38,10 @@ ## ## @strong{Outputs} ## @table @var -## @item retval -## Logical flag; true (1) if the system is observable. +## @item bool = 0 +## System is not observable. +## @item bool = 1 +## System is observable. ## @item u ## An orthogonal basis of the observable subspace. ## @end table @@ -48,32 +49,28 @@ ## @seealso{isctrb} ## @end deftypefn -## Author: A. S. Hodel <a.s...@en...> -## Created: August 1993 -## Updated by John Ingram (in...@en...) July 1996. - -## Adapted-By: Lukas Reichlin <luk...@gm...> -## Date: October 2009 +## Author: Lukas Reichlin <luk...@gm...> +## Created: October 2009 ## Version: 0.2 -function [retval, U] = isobsv (A, C = [], tol = []) +function [bool, u] = isobsv (a, c = [], tol = []) if (nargin < 1 || nargin > 3) print_usage (); - elseif (isa (A, "lti")) # isobsv (sys), isobsv (sys, tol) + elseif (isa (a, "lti")) # isobsv (sys), isobsv (sys, tol) if (nargin > 2) print_usage (); endif - tol = C; - [A, B, C] = ssdata (A); - elseif (nargin < 2) # isobsv (A, C), isobsv (A, C, tol) + tol = c; + [a, b, c] = ssdata (a); + elseif (nargin < 2) # isobsv (a, c), isobsv (a, c, tol) print_usage (); endif if (isempty (tol)) - [retval, U] = isctrb (A.', C.'); + [bool, u] = isctrb (a.', c.'); else - [retval, U] = isctrb (A.', C.', tol); + [bool, u] = isctrb (a.', c.', tol); endif endfunction Modified: trunk/octave-forge/main/control/inst/isstabilizable.m =================================================================== --- trunk/octave-forge/main/control/inst/isstabilizable.m 2010-09-05 05:54:14 UTC (rev 7658) +++ trunk/octave-forge/main/control/inst/isstabilizable.m 2010-09-05 06:42:21 UTC (rev 7659) @@ -1,29 +1,30 @@ -## Copyright (C) 1998, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007 -## Kai P. Mueller. +## Copyright (C) 2009 - 2010 Lukas F. Reichlin ## +## This file is part of LTI Syncope. ## -## This program is free software; you can redistribute it and/or modify it -## under the terms of the GNU General Public License as published by -## the Free Software Foundation; either version 3 of the License, or (at -## your option) any later version. +## LTI Syncope is free software: you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation, either version 3 of the License, or +## (at your option) any later version. ## -## This program is distributed in the hope that it will be useful, but -## WITHOUT ANY WARRANTY; without even the implied warranty of -## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -## General Public License for more details. +## LTI Syncope is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. ## ## You should have received a copy of the GNU General Public License -## along with this program; see the file COPYING. If not, see -## <http://www.gnu.org/licenses/>. +## along with this program. If not, see <http://www.gnu.org/licenses/>. ## -*- texinfo -*- -## @deftypefn {Function File} {@var{retval} =} isstabilizable (@var{sys}) -## @deftypefnx {Function File} {@var{retval} =} isstabilizable (@var{sys}, @var{tol}) -## @deftypefnx {Function File} {@var{retval} =} isstabilizable (@var{a}, @var{b}) -## @deftypefnx {Function File} {@var{retval} =} isstabilizable (@var{a}, @var{b}, @var{tol}) -## @deftypefnx {Function File} {@var{retval} =} isstabilizable (@var{a}, @var{b}, @var{[]}, @var{dflg}) -## @deftypefnx {Function File} {@var{retval} =} isstabilizable (@var{a}, @var{b}, @var{tol}, @var{dflg}) -## Logical check for system stabilizability (i.e., all unstable modes are controllable). +## @deftypefn {Function File} {@var{bool} =} isstabilizable (@var{sys}) +## @deftypefnx {Function File} {@var{bool} =} isstabilizable (@var{sys}, @var{tol}) +## @deftypefnx {Function File} {@var{bool} =} isstabilizable (@var{a}, @var{b}) +## @deftypefnx {Function File} {@var{bool} =} isstabilizable (@var{a}, @var{b}, @var{tol}) +## @deftypefnx {Function File} {@var{bool} =} isstabilizable (@var{a}, @var{b}, @var{[]}, @var{dflg}) +## @deftypefnx {Function File} {@var{bool} =} isstabilizable (@var{a}, @var{b}, @var{tol}, @var{dflg}) +## Logical check for system stabilizability. All unstable modes must be controllable or +## all uncontrollable states must be stable. Uses SLICOT AB01OD by courtesy of NICONET e.V. +## <http://www.slicot.org> ## ## @strong{Inputs} ## @table @var @@ -36,16 +37,16 @@ ## @item tol ## Optional tolerance for stability. Default value is 0. ## @item dflg = 0 -## Matrices (a, b) are part of a continuous-time system. Default Value. +## Matrices (@var{a}, @var{b}) are part of a continuous-time system. Default Value. ## @item dflg = 1 -## Matrices (a, b) are part of a discrete-time system. +## Matrices (@var{a}, @var{b}) are part of a discrete-time system. ## @end table ## ## @strong{Outputs} ## @table @var -## @item retval = 0 +## @item bool = 0 ## System is not stabilizable. -## @item retval = 1 +## @item bool = 1 ## System is stabilizable. ## @end table ## @@ -63,27 +64,22 @@ ## @seealso{isdetectable, isstable, isctrb, isobsv} ## @end deftypefn -## Author: A. S. Hodel <a.s...@en...> -## Created: August 1993 -## Updated by A. S. Hodel (sc...@en...) Aubust, 1995 to use krylovb -## Updated by John Ingram (in...@en...) July, 1996 to accept systems - -## Adapted-By: Lukas Reichlin <luk...@gm...> -## Date: October 2009 +## Author: Lukas Reichlin <luk...@gm...> +## Created: October 2009 ## Version: 0.2 -function retval = isstabilizable (a, b = [], tol = [], dflg = 0) +function bool = isstabilizable (a, b = [], tol = [], dflg = 0) if (nargin < 1 || nargin > 4) print_usage (); - elseif (isa (a, "lti")) # system passed + elseif (isa (a, "lti")) # isstabilizable (sys), isstabilizable (sys, tol) if (nargin > 2) print_usage (); endif tol = b; dflg = isdt (a); [a, b] = ssdata (a); - elseif (nargin == 1) # a,b arguments sent directly + elseif (nargin == 1) # isstabilizable (a, b, ...) print_usage (); elseif (! issquare (a) || rows (a) != rows (b)) error ("isstabilizable: a must be square and conformal to b") @@ -105,9 +101,9 @@ ## check whether uncontrollable poles are stable if (dflg) - retval = all (abs (eigw) < 1 - tol); + bool = all (abs (eigw) < 1 - tol); else - retval = all (real (eigw) < -tol*(1 + abs (eigw))); + bool = all (real (eigw) < -tol*(1 + abs (eigw))); endif endfunction This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <par...@us...> - 2010-09-05 07:00:48
|
Revision: 7660 http://octave.svn.sourceforge.net/octave/?rev=7660&view=rev Author: paramaniac Date: 2010-09-05 07:00:41 +0000 (Sun, 05 Sep 2010) Log Message: ----------- control: reformat example Modified Paths: -------------- trunk/octave-forge/main/control/inst/optiPID.m Added Paths: ----------- trunk/octave-forge/main/control/inst/optiPIDfun.m Removed Paths: ------------- trunk/octave-forge/main/control/inst/optiPIDfunction.m Modified: trunk/octave-forge/main/control/inst/optiPID.m =================================================================== --- trunk/octave-forge/main/control/inst/optiPID.m 2010-09-05 06:42:21 UTC (rev 7659) +++ trunk/octave-forge/main/control/inst/optiPID.m 2010-09-05 07:00:41 UTC (rev 7660) @@ -1,12 +1,13 @@ +% =================================================================================== +% optiPID Lukas Reichlin July 2009 +% =================================================================================== % Numerical Optimization of an A/H PID Controller -% Written by Lukas Reichlin July 2009 % Required OCTAVE Packages: control, miscellaneous, optim % Required MATLAB Toolboxes: Control, Optimization +% =================================================================================== % Tabula Rasa -clear all; -close all; -clc; +clear all, close all, clc; % Global Variables global P t dt mu_1 mu_2 mu_3 @@ -18,8 +19,8 @@ % Relative Weighting Factors: PLAY AROUND WITH THESE! mu_1 = 1; % Minimize ITAE Criterion -mu_2 = 1; % Minimize Max Overshoot -mu_3 = 1; % Minimize Sensitivity Ms +mu_2 = 10; % Minimize Max Overshoot +mu_3 = 20; % Minimize Sensitivity Ms % Simulation Settings: PLANT-DEPENDENT! t_sim = 30; % Simulation Time [s] @@ -53,7 +54,7 @@ error ('optiPID: please install optim package to proceed'); end -C_par_opt = fminsearch (@optiPIDfunction, C_par_0); +C_par_opt = fminsearch (@optiPIDfun, C_par_0); % Optimized Controller disp ('optiPID: optimized PID controller parameters:'); @@ -95,3 +96,5 @@ xlabel ('Time [s]') ylabel ('Output [-]') legend ('A/H', 'Optimized', 'Location', 'SouthEast') + +% =================================================================================== Added: trunk/octave-forge/main/control/inst/optiPIDfun.m =================================================================== --- trunk/octave-forge/main/control/inst/optiPIDfun.m (rev 0) +++ trunk/octave-forge/main/control/inst/optiPIDfun.m 2010-09-05 07:00:41 UTC (rev 7660) @@ -0,0 +1,59 @@ +% =================================================================================== +% optiPIDfun Lukas Reichlin July 2009 +% =================================================================================== +% Objective Function +% See "Analysis and Synthesis of SISO Control Systems" +% by Lino Guzzella for further details +% =================================================================================== + +function J = optiPIDfun (C_par) + + % Global Variables + global P t dt mu_1 mu_2 mu_3 + + % Function Argument -> Controller Parameters + kp = C_par(1); + Ti = C_par(2); + Td = C_par(3); + tau = Td / 10; + + % PID Controller with Roll-Off + numC = kp * [Ti * Td, Ti, 1]; + denC = conv ([Ti, 0], [tau^2, 2 * tau, 1]); + C = tf (numC, denC); + + % Open Loop + L = P * C; + + % Sum Block: e = r - y + SUM = ss ([1, -1]); % Matlab converts to SS (and back) for MIMO TF connections + + % Group Sum Block and Open Loop + SUML = append (SUM, L); + + % Build System Interconnections + CM = [3, 1; % Controller Input with Sum Block Output + 2, 2]; % Sum Block Negative Input with Plant Output + + inputs = [1]; % Input 1: reference r(t) + outputs = [1, 2]; % Output 1: error e(t), Output 2: output y(t) + + SUML = connect (SUML, CM, inputs, outputs); + + % Simulation + [y, t_y] = step (SUML, t); + + % ITAE Criterion + itae = dt * (t_y.' * abs (y(:, 1))); + + % Sensitivity + S = inv (1 + L); + Ms = norm (S, inf); + + % Objective Function + J = mu_1 * itae + mu_2 * (max (y(:, 2)) - 1) + mu_3 * Ms; + +end % function + +% =================================================================================== + Deleted: trunk/octave-forge/main/control/inst/optiPIDfunction.m =================================================================== --- trunk/octave-forge/main/control/inst/optiPIDfunction.m 2010-09-05 06:42:21 UTC (rev 7659) +++ trunk/octave-forge/main/control/inst/optiPIDfunction.m 2010-09-05 07:00:41 UTC (rev 7660) @@ -1,50 +0,0 @@ -function J = optiPIDfunction (C_par) - -% Objective Function -% written by Lukas Reichlin -% See "Analysis and Synthesis of SISO Control Systems" -% by Lino Guzzella for further details - -global P t dt mu_1 mu_2 mu_3 - -% Function Argument -> Controller Parameters -kp = C_par(1); -Ti = C_par(2); -Td = C_par(3); -tau = Td / 10; - -% PID Controller with Roll-Off -numC = kp * [Ti * Td, Ti, 1]; -denC = conv ([Ti, 0], [tau^2, 2 * tau, 1]); -C = tf (numC, denC); - -% Open Loop -L = P * C; - -% Sum Block: e = r - y -SUM = ss ([1, -1]); % Matlab converts to SS (and back) for MIMO TF connections - -% Group Sum Block and Open Loop -SUML = append (SUM, L); - -% Build System Interconnections -CM = [3, 1; % Controller Input with Sum Block Output - 2, 2]; % Sum Block Negative Input with Plant Output - -inputs = [1]; % Input 1: reference r(t) -outputs = [1, 2]; % Output 1: error e(t), Output 2: output y(t) - -SUML = connect (SUML, CM, inputs, outputs); - -% Simulation -[y, t_y] = step (SUML, t); - -% ITAE Criterion -itae = dt * (t_y.' * abs (y(:, 1))); - -% Sensitivity -S = inv (1 + L); -Ms = norm (S, inf); - -% Objective Function -J = mu_1 * itae + mu_2 * (max (y(:, 2)) - 1) + mu_3 * Ms; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <par...@us...> - 2010-09-05 07:07:00
|
Revision: 7661 http://octave.svn.sourceforge.net/octave/?rev=7661&view=rev Author: paramaniac Date: 2010-09-05 07:06:52 +0000 (Sun, 05 Sep 2010) Log Message: ----------- control: shorten to 80 characters after % Modified Paths: -------------- trunk/octave-forge/main/control/inst/optiPID.m trunk/octave-forge/main/control/inst/optiPIDfun.m Modified: trunk/octave-forge/main/control/inst/optiPID.m =================================================================== --- trunk/octave-forge/main/control/inst/optiPID.m 2010-09-05 07:00:41 UTC (rev 7660) +++ trunk/octave-forge/main/control/inst/optiPID.m 2010-09-05 07:06:52 UTC (rev 7661) @@ -1,10 +1,10 @@ -% =================================================================================== -% optiPID Lukas Reichlin July 2009 -% =================================================================================== +% =============================================================================== +% optiPID Lukas Reichlin July 2009 +% =============================================================================== % Numerical Optimization of an A/H PID Controller % Required OCTAVE Packages: control, miscellaneous, optim % Required MATLAB Toolboxes: Control, Optimization -% =================================================================================== +% =============================================================================== % Tabula Rasa clear all, close all, clc; @@ -97,4 +97,4 @@ ylabel ('Output [-]') legend ('A/H', 'Optimized', 'Location', 'SouthEast') -% =================================================================================== +% =============================================================================== Modified: trunk/octave-forge/main/control/inst/optiPIDfun.m =================================================================== --- trunk/octave-forge/main/control/inst/optiPIDfun.m 2010-09-05 07:00:41 UTC (rev 7660) +++ trunk/octave-forge/main/control/inst/optiPIDfun.m 2010-09-05 07:06:52 UTC (rev 7661) @@ -1,10 +1,10 @@ -% =================================================================================== -% optiPIDfun Lukas Reichlin July 2009 -% =================================================================================== +% =============================================================================== +% optiPIDfun Lukas Reichlin July 2009 +% =============================================================================== % Objective Function % See "Analysis and Synthesis of SISO Control Systems" % by Lino Guzzella for further details -% =================================================================================== +% =============================================================================== function J = optiPIDfun (C_par) @@ -55,5 +55,5 @@ end % function -% =================================================================================== +% =============================================================================== This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |