From: <par...@us...> - 2010-09-05 08:40:49
|
Revision: 7663 http://octave.svn.sourceforge.net/octave/?rev=7663&view=rev Author: paramaniac Date: 2010-09-05 08:40:38 +0000 (Sun, 05 Sep 2010) Log Message: ----------- control: forgotten changes Modified Paths: -------------- trunk/octave-forge/main/control/inst/@lti/subsasgn.m trunk/octave-forge/main/control/inst/@tf/tf.m trunk/octave-forge/main/control/inst/__ssmatdim__.m Modified: trunk/octave-forge/main/control/inst/@lti/subsasgn.m =================================================================== --- trunk/octave-forge/main/control/inst/@lti/subsasgn.m 2010-09-05 07:35:40 UTC (rev 7662) +++ trunk/octave-forge/main/control/inst/@lti/subsasgn.m 2010-09-05 08:40:38 UTC (rev 7663) @@ -25,6 +25,8 @@ function sys = subsasgn (sys, idx, val) + ## TODO: enable stuff like sys.a(2, 1:3) = [4, 5, 6] + switch (idx.type) case "." sys = set (sys, idx.subs, val); Modified: trunk/octave-forge/main/control/inst/@tf/tf.m =================================================================== --- trunk/octave-forge/main/control/inst/@tf/tf.m 2010-09-05 07:35:40 UTC (rev 7662) +++ trunk/octave-forge/main/control/inst/@tf/tf.m 2010-09-05 08:40:38 UTC (rev 7663) @@ -42,6 +42,13 @@ ## Transfer function model. ## @end table ## +## @example +## @group +## s = tf ("s"); +## G = 1/(s+1) +## @end group +## @end example +## ## @seealso{ss} ## @end deftypefn Modified: trunk/octave-forge/main/control/inst/__ssmatdim__.m =================================================================== --- trunk/octave-forge/main/control/inst/__ssmatdim__.m 2010-09-05 07:35:40 UTC (rev 7662) +++ trunk/octave-forge/main/control/inst/__ssmatdim__.m 2010-09-05 08:40:38 UTC (rev 7663) @@ -21,7 +21,7 @@ ## Author: Lukas Reichlin <luk...@gm...> ## Created: September 2009 -## Version: 0.1 +## Version: 0.2 function [m, n, p] = __ssmatdim__ (a, b, c, d) @@ -58,4 +58,8 @@ crows, ccols, drows, dcols); endif + if (! isreal (a) || ! isreal (b) || ! isreal (c) || ! isreal (d)) + error ("ss: system matrices are not real"); + 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-08 01:09:36
|
Revision: 7681 http://octave.svn.sourceforge.net/octave/?rev=7681&view=rev Author: paramaniac Date: 2010-09-08 01:09:30 +0000 (Wed, 08 Sep 2010) Log Message: ----------- control: style cosmetics Modified Paths: -------------- trunk/octave-forge/main/control/inst/h2syn.m trunk/octave-forge/main/control/inst/hinfsyn.m Modified: trunk/octave-forge/main/control/inst/h2syn.m =================================================================== --- trunk/octave-forge/main/control/inst/h2syn.m 2010-09-07 23:48:21 UTC (rev 7680) +++ trunk/octave-forge/main/control/inst/h2syn.m 2010-09-08 01:09:30 UTC (rev 7681) @@ -108,11 +108,11 @@ d(1:p1, 1:m1) = 0; endif - if (! isstabilizable (P(:, m1+1 : m))) + if (! isstabilizable (P(:, m1+1:m))) error ("h2syn: (A, B2) must be stabilizable"); endif - if (! isdetectable (P(p1+1 : p, :))) + if (! isdetectable (P(p1+1:p, :))) error ("h2syn: (C2, A) must be detectable"); endif Modified: trunk/octave-forge/main/control/inst/hinfsyn.m =================================================================== --- trunk/octave-forge/main/control/inst/hinfsyn.m 2010-09-07 23:48:21 UTC (rev 7680) +++ trunk/octave-forge/main/control/inst/hinfsyn.m 2010-09-08 01:09:30 UTC (rev 7681) @@ -111,11 +111,11 @@ m1 = m - ncon; p1 = p - nmeas; - if (! isstabilizable (P(:, m1+1 : m))) + if (! isstabilizable (P(:, m1+1:m))) error ("hinfsyn: (A, B2) must be stabilizable"); endif - if (! isdetectable (P(p1+1 : p, :))) + if (! isdetectable (P(p1+1:p, :))) error ("hinfsyn: (C2, A) must be detectable"); endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <par...@us...> - 2010-09-08 19:44:17
|
Revision: 7688 http://octave.svn.sourceforge.net/octave/?rev=7688&view=rev Author: paramaniac Date: 2010-09-08 19:44:11 +0000 (Wed, 08 Sep 2010) Log Message: ----------- control: switch back to old minreal code until segfault problem is solved Modified Paths: -------------- trunk/octave-forge/main/control/inst/@ss/__minreal__.m trunk/octave-forge/main/control/inst/ltimodels.m Added Paths: ----------- trunk/octave-forge/main/control/inst/test_minreal.m Modified: trunk/octave-forge/main/control/inst/@ss/__minreal__.m =================================================================== --- trunk/octave-forge/main/control/inst/@ss/__minreal__.m 2010-09-08 18:39:23 UTC (rev 7687) +++ trunk/octave-forge/main/control/inst/@ss/__minreal__.m 2010-09-08 19:44:11 UTC (rev 7688) @@ -22,7 +22,7 @@ ## Author: Lukas Reichlin <luk...@gm...> ## Created: October 2009 ## Version: 0.2 - +%{ function retsys = __minreal__ (sys, tol) if (tol == "def") @@ -37,3 +37,62 @@ retsys.lti = sys.lti; # retain i/o names and tsam endfunction +%} + +## ============================================================================== +## TODO: Fix frequent segfaults in sltb01pd.oct, afterwards delete the code below +## ============================================================================== + +## Algorithm based on sysmin by A. Scottedward Hodel +## Author: Lukas Reichlin <luk...@gm...> +## Created: October 2009 +## Version: 0.1 + +function retsys = __minreal__ (sys, tol) + + A = sys.a; + B = sys.b; + C = sys.c; + + if (! isempty (A)) + if (tol == "def") + [cflg, Uc] = isctrb (A, B); + else + [cflg, Uc] = isctrb (A, B, tol); + endif + + if (! cflg) + if (! isempty (Uc)) + A = Uc.' * A * Uc; + B = Uc.' * B; + C = C * Uc; + else + A = B = C = []; + endif + endif + endif + + if (! isempty (A)) + if (tol == "def") + [oflg, Uo] = isobsv (A, C); + else + [oflg, Uo] = isobsv (A, C, tol); + endif + + if (! oflg) + if (! isempty (Uo)) + A = Uo.' * A * Uo; + B = Uo.' * B; + C = C * Uo; + else + A = B = C = []; + endif + endif + endif + + retsys = ss (A, B, C, sys.d); + retsys.lti = sys.lti; # retain i/o names and tsam + +endfunction + +## ============================================================================== Modified: trunk/octave-forge/main/control/inst/ltimodels.m =================================================================== --- trunk/octave-forge/main/control/inst/ltimodels.m 2010-09-08 18:39:23 UTC (rev 7687) +++ trunk/octave-forge/main/control/inst/ltimodels.m 2010-09-08 19:44:11 UTC (rev 7688) @@ -1,4 +1,5 @@ -## Copyright (C) 2009 Luca Favatella +## Copyright (C) 2009 Luca Favatella +## Copyright (C) 2009 - 2010 Lukas Reichlin ## ## This file is part of LTI Syncope. ## @@ -32,6 +33,8 @@ print_usage (); %endif + ## TODO: write documentation + if (! ischar (systype)) error ("ltimodels: argument must be a string"); endif @@ -282,38 +285,38 @@ %!assert (Bc, Bce, 1e-4); ## ss: minreal (SLICOT TB01PD) -%!shared M, Me -%! A = [ 1.0 2.0 0.0 -%! 4.0 -1.0 0.0 -%! 0.0 0.0 1.0 ]; -%! -%! B = [ 1.0 -%! 0.0 -%! 1.0 ]; -%! -%! C = [ 0.0 1.0 -1.0 -%! 0.0 0.0 1.0 ]; -%! -%! D = zeros (2, 1); -%! -%! sys = ss (A, B, C, D); -%! sysmin = minreal (sys, 0.0); -%! [Ar, Br, Cr, Dr] = ssdata (sysmin); -%! M = [Ar, Br; Cr, Dr]; -%! -%! Ae = [ 1.0000 -1.4142 1.4142 -%! -2.8284 0.0000 1.0000 -%! 2.8284 1.0000 0.0000 ]; -%! -%! Be = [-1.0000 -%! 0.7071 -%! 0.7071 ]; -%! -%! Ce = [ 0.0000 0.0000 -1.4142 -%! 0.0000 0.7071 0.7071 ]; -%! -%! De = zeros (2, 1); -%! -%! Me = [Ae, Be; Ce, De]; -%! -%!assert (M, Me, 1e-4); +#%!shared M, Me +#%! A = [ 1.0 2.0 0.0 +#%! 4.0 -1.0 0.0 +#%! 0.0 0.0 1.0 ]; +#%! +#%! B = [ 1.0 +#%! 0.0 +#%! 1.0 ]; +#%! +#%! C = [ 0.0 1.0 -1.0 +#%! 0.0 0.0 1.0 ]; +#%! +#%! D = zeros (2, 1); +#%! +#%! sys = ss (A, B, C, D); +#%! sysmin = minreal (sys, 0.0); +#%! [Ar, Br, Cr, Dr] = ssdata (sysmin); +#%! M = [Ar, Br; Cr, Dr]; +#%! +#%! Ae = [ 1.0000 -1.4142 1.4142 +#%! -2.8284 0.0000 1.0000 +#%! 2.8284 1.0000 0.0000 ]; +#%! +#%! Be = [-1.0000 +#%! 0.7071 +#%! 0.7071 ]; +#%! +#%! Ce = [ 0.0000 0.0000 -1.4142 +#%! 0.0000 0.7071 0.7071 ]; +#%! +#%! De = zeros (2, 1); +#%! +#%! Me = [Ae, Be; Ce, De]; +#%! +#%!assert (M, Me, 1e-4); Added: trunk/octave-forge/main/control/inst/test_minreal.m =================================================================== --- trunk/octave-forge/main/control/inst/test_minreal.m (rev 0) +++ trunk/octave-forge/main/control/inst/test_minreal.m 2010-09-08 19:44:11 UTC (rev 7688) @@ -0,0 +1,58 @@ +## ============================================================================== +## The tests below usually segfault after consecutive calls +## ============================================================================== + +test test_minreal + +## ss: minreal +%!shared Ar, Br, Cr +%! +%! A = [ -2 -2.4 +%! 0 -4.4 ]; +%! +%! B = [ 0.6 +%! 0.6 ]; +%! +%! C = [ 4 -4 ]; +%! +%! [Ar, Br, Cr, nr] = sltb01pd (A, B, C, 0); +%! +%!assert (isempty (Ar), true); +%!assert (isempty (Br), true); +%!assert (isempty (Cr), true); + + +## ss: minreal (SLICOT TB01PD) +%!shared M, Me +%! A = [ 1.0 2.0 0.0 +%! 4.0 -1.0 0.0 +%! 0.0 0.0 1.0 ]; +%! +%! B = [ 1.0 +%! 0.0 +%! 1.0 ]; +%! +%! C = [ 0.0 1.0 -1.0 +%! 0.0 0.0 1.0 ]; +%! +%! D = zeros (2, 1); +%! +%! [Ar, Br, Cr, nr] = sltb01pd (A, B, C, 0.0); +%! M = [Ar, Br; Cr, D]; +%! +%! Ae = [ 1.0000 -1.4142 1.4142 +%! -2.8284 0.0000 1.0000 +%! 2.8284 1.0000 0.0000 ]; +%! +%! Be = [-1.0000 +%! 0.7071 +%! 0.7071 ]; +%! +%! Ce = [ 0.0000 0.0000 -1.4142 +%! 0.0000 0.7071 0.7071 ]; +%! +%! De = zeros (2, 1); +%! +%! Me = [Ae, Be; Ce, De]; +%! +%!assert (M, Me, 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-09-08 23:48:37
|
Revision: 7689 http://octave.svn.sourceforge.net/octave/?rev=7689&view=rev Author: paramaniac Date: 2010-09-08 23:48:31 +0000 (Wed, 08 Sep 2010) Log Message: ----------- control: replace for-loops by cellfun Modified Paths: -------------- trunk/octave-forge/main/control/inst/@lti/tfdata.m trunk/octave-forge/main/control/inst/@tf/__get__.m trunk/octave-forge/main/control/inst/__conv2tfpolycell__.m Modified: trunk/octave-forge/main/control/inst/@lti/tfdata.m =================================================================== --- trunk/octave-forge/main/control/inst/@lti/tfdata.m 2010-09-08 19:44:11 UTC (rev 7688) +++ trunk/octave-forge/main/control/inst/@lti/tfdata.m 2010-09-08 23:48:31 UTC (rev 7689) @@ -1,4 +1,4 @@ -## Copyright (C) 2009 Lukas F. Reichlin +## Copyright (C) 2009 - 2010 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## @@ -23,7 +23,7 @@ ## Author: Lukas Reichlin <luk...@gm...> ## Created: September 2009 -## Version: 0.1 +## Version: 0.2 function [num, den, tsam] = tfdata (sys, rtype = "vector") @@ -38,10 +38,8 @@ tsam = sys.tsam; if (rtype == "vector") - for k = 1 : numel (num) - num(k) = get (num{k}); - den(k) = get (den{k}); - endfor + num = cellfun ("@tfpoly/get", num, "UniformOutput", false); + den = cellfun ("@tfpoly/get", den, "UniformOutput", false); endif endfunction \ No newline at end of file Modified: trunk/octave-forge/main/control/inst/@tf/__get__.m =================================================================== --- trunk/octave-forge/main/control/inst/@tf/__get__.m 2010-09-08 19:44:11 UTC (rev 7688) +++ trunk/octave-forge/main/control/inst/@tf/__get__.m 2010-09-08 23:48:31 UTC (rev 7689) @@ -1,4 +1,4 @@ -## Copyright (C) 2009 Lukas F. Reichlin +## Copyright (C) 2009 - 2010 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## @@ -20,31 +20,19 @@ ## Author: Lukas Reichlin <luk...@gm...> ## Created: October 2009 -## Version: 0.1 +## Version: 0.2 function val = __get__ (sys, prop) switch (prop) # {<internal name>, <user name>} case "num" - val = sys.num; - - for k = 1 : numel (val) - val(k) = get (val{k}); - endfor - + val = cellfun ("@tfpoly/get", sys.num, "UniformOutput", false); case "den" - val = sys.den; - - for k = 1 : numel (val) - val(k) = get (val{k}); - endfor - + val = cellfun ("@tfpoly/get", sys.den, "UniformOutput", false); case {"tfvar", "variable"} val = sys.tfvar; - otherwise error ("get: invalid property name"); - endswitch endfunction \ No newline at end of file Modified: trunk/octave-forge/main/control/inst/__conv2tfpolycell__.m =================================================================== --- trunk/octave-forge/main/control/inst/__conv2tfpolycell__.m 2010-09-08 19:44:11 UTC (rev 7688) +++ trunk/octave-forge/main/control/inst/__conv2tfpolycell__.m 2010-09-08 23:48:31 UTC (rev 7689) @@ -1,4 +1,4 @@ -## Copyright (C) 2009 Lukas F. Reichlin +## Copyright (C) 2009 - 2010 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## @@ -21,7 +21,7 @@ ## Author: Lukas Reichlin <luk...@gm...> ## Created: October 2009 -## Version: 0.1 +## Version: 0.2 function ndr = __conv2tfpolycell__ (nd) @@ -29,12 +29,6 @@ nd = {nd}; endif - [ndrows, ndcols] = size (nd); + ndr = cellfun (@tfpoly, nd, "UniformOutput", false); - ndr = cell (ndrows, ndcols); - - for k = 1 : (ndrows*ndcols) - ndr{k} = tfpoly (nd{k}); - endfor - endfunction \ 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-09 06:17:25
|
Revision: 7690 http://octave.svn.sourceforge.net/octave/?rev=7690&view=rev Author: paramaniac Date: 2010-09-09 06:17:17 +0000 (Thu, 09 Sep 2010) Log Message: ----------- control: enhance doc 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-08 23:48:31 UTC (rev 7689) +++ trunk/octave-forge/main/control/inst/dlqr.m 2010-09-09 06:17:17 UTC (rev 7690) @@ -33,7 +33,7 @@ ## @item q ## State weighting matrix. ## @item r -## Control weighting matrix. +## Input weighting matrix. ## @item s ## Optional cross term matrix. If @var{s} is not specified, a zero matrix is assumed. ## @end table @@ -52,9 +52,9 @@ ## @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 +## inf +## J(x0) = SUM (x' Q x + u' R u + 2 x' S u) +## k=0 ## ## L = eig (A - B*G) ## @end group Modified: trunk/octave-forge/main/control/inst/lqr.m =================================================================== --- trunk/octave-forge/main/control/inst/lqr.m 2010-09-08 23:48:31 UTC (rev 7689) +++ trunk/octave-forge/main/control/inst/lqr.m 2010-09-09 06:17:17 UTC (rev 7690) @@ -33,7 +33,7 @@ ## @item q ## State weighting matrix. ## @item r -## Control weighting matrix. +## Input weighting matrix. ## @item s ## Optional cross term matrix. If @var{s} is not specified, a zero matrix is assumed. ## @end table @@ -53,9 +53,9 @@ ## . ## x = A x + B u, x(0) = x0 ## -## /inf -## J(x0) = | (x' Q x + u' R u + 2 x' S u) dt -## /0 +## inf +## J(x0) = INT (x' Q x + u' R u + 2 x' S u) dt +## 0 ## ## L = eig (A - B*G) ## @end group This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <par...@us...> - 2010-09-09 06:46:28
|
Revision: 7691 http://octave.svn.sourceforge.net/octave/?rev=7691&view=rev Author: paramaniac Date: 2010-09-09 06:46:21 +0000 (Thu, 09 Sep 2010) Log Message: ----------- control: texinfo seealso Modified Paths: -------------- trunk/octave-forge/main/control/inst/bode.m trunk/octave-forge/main/control/inst/bodemag.m trunk/octave-forge/main/control/inst/nichols.m trunk/octave-forge/main/control/inst/nyquist.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-09 06:17:17 UTC (rev 7690) +++ trunk/octave-forge/main/control/inst/bode.m 2010-09-09 06:46:21 UTC (rev 7691) @@ -40,7 +40,7 @@ ## Vector of frequency values used. ## @end table ## -## @seealso{nichols, nyquist, svd} +## @seealso{nichols, nyquist, sigma} ## @end deftypefn ## Author: Lukas Reichlin <luk...@gm...> Modified: trunk/octave-forge/main/control/inst/bodemag.m =================================================================== --- trunk/octave-forge/main/control/inst/bodemag.m 2010-09-09 06:17:17 UTC (rev 7690) +++ trunk/octave-forge/main/control/inst/bodemag.m 2010-09-09 06:46:21 UTC (rev 7691) @@ -38,7 +38,7 @@ ## Vector of frequency values used. ## @end table ## -## @seealso{bode, nichols, nyquist, svd} +## @seealso{bode, nichols, nyquist, sigma} ## @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-09 06:17:17 UTC (rev 7690) +++ trunk/octave-forge/main/control/inst/nichols.m 2010-09-09 06:46:21 UTC (rev 7691) @@ -40,7 +40,7 @@ ## Vector of frequency values used. ## @end table ## -## @seealso{bode, nyquist, svd} +## @seealso{bode, nyquist, sigma} ## @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-09 06:17:17 UTC (rev 7690) +++ trunk/octave-forge/main/control/inst/nyquist.m 2010-09-09 06:46:21 UTC (rev 7691) @@ -40,7 +40,7 @@ ## Vector of frequency values used. ## @end table ## -## @seealso{bode, nichols, svd} +## @seealso{bode, nichols, sigma} ## @end deftypefn ## Author: Lukas Reichlin <luk...@gm...> Modified: trunk/octave-forge/main/control/inst/sigma.m =================================================================== --- trunk/octave-forge/main/control/inst/sigma.m 2010-09-09 06:17:17 UTC (rev 7690) +++ trunk/octave-forge/main/control/inst/sigma.m 2010-09-09 06:46:21 UTC (rev 7691) @@ -26,7 +26,7 @@ ## @strong{Inputs} ## @table @var ## @item sys -## LTI system. Multiple inputs and/or outputs (MIMO systems) would make practical sense. +## LTI system. Multiple inputs and/or outputs (MIMO systems) 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. @@ -52,7 +52,7 @@ ## Vector of frequency values used. ## @end table ## -## @seealso{bode, svd} +## @seealso{bodemag, svd} ## @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-09 23:42:59
|
Revision: 7696 http://octave.svn.sourceforge.net/octave/?rev=7696&view=rev Author: paramaniac Date: 2010-09-09 23:42:53 +0000 (Thu, 09 Sep 2010) Log Message: ----------- control: add tests adapted from slicot Modified Paths: -------------- trunk/octave-forge/main/control/inst/@ss/__sysconnect__.m trunk/octave-forge/main/control/inst/ltimodels.m Modified: trunk/octave-forge/main/control/inst/@ss/__sysconnect__.m =================================================================== --- trunk/octave-forge/main/control/inst/@ss/__sysconnect__.m 2010-09-09 20:00:23 UTC (rev 7695) +++ trunk/octave-forge/main/control/inst/@ss/__sysconnect__.m 2010-09-09 23:42:53 UTC (rev 7696) @@ -74,7 +74,7 @@ Z = I - D*M; if (rcond (Z) < eps) # check for singularity - error ("ss: sysconnect: (I - D*M) not invertible because of algebraic loop"); + error ("ss: sysconnect: (I - D*M) not invertible"); endif Z = inv (Z); Modified: trunk/octave-forge/main/control/inst/ltimodels.m =================================================================== --- trunk/octave-forge/main/control/inst/ltimodels.m 2010-09-09 20:00:23 UTC (rev 7695) +++ trunk/octave-forge/main/control/inst/ltimodels.m 2010-09-09 23:42:53 UTC (rev 7696) @@ -65,6 +65,11 @@ endfunction + +## ============================================================================== +## LTI Tests +## ============================================================================== + ## isct, isdt %!shared ltisys %! ltisys = tf (12); @@ -91,24 +96,42 @@ %!assert (! isct (ltisys)); %!assert (isdt (ltisys)); -## mtimes -%!shared sysmat, sysmat_exp -%! sys1 = ss ([0, 1; -3, -2], [0; 1], [-5, 1], [2]); -%! sys2 = ss ([-10], [1], [-40], [5]); -%! sys3 = sys2 * sys1; -%! [A, B, C, D] = ssdata (sys3); -%! sysmat = [A, B; C, D]; -%! A_exp = [ -10 -5 1 -%! 0 0 1 -%! 0 -3 -2 ]; -%! B_exp = [ 2 -%! 0 -%! 1 ]; -%! C_exp = [ -40 -25 5 ]; -%! D_exp = [ 10 ]; -%! sysmat_exp = [A_exp, B_exp; C_exp, D_exp]; -%!assert (sysmat, sysmat_exp) +## 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); + + + +## ============================================================================== +## TF Tests +## ============================================================================== + +## 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); + + + +## ============================================================================== +## SS Tests +## ============================================================================== + ## norm ct %!shared H2, Hinf %! sys = ss (-1, 1, 1, 0); @@ -117,6 +140,7 @@ %!assert (H2, 0.7071, 1.5e-5); %!assert (Hinf, 1, 5e-4); + ## norm dt %!shared H2, Hinf %! a = [ 2.417 -1.002 0.5488 @@ -133,20 +157,21 @@ %!assert (H2, 1.2527, 1.5e-5); %!assert (Hinf, 2.7, 0.1); + ## transmission zeros of state-space models - +## ## Results from the "Dark Side" 7.5 and 7.8 ## ## -13.2759 ## 12.5774 ## -0.0155 - +## ## Results from Scilab 5.2.0b1 (trzeros) ## ## - 13.275931 ## 12.577369 ## - 0.0155265 - +## %!shared z, z_exp %! A = [ -0.7 -0.0458 -12.2 0 %! 0 -0.014 -0.2904 -0.562 @@ -171,6 +196,78 @@ %! %!assert (z, z_exp, 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); + + +## ss: minreal (SLICOT TB01PD) +#%!shared M, Me +#%! A = [ 1.0 2.0 0.0 +#%! 4.0 -1.0 0.0 +#%! 0.0 0.0 1.0 ]; +#%! +#%! B = [ 1.0 +#%! 0.0 +#%! 1.0 ]; +#%! +#%! C = [ 0.0 1.0 -1.0 +#%! 0.0 0.0 1.0 ]; +#%! +#%! D = zeros (2, 1); +#%! +#%! sys = ss (A, B, C, D); +#%! sysmin = minreal (sys, 0.0); +#%! [Ar, Br, Cr, Dr] = ssdata (sysmin); +#%! M = [Ar, Br; Cr, Dr]; +#%! +#%! Ae = [ 1.0000 -1.4142 1.4142 +#%! -2.8284 0.0000 1.0000 +#%! 2.8284 1.0000 0.0000 ]; +#%! +#%! Be = [-1.0000 +#%! 0.7071 +#%! 0.7071 ]; +#%! +#%! Ce = [ 0.0000 0.0000 -1.4142 +#%! 0.0000 0.7071 0.7071 ]; +#%! +#%! De = zeros (2, 1); +#%! +#%! Me = [Ae, Be; Ce, De]; +#%! +#%!assert (M, Me, 1e-4); + + +## mtimes +%!shared sysmat, sysmat_exp +%! sys1 = ss ([0, 1; -3, -2], [0; 1], [-5, 1], [2]); +%! sys2 = ss ([-10], [1], [-40], [5]); +%! sys3 = sys2 * sys1; +%! [A, B, C, D] = ssdata (sys3); +%! sysmat = [A, B; C, D]; +%! A_exp = [ -10 -5 1 +%! 0 0 1 +%! 0 -3 -2 ]; +%! B_exp = [ 2 +%! 0 +%! 1 ]; +%! C_exp = [ -40 -25 5 ]; +%! D_exp = [ 10 ]; +%! sysmat_exp = [A_exp, B_exp; C_exp, D_exp]; +%!assert (sysmat, sysmat_exp) + + ## inverse of state-space models ## test from SLICOT AB07ND ## note the negative signs in Me for compatibility reasons @@ -212,42 +309,7 @@ %! %!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); -## 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); - ## staircase (SLICOT AB01OD) %!shared Ac, Bc, Ace, Bce %! A = [ 17.0 24.0 1.0 8.0 15.0 @@ -284,39 +346,243 @@ %!assert (Ac, Ace, 1e-4); %!assert (Bc, Bce, 1e-4); -## ss: minreal (SLICOT TB01PD) + +## Cascade inter-connection of two systems in state-space form +## Test from SLICOT AB05MD +## TODO: order of united state vector: consistency vs. compatibility? #%!shared M, Me -#%! A = [ 1.0 2.0 0.0 -#%! 4.0 -1.0 0.0 -#%! 0.0 0.0 1.0 ]; +#%! A1 = [ 1.0 0.0 -1.0 +#%! 0.0 -1.0 1.0 +#%! 1.0 1.0 2.0 ]; #%! -#%! B = [ 1.0 -#%! 0.0 -#%! 1.0 ]; +#%! B1 = [ 1.0 1.0 0.0 +#%! 2.0 0.0 1.0 ].'; #%! -#%! C = [ 0.0 1.0 -1.0 -#%! 0.0 0.0 1.0 ]; +#%! C1 = [ 3.0 -2.0 1.0 +#%! 0.0 1.0 0.0 ]; #%! -#%! D = zeros (2, 1); +#%! D1 = [ 1.0 0.0 +#%! 0.0 1.0 ]; #%! -#%! sys = ss (A, B, C, D); -#%! sysmin = minreal (sys, 0.0); -#%! [Ar, Br, Cr, Dr] = ssdata (sysmin); -#%! M = [Ar, Br; Cr, Dr]; +#%! A2 = [-3.0 0.0 0.0 +#%! 1.0 0.0 1.0 +#%! 0.0 -1.0 2.0 ]; #%! -#%! Ae = [ 1.0000 -1.4142 1.4142 -#%! -2.8284 0.0000 1.0000 -#%! 2.8284 1.0000 0.0000 ]; +#%! B2 = [ 0.0 -1.0 0.0 +#%! 1.0 0.0 2.0 ].'; #%! -#%! Be = [-1.0000 -#%! 0.7071 -#%! 0.7071 ]; +#%! C2 = [ 1.0 1.0 0.0 +#%! 1.0 1.0 -1.0 ]; #%! -#%! Ce = [ 0.0000 0.0000 -1.4142 -#%! 0.0000 0.7071 0.7071 ]; +#%! D2 = [ 1.0 1.0 +#%! 0.0 1.0 ]; #%! -#%! De = zeros (2, 1); +#%! sys1 = ss (A1, B1, C1, D1); +#%! sys2 = ss (A2, B2, C2, D2); +#%! sys = sys2 * sys1; +#%! [A, B, C, D] = ssdata (sys); +#%! M = [A, B; C, D]; #%! +#%! Ae = [ 1.0000 0.0000 -1.0000 0.0000 0.0000 0.0000 +#%! 0.0000 -1.0000 1.0000 0.0000 0.0000 0.0000 +#%! 1.0000 1.0000 2.0000 0.0000 0.0000 0.0000 +#%! 0.0000 1.0000 0.0000 -3.0000 0.0000 0.0000 +#%! -3.0000 2.0000 -1.0000 1.0000 0.0000 1.0000 +#%! 0.0000 2.0000 0.0000 0.0000 -1.0000 2.0000 ]; +#%! +#%! Be = [ 1.0000 2.0000 +#%! 1.0000 0.0000 +#%! 0.0000 1.0000 +#%! 0.0000 1.0000 +#%! -1.0000 0.0000 +#%! 0.0000 2.0000 ]; +#%! +#%! Ce = [ 3.0000 -1.0000 1.0000 1.0000 1.0000 0.0000 +#%! 0.0000 1.0000 0.0000 1.0000 1.0000 -1.0000 ]; +#%! +#%! De = [ 1.0000 1.0000 +#%! 0.0000 1.0000 ]; +#%! #%! Me = [Ae, Be; Ce, De]; #%! #%!assert (M, Me, 1e-4); + + +## Feedback inter-connection of two systems in state-space form +## Test from SLICOT AB05ND +%!shared M, Me +%! A1 = [ 1.0 0.0 -1.0 +%! 0.0 -1.0 1.0 +%! 1.0 1.0 2.0 ]; +%! +%! B1 = [ 1.0 1.0 0.0 +%! 2.0 0.0 1.0 ].'; +%! +%! C1 = [ 3.0 -2.0 1.0 +%! 0.0 1.0 0.0 ]; +%! +%! D1 = [ 1.0 0.0 +%! 0.0 1.0 ]; +%! +%! A2 = [-3.0 0.0 0.0 +%! 1.0 0.0 1.0 +%! 0.0 -1.0 2.0 ]; +%! +%! B2 = [ 0.0 -1.0 0.0 +%! 1.0 0.0 2.0 ].'; +%! +%! C2 = [ 1.0 1.0 0.0 +%! 1.0 1.0 -1.0 ]; +%! +%! D2 = [ 1.0 1.0 +%! 0.0 1.0 ]; +%! +%! sys1 = ss (A1, B1, C1, D1); +%! sys2 = ss (A2, B2, C2, D2); +%! sys = feedback (sys1, sys2); +%! [A, B, C, D] = ssdata (sys); +%! M = [A, B; C, D]; +%! +%! Ae = [-0.5000 -0.2500 -1.5000 -1.2500 -1.2500 0.7500 +%! -1.5000 -0.2500 0.5000 -0.2500 -0.2500 -0.2500 +%! 1.0000 0.5000 2.0000 -0.5000 -0.5000 0.5000 +%! 0.0000 0.5000 0.0000 -3.5000 -0.5000 0.5000 +%! -1.5000 1.2500 -0.5000 1.2500 0.2500 1.2500 +%! 0.0000 1.0000 0.0000 -1.0000 -2.0000 3.0000 ]; +%! +%! Be = [ 0.5000 0.7500 +%! 0.5000 -0.2500 +%! 0.0000 0.5000 +%! 0.0000 0.5000 +%! -0.5000 0.2500 +%! 0.0000 1.0000 ]; +%! +%! Ce = [ 1.5000 -1.2500 0.5000 -0.2500 -0.2500 -0.2500 +%! 0.0000 0.5000 0.0000 -0.5000 -0.5000 0.5000 ]; +%! +%! De = [ 0.5000 -0.2500 +%! 0.0000 0.5000 ]; +%! +%! Me = [Ae, Be; Ce, De]; +%! +%!assert (M, Me, 1e-4); + + +## Rowwise concatenation of two systems in state-space form +## Test from SLICOT AB05OD +%!shared M, Me +%! A1 = [ 1.0 0.0 -1.0 +%! 0.0 -1.0 1.0 +%! 1.0 1.0 2.0 ]; +%! +%! B1 = [ 1.0 1.0 0.0 +%! 2.0 0.0 1.0 ].'; +%! +%! C1 = [ 3.0 -2.0 1.0 +%! 0.0 1.0 0.0 ]; +%! +%! D1 = [ 1.0 0.0 +%! 0.0 1.0 ]; +%! +%! A2 = [-3.0 0.0 0.0 +%! 1.0 0.0 1.0 +%! 0.0 -1.0 2.0 ]; +%! +%! B2 = [ 0.0 -1.0 0.0 +%! 1.0 0.0 2.0 ].'; +%! +%! C2 = [ 1.0 1.0 0.0 +%! 1.0 1.0 -1.0 ]; +%! +%! D2 = [ 1.0 1.0 +%! 0.0 1.0 ]; +%! +%! sys1 = ss (A1, B1, C1, D1); +%! sys2 = ss (A2, B2, C2, D2); +%! sys = [sys1, sys2]; +%! [A, B, C, D] = ssdata (sys); +%! M = [A, B; C, D]; +%! +%! Ae = [ 1.0000 0.0000 -1.0000 0.0000 0.0000 0.0000 +%! 0.0000 -1.0000 1.0000 0.0000 0.0000 0.0000 +%! 1.0000 1.0000 2.0000 0.0000 0.0000 0.0000 +%! 0.0000 0.0000 0.0000 -3.0000 0.0000 0.0000 +%! 0.0000 0.0000 0.0000 1.0000 0.0000 1.0000 +%! 0.0000 0.0000 0.0000 0.0000 -1.0000 2.0000 ]; +%! +%! Be = [ 1.0000 2.0000 0.0000 0.0000 +%! 1.0000 0.0000 0.0000 0.0000 +%! 0.0000 1.0000 0.0000 0.0000 +%! 0.0000 0.0000 0.0000 1.0000 +%! 0.0000 0.0000 -1.0000 0.0000 +%! 0.0000 0.0000 0.0000 2.0000 ]; +%! +%! Ce = [ 3.0000 -2.0000 1.0000 1.0000 1.0000 0.0000 +%! 0.0000 1.0000 0.0000 1.0000 1.0000 -1.0000 ]; +%! +%! De = [ 1.0000 0.0000 1.0000 1.0000 +%! 0.0000 1.0000 0.0000 1.0000 ]; +%! +%! Me = [Ae, Be; Ce, De]; +%! +%!assert (M, Me, 1e-4); + + +## Parallel inter-connection of two systems in state-space form +## Test from SLICOT AB05PD +%!shared M, Me +%! A1 = [ 1.0 0.0 -1.0 +%! 0.0 -1.0 1.0 +%! 1.0 1.0 2.0 ]; +%! +%! B1 = [ 1.0 1.0 0.0 +%! 2.0 0.0 1.0 ].'; +%! +%! C1 = [ 3.0 -2.0 1.0 +%! 0.0 1.0 0.0 ]; +%! +%! D1 = [ 1.0 0.0 +%! 0.0 1.0 ]; +%! +%! A2 = [-3.0 0.0 0.0 +%! 1.0 0.0 1.0 +%! 0.0 -1.0 2.0 ]; +%! +%! B2 = [ 0.0 -1.0 0.0 +%! 1.0 0.0 2.0 ].'; +%! +%! C2 = [ 1.0 1.0 0.0 +%! 1.0 1.0 -1.0 ]; +%! +%! D2 = [ 1.0 1.0 +%! 0.0 1.0 ]; +%! +%! sys1 = ss (A1, B1, C1, D1); +%! sys2 = ss (A2, B2, C2, D2); +%! sys = sys1 + sys2; +%! [A, B, C, D] = ssdata (sys); +%! M = [A, B; C, D]; +%! +%! Ae = [ 1.0000 0.0000 -1.0000 0.0000 0.0000 0.0000 +%! 0.0000 -1.0000 1.0000 0.0000 0.0000 0.0000 +%! 1.0000 1.0000 2.0000 0.0000 0.0000 0.0000 +%! 0.0000 0.0000 0.0000 -3.0000 0.0000 0.0000 +%! 0.0000 0.0000 0.0000 1.0000 0.0000 1.0000 +%! 0.0000 0.0000 0.0000 0.0000 -1.0000 2.0000 ]; +%! +%! Be = [ 1.0000 2.0000 +%! 1.0000 0.0000 +%! 0.0000 1.0000 +%! 0.0000 1.0000 +%! -1.0000 0.0000 +%! 0.0000 2.0000 ]; +%! +%! Ce = [ 3.0000 -2.0000 1.0000 1.0000 1.0000 0.0000 +%! 0.0000 1.0000 0.0000 1.0000 1.0000 -1.0000 ]; +%! +%! De = [ 2.0000 1.0000 +%! 0.0000 2.0000 ]; +%! +%! Me = [Ae, Be; Ce, De]; +%! +%!assert (M, Me, 1e-4); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <par...@us...> - 2010-09-12 23:03:27
|
Revision: 7704 http://octave.svn.sourceforge.net/octave/?rev=7704&view=rev Author: paramaniac Date: 2010-09-12 23:03:20 +0000 (Sun, 12 Sep 2010) Log Message: ----------- control: add new sminreal implementation and tests Modified Paths: -------------- trunk/octave-forge/main/control/inst/@lti/sminreal.m trunk/octave-forge/main/control/inst/issample.m trunk/octave-forge/main/control/inst/ltimodels.m Modified: trunk/octave-forge/main/control/inst/@lti/sminreal.m =================================================================== --- trunk/octave-forge/main/control/inst/@lti/sminreal.m 2010-09-11 20:50:58 UTC (rev 7703) +++ trunk/octave-forge/main/control/inst/@lti/sminreal.m 2010-09-12 23:03:20 UTC (rev 7704) @@ -1,4 +1,4 @@ -## Copyright (C) 2009 Lukas F. Reichlin +## Copyright (C) 2009 - 2010 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## @@ -17,44 +17,91 @@ ## -*- texinfo -*- ## @deftypefn {Function File} {@var{sys} =} sminreal (@var{sys}) -## Perform state-space model reduction based on structure, -## i.e. retain only states which are both controllable and observable. +## @deftypefnx {Function File} {@var{sys} =} sminreal (@var{sys}, @var{tol}) +## Perform state-space model reduction based on structure. +## Remove states which have no influence on the input-output behaviour. ## The physical meaning of the states is retained. +## +## @strong{Inputs} +## @table @var +## @item sys +## State-space model. +## @item tol +## Optional tolerance for controllability and observability. +## Entries of the state-space matrices whose moduli are less or equal to @var{tol} +## are assumed to be zero. Default value is 0. +## @end table +## +## @strong{Outputs} +## @table @var +## @item sys +## Reduced state-space model. +## @end table +## +## @seealso{minreal} ## @end deftypefn -## Algorithm based on sysmin by A. Scottedward Hodel ## Author: Lukas Reichlin <luk...@gm...> ## Created: October 2009 -## Version: 0.1 +## Version: 0.2 -function sys = sminreal (sys) +function sys = sminreal (sys, tol = 0) + if (nargin > 2) # sminreal () not possible (inside @lti) + print_usage (); + endif + if (! isa (sys, "ss")) warning ("sminreal: system not in state-space form"); sys = ss (sys); endif - [cflg, Uc] = isctrb (sys); - [oflg, Uo] = isobsv (sys); + if (! (isreal (tol) && isscalar (tol) && (tol >= 0))) + error ("sminreal: second argument is not a valid tolerance"); + endif - xc = find (max (abs (Uc.')) != 0); - xo = find (max (abs (Uo.')) != 0); - st_idx = intersect (xc, xo); + [a, b, c] = ssdata (sys); + a = abs (a) > tol; + b = abs (b) > tol; + c = abs (c) > tol; + + co_idx = __controllable_states__ (a, b); + ob_idx = __controllable_states__ (a.', c.'); + + st_idx = intersect (co_idx, ob_idx); + sys = __sysprune__ (sys, ":", ":", st_idx); - warning ("sminreal: use result with caution"); - endfunction -## FIXME: algorithm returns wrong result for the example below -## -## P = ss (-2, 3, 4, 5) -## C = inv (P) -## L = P * C -## Ls = sminreal (L) -## bode (Ls) -## -## Obviously, both magnitude and phase should be straight lines at 0 dB and 0 deg -## In this case, sminreal shouldn't remove any states of L \ No newline at end of file +function c_idx = __controllable_states__ (a, b) + + n = rows (a); # number of states + a = a & ! eye (n); # set diagonal entries to zero + + c_vec = any (b, 2); # states directly controllable + c_idx = find (c_vec); # indices of directly controllable states + c_idx_new = 0; # any vector of length > 0 possible + + while (all (length (c_idx) != [0, n] && length(c_idx_new) != 0)) + + u_idx = find (! c_vec); # indices of uncontrollable states + + #{ + ## debug code + a(u_idx, :) + repmat (c_vec.', length (u_idx), 1) + a(u_idx, :) & repmat (c_vec.', length (u_idx), 1) + any (a(u_idx, :) & repmat (c_vec.', length (u_idx), 1), 2) + find (any (a(u_idx, :) & repmat (c_vec.', length (u_idx), 1), 2)) + #} + + c_idx_new = u_idx (find (any (a(u_idx, :) & repmat (c_vec.', length (u_idx), 1), 2))); + c_idx = union (c_idx, c_idx_new); + c_vec(c_idx_new) = 1; + + endwhile + +endfunction Modified: trunk/octave-forge/main/control/inst/issample.m =================================================================== --- trunk/octave-forge/main/control/inst/issample.m 2010-09-11 20:50:58 UTC (rev 7703) +++ trunk/octave-forge/main/control/inst/issample.m 2010-09-12 23:03:20 UTC (rev 7704) @@ -35,9 +35,9 @@ print_usage (); endif - if (flg == 0) # allow -1 and 0 + if (flg == 0) # refuse -1 and 0 bool = (isreal (tsam) && isscalar (tsam) && (tsam > 0)); - else # refuse -1 and 0 + else # allow -1 and 0 bool = (isreal (tsam) && isscalar (tsam) && (tsam >= 0 || tsam == -1)); endif Modified: trunk/octave-forge/main/control/inst/ltimodels.m =================================================================== --- trunk/octave-forge/main/control/inst/ltimodels.m 2010-09-11 20:50:58 UTC (rev 7703) +++ trunk/octave-forge/main/control/inst/ltimodels.m 2010-09-12 23:03:20 UTC (rev 7704) @@ -249,6 +249,36 @@ #%!assert (M, Me, 1e-4); +## ss: sminreal +%!shared B, C +%! +%! A = ss (-2, 3, 4, 5); +%! B = A / A; +%! C = sminreal (B); # no states should be removed +%! +%!assert (C.a, B.a); +%!assert (C.b, B.b); +%!assert (C.c, B.c); +%!assert (C.d, B.d); + +%!shared A, B, D, E +%! +%! A = ss (-1, 1, 1, 0); +%! B = ss (-2, 3, 4, 5); +%! C = [A, B]; +%! D = sminreal (C(:, 1)); +%! E = sminreal (C(:, 2)); +%! +%!assert (D.a, A.a); +%!assert (D.b, A.b); +%!assert (D.c, A.c); +%!assert (D.d, A.d); +%!assert (E.a, B.a); +%!assert (E.b, B.b); +%!assert (E.c, B.c); +%!assert (E.d, B.d); + + ## mtimes %!shared sysmat, sysmat_exp %! sys1 = ss ([0, 1; -3, -2], [0; 1], [-5, 1], [2]); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <par...@us...> - 2010-09-13 09:19:48
|
Revision: 7705 http://octave.svn.sourceforge.net/octave/?rev=7705&view=rev Author: paramaniac Date: 2010-09-13 09:19:41 +0000 (Mon, 13 Sep 2010) Log Message: ----------- control: use reshape Modified Paths: -------------- trunk/octave-forge/main/control/inst/@lti/set.m trunk/octave-forge/main/control/inst/@ss/__set__.m trunk/octave-forge/main/control/inst/@tfpoly/tfpoly.m trunk/octave-forge/main/control/inst/__checkname__.m trunk/octave-forge/main/control/inst/__freqbounds__.m trunk/octave-forge/main/control/inst/__getfreqresp__.m trunk/octave-forge/main/control/inst/__tf2ss__.m trunk/octave-forge/main/control/inst/__timeresp__.m trunk/octave-forge/main/control/inst/bode.m trunk/octave-forge/main/control/inst/bodemag.m trunk/octave-forge/main/control/inst/gensig.m trunk/octave-forge/main/control/inst/lsim.m trunk/octave-forge/main/control/inst/margin.m trunk/octave-forge/main/control/inst/nichols.m trunk/octave-forge/main/control/inst/nyquist.m trunk/octave-forge/main/control/inst/place.m trunk/octave-forge/main/control/inst/rlocus.m trunk/octave-forge/main/control/inst/sigma.m Modified: trunk/octave-forge/main/control/inst/@lti/set.m =================================================================== --- trunk/octave-forge/main/control/inst/@lti/set.m 2010-09-12 23:03:20 UTC (rev 7704) +++ trunk/octave-forge/main/control/inst/@lti/set.m 2010-09-13 09:19:41 UTC (rev 7705) @@ -1,4 +1,4 @@ -## Copyright (C) 2009 Lukas F. Reichlin +## Copyright (C) 2009 - 2010 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## @@ -23,7 +23,7 @@ ## Author: Lukas Reichlin <luk...@gm...> ## Created: October 2009 -## Version: 0.1 +## Version: 0.2 function retsys = set (sys, varargin) @@ -60,10 +60,10 @@ switch (prop) case {"inname", "inputname"} - sys.inname = __checkname__ (val, m)(:); + sys.inname = __checkname__ (val, m); case {"outname", "outputname"} - sys.outname = __checkname__ (val, p)(:); + sys.outname = __checkname__ (val, p); case {"tsam", "ts"} if (issample (val)) Modified: trunk/octave-forge/main/control/inst/@ss/__set__.m =================================================================== --- trunk/octave-forge/main/control/inst/@ss/__set__.m 2010-09-12 23:03:20 UTC (rev 7704) +++ trunk/octave-forge/main/control/inst/@ss/__set__.m 2010-09-13 09:19:41 UTC (rev 7705) @@ -43,7 +43,7 @@ case {"stname", "statename"} n = rows (sys.a); - sys.stname = __checkname__ (val, n)(:); + sys.stname = __checkname__ (val, n); otherwise error ("set: invalid property name"); Modified: trunk/octave-forge/main/control/inst/@tfpoly/tfpoly.m =================================================================== --- trunk/octave-forge/main/control/inst/@tfpoly/tfpoly.m 2010-09-12 23:03:20 UTC (rev 7704) +++ trunk/octave-forge/main/control/inst/@tfpoly/tfpoly.m 2010-09-13 09:19:41 UTC (rev 7705) @@ -1,4 +1,4 @@ -## Copyright (C) 2009 Lukas F. Reichlin +## Copyright (C) 2009 - 2010 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## @@ -20,7 +20,7 @@ ## Author: Lukas Reichlin <luk...@gm...> ## Created: September 2009 -## Version: 0.1 +## Version: 0.2 function p = tfpoly (a) @@ -35,8 +35,8 @@ if (isa (a, "tfpoly")) p = a; return; - elseif (isvector (a) && isreal (a)) - p.poly = a(:).'; + elseif (isreal (a) && isvector (a)) + p.poly = reshape (a, 1, []); p = class (p, "tfpoly"); p = __remleadzer__ (p); else Modified: trunk/octave-forge/main/control/inst/__checkname__.m =================================================================== --- trunk/octave-forge/main/control/inst/__checkname__.m 2010-09-12 23:03:20 UTC (rev 7704) +++ trunk/octave-forge/main/control/inst/__checkname__.m 2010-09-13 09:19:41 UTC (rev 7705) @@ -1,4 +1,4 @@ -## Copyright (C) 2009 Lukas F. Reichlin +## Copyright (C) 2009 -2010 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## @@ -21,7 +21,7 @@ ## Author: Lukas Reichlin <luk...@gm...> ## Created: October 2009 -## Version: 0.1 +## Version: 0.2 function name = __checkname__ (name, req_len) @@ -29,9 +29,9 @@ name = {name}; # e.g. sys = set (sys, "inname", "u_1") endif - n = numel (name); + name = reshape (name, [], 1); - if (n != req_len) + if (numel (name) != req_len) error ("lti: set: cell must contain %d strings", req_len); endif Modified: trunk/octave-forge/main/control/inst/__freqbounds__.m =================================================================== --- trunk/octave-forge/main/control/inst/__freqbounds__.m 2010-09-12 23:03:20 UTC (rev 7704) +++ trunk/octave-forge/main/control/inst/__freqbounds__.m 2010-09-13 09:19:41 UTC (rev 7705) @@ -45,8 +45,8 @@ discrete = (tsam > 0); # static gains (tsam = -1) are continuous ## make sure zer, pol are row vectors - pol = pol(:).'; - zer = zer(:).'; + pol = reshape (pol, 1, []); + zer = reshape (zer, 1, []); ## check for natural frequencies away from omega = 0 if (discrete) Modified: trunk/octave-forge/main/control/inst/__getfreqresp__.m =================================================================== --- trunk/octave-forge/main/control/inst/__getfreqresp__.m 2010-09-12 23:03:20 UTC (rev 7704) +++ trunk/octave-forge/main/control/inst/__getfreqresp__.m 2010-09-13 09:19:41 UTC (rev 7705) @@ -30,7 +30,7 @@ error ("getfreqresp: first argument sys must be a LTI system"); endif - if (! isvector (w) && ! isempty (w)) + if (! isempty (w) && ! (isreal (w) && isvector (w))) error ("getfreqresp: second argument w must be a vector of frequencies"); endif Modified: trunk/octave-forge/main/control/inst/__tf2ss__.m =================================================================== --- trunk/octave-forge/main/control/inst/__tf2ss__.m 2010-09-12 23:03:20 UTC (rev 7704) +++ trunk/octave-forge/main/control/inst/__tf2ss__.m 2010-09-13 09:19:41 UTC (rev 7705) @@ -87,8 +87,8 @@ endif ## force num, den to be row vectors - num = vec (num).'; - den = vec (den).'; + num = reshape (num, 1, []); + den = reshape (den, 1, []); 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-09-12 23:03:20 UTC (rev 7704) +++ trunk/octave-forge/main/control/inst/__timeresp__.m 2010-09-13 09:19:41 UTC (rev 7705) @@ -1,4 +1,4 @@ -## Copyright (C) 2009 Lukas F. Reichlin +## Copyright (C) 2009 - 2010 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## @@ -20,7 +20,7 @@ ## Author: Lukas Reichlin <luk...@gm...> ## Created: October 2009 -## Version: 0.1 +## Version: 0.2 function [y, t, x_arr] = __timeresp__ (sys, resptype, plotflag, tfinal, dt, x0) @@ -58,7 +58,7 @@ p = rows (C); # number of outputs ## time vector - t = (0 : dt : tfinal).'; + t = reshape (0 : dt : tfinal, [], 1); l_t = length (t); switch (resptype) @@ -71,7 +71,7 @@ x_arr = zeros (l_t, n); ## initial conditions - x = x0(:); # make sure that x is a column vector + x = reshape (x0, [], 1); # make sure that x is a column vector if (n != length (x0)) error ("initial: x0 must be a vector with %d elements", n); Modified: trunk/octave-forge/main/control/inst/bode.m =================================================================== --- trunk/octave-forge/main/control/inst/bode.m 2010-09-12 23:03:20 UTC (rev 7704) +++ trunk/octave-forge/main/control/inst/bode.m 2010-09-13 09:19:41 UTC (rev 7705) @@ -1,4 +1,4 @@ -## Copyright (C) 2009 Lukas F. Reichlin +## Copyright (C) 2009 - 2010 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## @@ -45,7 +45,7 @@ ## Author: Lukas Reichlin <luk...@gm...> ## Created: November 2009 -## Version: 0.1 +## Version: 0.2 function [mag_r, pha_r, w_r] = bode (sys, w = []) @@ -55,7 +55,7 @@ [H, w] = __getfreqresp__ (sys, w, false, 0, "std"); - H = H(:); + H = reshape (H, [], 1); mag = abs (H); pha = unwrap (arg (H)) * 180 / pi; @@ -63,9 +63,9 @@ mag_db = 20 * log10 (mag); wv = [min(w), max(w)]; - ax_vec_mag = __axis2dlim__ ([w(:), mag_db(:)]); + ax_vec_mag = __axis2dlim__ ([reshape(w, [], 1), reshape(mag_db, [], 1)]); ax_vec_mag(1:2) = wv; - ax_vec_pha = __axis2dlim__ ([w(:), pha(:)]); + ax_vec_pha = __axis2dlim__ ([reshape(w, [], 1), reshape(pha, [], 1)]); ax_vec_pha(1:2) = wv; if (isct (sys)) Modified: trunk/octave-forge/main/control/inst/bodemag.m =================================================================== --- trunk/octave-forge/main/control/inst/bodemag.m 2010-09-12 23:03:20 UTC (rev 7704) +++ trunk/octave-forge/main/control/inst/bodemag.m 2010-09-13 09:19:41 UTC (rev 7705) @@ -1,4 +1,4 @@ -## Copyright (C) 2009 Lukas F. Reichlin +## Copyright (C) 2009 - 2010 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## @@ -43,7 +43,7 @@ ## Author: Lukas Reichlin <luk...@gm...> ## Created: November 2009 -## Version: 0.1 +## Version: 0.2 function [mag_r, w_r] = bodemag (sys, w = []) @@ -53,14 +53,14 @@ [H, w] = __getfreqresp__ (sys, w, false, 0, "std"); - H = H(:); + H = reshape (H, [], 1); mag = abs (H); if (! nargout) mag_db = 20 * log10 (mag); wv = [min(w), max(w)]; - ax_vec_mag = __axis2dlim__ ([w(:), mag_db(:)]); + ax_vec_mag = __axis2dlim__ ([reshape(w, [], 1), reshape(mag_db, [], 1)]); ax_vec_mag(1:2) = wv; if (isct (sys)) Modified: trunk/octave-forge/main/control/inst/gensig.m =================================================================== --- trunk/octave-forge/main/control/inst/gensig.m 2010-09-12 23:03:20 UTC (rev 7704) +++ trunk/octave-forge/main/control/inst/gensig.m 2010-09-13 09:19:41 UTC (rev 7705) @@ -52,7 +52,7 @@ ## Author: Lukas Reichlin <luk...@gm...> ## Created: August 2009 -## Version: 0.2 +## Version: 0.2.1 function [u, t] = gensig (sigtype, tau, tfinal, tsam) @@ -80,7 +80,7 @@ error ("gensig: fourth argument is not a valid sampling time"); endif - t = (0 : tsam : tfinal).'; + t = reshape (0 : tsam : tfinal, [], 1); switch (lower (sigtype(1:2))) case "si" Modified: trunk/octave-forge/main/control/inst/lsim.m =================================================================== --- trunk/octave-forge/main/control/inst/lsim.m 2010-09-12 23:03:20 UTC (rev 7704) +++ trunk/octave-forge/main/control/inst/lsim.m 2010-09-13 09:19:41 UTC (rev 7705) @@ -1,4 +1,4 @@ -## Copyright (C) 2009 Lukas F. Reichlin +## Copyright (C) 2009 - 2010 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## @@ -51,7 +51,7 @@ ## Author: Lukas Reichlin <luk...@gm...> ## Created: October 2009 -## Version: 0.1 +## Version: 0.2 function [y_r, t_r, x_r] = lsim (sys, u, t = [], x0 = [], method = "zoh") @@ -101,7 +101,7 @@ m = columns (G); # number of inputs p = rows (C); # number of outputs - t = (0 : dt : tfinal).'; # time vector + t = reshape (0 : dt : tfinal, [], 1); # time vector trows = length (t); if (urows != trows) @@ -123,7 +123,7 @@ error ("initial: x0 must be a vector with %d elements", n); endif - x = x0(:); # make sure that x is a column vector + x = reshape (x0, [], 1); # make sure that x is a column vector ## simulation for k = 1 : trows Modified: trunk/octave-forge/main/control/inst/margin.m =================================================================== --- trunk/octave-forge/main/control/inst/margin.m 2010-09-12 23:03:20 UTC (rev 7704) +++ trunk/octave-forge/main/control/inst/margin.m 2010-09-13 09:19:41 UTC (rev 7705) @@ -1,4 +1,4 @@ -## Copyright (C) 2009 Lukas F. Reichlin +## Copyright (C) 2009 - 2010 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## @@ -119,7 +119,7 @@ ## Author: Lukas Reichlin <luk...@gm...> ## Created: July 2009 -## Version: 0.7.0 +## Version: 0.7.1 function [gamma_r, phi_r, w_gamma_r, w_phi_r] = margin (sys, tol = sqrt (eps)) @@ -262,15 +262,15 @@ [H, w] = __getfreqresp__ (sys, [], false, 0, "std"); - H = H(:); + H = reshape (H, [], 1); mag_db = 20 * log10 (abs (H)); pha = unwrap (arg (H)) * 180 / pi; gamma_db = 20 * log10 (gamma); wv = [min(w), max(w)]; - ax_vec_mag = __axis2dlim__ ([w(:), mag_db(:)]); + ax_vec_mag = __axis2dlim__ ([reshape(w, [], 1), reshape(mag_db, [], 1)]); ax_vec_mag(1:2) = wv; - ax_vec_pha = __axis2dlim__ ([w(:), pha(:)]); + ax_vec_pha = __axis2dlim__ ([reshape(w, [], 1), reshape(pha, [], 1)]); ax_vec_pha(1:2) = wv; wgm = [w_gamma, w_gamma]; Modified: trunk/octave-forge/main/control/inst/nichols.m =================================================================== --- trunk/octave-forge/main/control/inst/nichols.m 2010-09-12 23:03:20 UTC (rev 7704) +++ trunk/octave-forge/main/control/inst/nichols.m 2010-09-13 09:19:41 UTC (rev 7705) @@ -1,4 +1,4 @@ -## Copyright (C) 2009 Lukas F. Reichlin +## Copyright (C) 2009 - 2010 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## @@ -45,7 +45,7 @@ ## Author: Lukas Reichlin <luk...@gm...> ## Created: November 2009 -## Version: 0.1 +## Version: 0.2 function [mag_r, pha_r, w_r] = nichols (sys, w = []) @@ -55,13 +55,13 @@ [H, w] = __getfreqresp__ (sys, w, false, 0, "ext"); - H = H(:); + H = reshape (H, [], 1); mag = abs (H); pha = unwrap (arg (H)) * 180 / pi; if (! nargout) mag_db = 20 * log10 (mag); - ax_vec = __axis2dlim__ ([pha(:), mag_db(:)]); + ax_vec = __axis2dlim__ ([reshape(pha, [], 1), reshape(mag_db, [], 1)]); plot (pha, mag_db) axis (ax_vec) Modified: trunk/octave-forge/main/control/inst/nyquist.m =================================================================== --- trunk/octave-forge/main/control/inst/nyquist.m 2010-09-12 23:03:20 UTC (rev 7704) +++ trunk/octave-forge/main/control/inst/nyquist.m 2010-09-13 09:19:41 UTC (rev 7705) @@ -1,4 +1,4 @@ -## Copyright (C) 2009 Lukas F. Reichlin +## Copyright (C) 2009 - 2010 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## @@ -45,7 +45,7 @@ ## Author: Lukas Reichlin <luk...@gm...> ## Created: November 2009 -## Version: 0.1 +## Version: 0.2 function [re_r, im_r, w_r] = nyquist (sys, w = []) @@ -55,7 +55,7 @@ [H, w] = __getfreqresp__ (sys, w, false, 0, "ext"); - H = H(:); + H = reshape (H, [], 1); re = real (H); im = imag (H); Modified: trunk/octave-forge/main/control/inst/place.m =================================================================== --- trunk/octave-forge/main/control/inst/place.m 2010-09-12 23:03:20 UTC (rev 7704) +++ trunk/octave-forge/main/control/inst/place.m 2010-09-13 09:19:41 UTC (rev 7705) @@ -67,7 +67,7 @@ ## Special thanks to Peter Benner from TU Chemnitz for his advice. ## Author: Lukas Reichlin <luk...@gm...> ## Created: December 2009 -## Version: 0.2.2 +## Version: 0.2.3 function [f, nfp, nap, nup] = place (a, b, p = [], alpha = [], tol = []) @@ -101,7 +101,7 @@ error ("place: p must be a vector"); endif - p = sort (p(:)); # complex conjugate pairs must appear together + p = sort (reshape (p, [], 1)); # complex conjugate pairs must appear together wr = real (p); wi = imag (p); Modified: trunk/octave-forge/main/control/inst/rlocus.m =================================================================== --- trunk/octave-forge/main/control/inst/rlocus.m 2010-09-12 23:03:20 UTC (rev 7704) +++ trunk/octave-forge/main/control/inst/rlocus.m 2010-09-13 09:19:41 UTC (rev 7705) @@ -21,37 +21,35 @@ ## @deftypefnx {Function File} {[@var{rldata}, @var{k}] =} rlocus (@var{sys}[, @var{increment}, @var{min_k}, @var{max_k}]) ## Display root locus plot of the specified @acronym{SISO} system. ## -## @example -## @group -## u + +---+ +------+ y -## ------>(+)----->| k |----->| SISO |-------+-------> -## ^ - +---+ +------+ | -## | | -## +---------------------------------+ -## @end group -## @end example -## ## @strong{Inputs} ## @table @var ## @item sys -## LTI model +## LTI model. Must be a single-input and single-output (SISO) system. ## @item min_k -## Minimum value of @var{k} +## Minimum value of @var{k}. ## @item max_k -## Maximum value of @var{k} +## Maximum value of @var{k}. ## @item increment -## The increment used in computing gain values +## The increment used in computing gain values. ## @end table ## ## @strong{Outputs} -## -## Plots the root locus to the screen. ## @table @var ## @item rldata ## Data points plotted: in column 1 real values, in column 2 the imaginary values. ## @item k ## Gains for real axis break points. ## @end table +## +## @example +## @group +## u + +---+ +------+ y +## ------>(+)----->| k |----->| SISO |-------+-------> +## ^ - +---+ +------+ | +## | | +## +---------------------------------+ +## @end group +## @end example ## @end deftypefn ## Author: David Clem @@ -61,7 +59,7 @@ ## Adapted-By: Lukas Reichlin <luk...@gm...> ## Date: December 2009 -## Version: 0.1 +## Version: 0.2 ## TODO: Improve compatibility @@ -150,7 +148,7 @@ ngain = max (30, ngain); gvec = linspace (mink, maxk, ngain); if (length (k_break)) - gvec = sort ([gvec, vec(k_break).']); + gvec = sort ([gvec, reshape(k_break, 1, [])]); endif ## Find the open loop zeros and the initial poles @@ -296,20 +294,21 @@ title ("Root Locus"); xlabel (sprintf ("Real Axis gain = [%g, %g]", gvec(1), gvec(ngain))); ylabel ("Imaginary Axis"); - set (gcf (), "visible","on"); + set (gcf (), "visible", "on"); else rldata_r = rldata; endif endfunction -function rlpol = sort_roots (rlpol,tolx, toly) +function rlpol = sort_roots (rlpol, tolx, toly) # no point sorting of you've only got one pole! if (rows (rlpol) == 1) return; endif # reorder entries in each column of rlpol to be by their nearest-neighbors +rlpol dp = diff (rlpol.').'; drp = max (real (dp)); dip = max (imag (dp)); Modified: trunk/octave-forge/main/control/inst/sigma.m =================================================================== --- trunk/octave-forge/main/control/inst/sigma.m 2010-09-12 23:03:20 UTC (rev 7704) +++ trunk/octave-forge/main/control/inst/sigma.m 2010-09-13 09:19:41 UTC (rev 7705) @@ -1,4 +1,4 @@ -## Copyright (C) 2009 Lukas F. Reichlin +## Copyright (C) 2009 - 2010 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## @@ -57,7 +57,7 @@ ## Author: Lukas Reichlin <luk...@gm...> ## Created: May 2009 -## Version: 0.3.0 +## Version: 0.3.1 function [sv_r, w_r] = sigma (sys, w = [], resptype = 0) @@ -82,7 +82,8 @@ sv_db = 20 * log10 (sv); ## determine axes - ax_vec = __axis2dlim__ ([w(:), min(sv_db, [], 1)(:); w(:), max(sv_db, [], 1)(:)]); + ax_vec = __axis2dlim__ ([reshape(w, [], 1), reshape(min(sv_db, [], 1), [], 1); + reshape(w, [], 1), reshape(max(sv_db, [], 1), [], 1)]); ax_vec(1:2) = [min(w), max(w)]; ## determine xlabel @@ -101,7 +102,7 @@ grid ("on") else # return values sv_r = sv; - w_r = w(:); + w_r = reshape (w, [], 1); 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-14 09:11:51
|
Revision: 7712 http://octave.svn.sourceforge.net/octave/?rev=7712&view=rev Author: paramaniac Date: 2010-09-14 09:11:45 +0000 (Tue, 14 Sep 2010) Log Message: ----------- control: improve argument checking Modified Paths: -------------- trunk/octave-forge/main/control/inst/dlyap.m trunk/octave-forge/main/control/inst/lyap.m Modified: trunk/octave-forge/main/control/inst/dlyap.m =================================================================== --- trunk/octave-forge/main/control/inst/dlyap.m 2010-09-14 07:23:09 UTC (rev 7711) +++ trunk/octave-forge/main/control/inst/dlyap.m 2010-09-14 09:11:45 UTC (rev 7712) @@ -36,7 +36,7 @@ ## Author: Lukas Reichlin <luk...@gm...> ## Created: January 2010 -## Version: 0.1 +## Version: 0.2 function [x, scale] = dlyap (a, b, c, e) @@ -45,19 +45,16 @@ switch (nargin) case 2 # Lyapunov equation - na = rows (a); - nb = rows (b); - - if (! issquare (a)) - error ("lyap: a must be square"); + if (! isreal (a) || ! issquare (a) || isempty (a)) + error ("dlyap: a must be real and square"); endif - if (! issquare (b)) - error ("lyap: b must be square") + if (! isreal (b) || ! issquare (b) || isempty (b)) + error ("dlyap: b must be real and square") endif - if (na != nb) - error ("lyap: a and b must be of identical size"); + if (rows (a) != rows (b)) + error ("dlyap: a and b must have the same number of rows"); endif [x, scale] = slsb03md (a, -b, true); # AXA' - X = -B @@ -66,20 +63,16 @@ case 3 # Sylvester equation - n = rows (a); - m = rows (b); - [crows, ccols] = size (c); - - if (! issquare (a)) - error ("dlyap: a must be square"); + if (! isreal (a) || isempty (a) || ! issquare (a)) + error ("dlyap: a must be real and square"); endif - if (! issquare (b)) - error ("dlyap: b must be square"); + if (! isreal (b) || isempty (b) || ! issquare (b)) + error ("dlyap: b must be real and square"); endif - if (crows != n || ccols != m) - error ("dlyap: c must be a (%dx%d) matrix", n, m); + if (! isreal (c) || isempty (c) || rows (c) != rows (a) || columns (c) != columns (b)) + error ("dlyap: c must be a real (%dx%d) matrix", rows (a), columns (b)); endif x = slsb04qd (-a, b, c); # AXB' - X = -C @@ -90,28 +83,24 @@ print_usage (); endif - na = rows (a); - nb = rows (b); - ne = rows (e); - - if (! issquare (a)) - error ("lyap: a must be square"); + if (! isreal (a) || isempty (a) || ! issquare (a)) + error ("dlyap: a must be real and square"); endif - if (! issquare (b)) - error ("lyap: b must be square"); + if (! isreal (b) || isempty (b) || ! issquare (b)) + error ("dlyap: b must be real and square"); endif - if (! issquare (e)) - error ("lyap: e must be square"); + if (! isreal (e) || isempty (e) || ! issquare (e)) + error ("dlyap: e must be real and square"); endif - if (! ((na == nb)) && (na == ne)) - error ("lyap: a, b, e not conformal"); + if (rows (b) != rows (a) || rows (e) != rows (a)) + error ("dlyap: a, b, e not conformal"); endif if (! issymmetric (b)) - error ("lyap: b must be symmetric"); + error ("dlyap: b must be symmetric"); endif [x, scale] = slsg03ad (a, e, -b, true); # AXA' - EXE' = -B Modified: trunk/octave-forge/main/control/inst/lyap.m =================================================================== --- trunk/octave-forge/main/control/inst/lyap.m 2010-09-14 07:23:09 UTC (rev 7711) +++ trunk/octave-forge/main/control/inst/lyap.m 2010-09-14 09:11:45 UTC (rev 7712) @@ -36,7 +36,7 @@ ## Author: Lukas Reichlin <luk...@gm...> ## Created: January 2010 -## Version: 0.1 +## Version: 0.2 function [x, scale] = lyap (a, b, c, e) @@ -44,20 +44,17 @@ switch (nargin) case 2 # Lyapunov equation - - na = rows (a); - nb = rows (b); - if (! issquare (a)) - error ("lyap: a must be square"); + if (! isreal (a) || ! issquare (a) || isempty (a)) + error ("lyap: a must be real and square"); endif - if (! issquare (b)) - error ("lyap: b must be square") + if (! isreal (b) || ! issquare (b) || isempty (b)) + error ("lyap: b must be real and square") endif - if (na != nb) - error ("lyap: a and b must be of identical size"); + if (rows (a) != rows (b)) + error ("lyap: a and b must have the same number of rows"); endif [x, scale] = slsb03md (a, -b, false); # AX + XA' = -B @@ -65,21 +62,17 @@ ## x /= scale; # 0 < scale <= 1 case 3 # Sylvester equation - - n = rows (a); - m = rows (b); - [crows, ccols] = size (c); - if (! issquare (a)) - error ("lyap: a must be square"); + if (! isreal (a) || isempty (a) || ! issquare (a)) + error ("lyap: a must be real and square"); endif - if (! issquare (b)) - error ("lyap: b must be square"); + if (! isreal (b) || isempty (b) || ! issquare (b)) + error ("lyap: b must be real and square"); endif - if (crows != n || ccols != m) - error ("lyap: c must be a (%dx%d) matrix", n, m); + if (! isreal (c) || isempty (c) || rows (c) != rows (a) || columns (c) != columns (b)) + error ("lyap: c must be a real (%dx%d) matrix", rows (a), columns (b)); endif x = slsb04md (a, b, -c); # AX + XB = -C @@ -90,23 +83,19 @@ print_usage (); endif - na = rows (a); - nb = rows (b); - ne = rows (e); - - if (! issquare (a)) - error ("lyap: a must be square"); + if (! isreal (a) || isempty (a) || ! issquare (a)) + error ("lyap: a must be real and square"); endif - if (! issquare (b)) - error ("lyap: b must be square"); + if (! isreal (b) || isempty (b) || ! issquare (b)) + error ("lyap: b must be real and square"); endif - if (! issquare (e)) - error ("lyap: e must be square"); + if (! isreal (e) || isempty (e) || ! issquare (e)) + error ("lyap: e must be real and square"); endif - if (! ((na == nb)) && (na == ne)) + if (rows (b) != rows (a) || rows (e) != rows (a)) error ("lyap: a, b, e not conformal"); endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <par...@us...> - 2010-09-14 19:52:36
|
Revision: 7720 http://octave.svn.sourceforge.net/octave/?rev=7720&view=rev Author: paramaniac Date: 2010-09-14 19:52:29 +0000 (Tue, 14 Sep 2010) Log Message: ----------- control: add TODOs Modified Paths: -------------- trunk/octave-forge/main/control/inst/@lti/isstable.m trunk/octave-forge/main/control/inst/@lti/size.m trunk/octave-forge/main/control/inst/@lti/tfdata.m trunk/octave-forge/main/control/inst/@tf/__get__.m trunk/octave-forge/main/control/inst/__conv2tfpolycell__.m trunk/octave-forge/main/control/inst/bode.m trunk/octave-forge/main/control/inst/bodemag.m 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/margin.m trunk/octave-forge/main/control/inst/nichols.m trunk/octave-forge/main/control/inst/nyquist.m trunk/octave-forge/main/control/inst/pzmap.m trunk/octave-forge/main/control/inst/rlocus.m trunk/octave-forge/main/control/inst/sigma.m trunk/octave-forge/main/control/inst/step.m Modified: trunk/octave-forge/main/control/inst/@lti/isstable.m =================================================================== --- trunk/octave-forge/main/control/inst/@lti/isstable.m 2010-09-14 15:24:08 UTC (rev 7719) +++ trunk/octave-forge/main/control/inst/@lti/isstable.m 2010-09-14 19:52:29 UTC (rev 7720) @@ -27,7 +27,7 @@ function bool = isstable (sys, tol = 0) - if (nargin == 0 || nargin > 2) + if (nargin > 2) print_usage (); endif Modified: trunk/octave-forge/main/control/inst/@lti/size.m =================================================================== --- trunk/octave-forge/main/control/inst/@lti/size.m 2010-09-14 15:24:08 UTC (rev 7719) +++ trunk/octave-forge/main/control/inst/@lti/size.m 2010-09-14 19:52:29 UTC (rev 7720) @@ -28,7 +28,7 @@ function [n, varargout] = size (ltisys, idx = 0) - if (nargin != 1 && nargin != 2) + if (nargin > 2) print_usage (); endif Modified: trunk/octave-forge/main/control/inst/@lti/tfdata.m =================================================================== --- trunk/octave-forge/main/control/inst/@lti/tfdata.m 2010-09-14 15:24:08 UTC (rev 7719) +++ trunk/octave-forge/main/control/inst/@lti/tfdata.m 2010-09-14 19:52:29 UTC (rev 7720) @@ -38,8 +38,8 @@ tsam = sys.tsam; if (rtype == "vector") - num = cellfun ("@tfpoly/get", num, "UniformOutput", false); - den = cellfun ("@tfpoly/get", den, "UniformOutput", false); + num = cellfun ("@tfpoly/get", num, "uniformoutput", false); + den = cellfun ("@tfpoly/get", den, "uniformoutput", false); endif endfunction \ No newline at end of file Modified: trunk/octave-forge/main/control/inst/@tf/__get__.m =================================================================== --- trunk/octave-forge/main/control/inst/@tf/__get__.m 2010-09-14 15:24:08 UTC (rev 7719) +++ trunk/octave-forge/main/control/inst/@tf/__get__.m 2010-09-14 19:52:29 UTC (rev 7720) @@ -26,9 +26,9 @@ switch (prop) # {<internal name>, <user name>} case "num" - val = cellfun ("@tfpoly/get", sys.num, "UniformOutput", false); + val = cellfun ("@tfpoly/get", sys.num, "uniformoutput", false); case "den" - val = cellfun ("@tfpoly/get", sys.den, "UniformOutput", false); + val = cellfun ("@tfpoly/get", sys.den, "uniformoutput", false); case {"tfvar", "variable"} val = sys.tfvar; otherwise Modified: trunk/octave-forge/main/control/inst/__conv2tfpolycell__.m =================================================================== --- trunk/octave-forge/main/control/inst/__conv2tfpolycell__.m 2010-09-14 15:24:08 UTC (rev 7719) +++ trunk/octave-forge/main/control/inst/__conv2tfpolycell__.m 2010-09-14 19:52:29 UTC (rev 7720) @@ -29,6 +29,6 @@ nd = {nd}; endif - ndr = cellfun (@tfpoly, nd, "UniformOutput", false); + ndr = cellfun (@tfpoly, nd, "uniformoutput", false); endfunction \ No newline at end of file Modified: trunk/octave-forge/main/control/inst/bode.m =================================================================== --- trunk/octave-forge/main/control/inst/bode.m 2010-09-14 15:24:08 UTC (rev 7719) +++ trunk/octave-forge/main/control/inst/bode.m 2010-09-14 19:52:29 UTC (rev 7720) @@ -49,6 +49,8 @@ function [mag_r, pha_r, w_r] = bode (sys, w = []) + ## TODO: multiplot feature: bode (sys1, "b", sys2, "r", ...) + if (nargin == 0 || nargin > 2) print_usage (); endif Modified: trunk/octave-forge/main/control/inst/bodemag.m =================================================================== --- trunk/octave-forge/main/control/inst/bodemag.m 2010-09-14 15:24:08 UTC (rev 7719) +++ trunk/octave-forge/main/control/inst/bodemag.m 2010-09-14 19:52:29 UTC (rev 7720) @@ -47,6 +47,8 @@ function [mag_r, w_r] = bodemag (sys, w = []) + ## TODO: multiplot feature: bodemag (sys1, "b", sys2, "r", ...) + if (nargin == 0 || nargin > 2) print_usage (); endif Modified: trunk/octave-forge/main/control/inst/impulse.m =================================================================== --- trunk/octave-forge/main/control/inst/impulse.m 2010-09-14 15:24:08 UTC (rev 7719) +++ trunk/octave-forge/main/control/inst/impulse.m 2010-09-14 19:52:29 UTC (rev 7720) @@ -58,6 +58,8 @@ function [y_r, t_r, x_r] = impulse (sys, tfinal = [], dt = []) + ## TODO: multiplot feature: impulse (sys1, "b", sys2, "r", ...) + if (nargin == 0 || nargin > 3) print_usage (); endif Modified: trunk/octave-forge/main/control/inst/initial.m =================================================================== --- trunk/octave-forge/main/control/inst/initial.m 2010-09-14 15:24:08 UTC (rev 7719) +++ trunk/octave-forge/main/control/inst/initial.m 2010-09-14 19:52:29 UTC (rev 7720) @@ -68,6 +68,8 @@ function [y_r, t_r, x_r] = initial (sys, x0, tfinal = [], dt = []) + ## TODO: multiplot feature: initial (sys1, "b", sys2, "r", ..., x0, ...) + if (nargin < 2 || nargin > 4) print_usage (); endif Modified: trunk/octave-forge/main/control/inst/lsim.m =================================================================== --- trunk/octave-forge/main/control/inst/lsim.m 2010-09-14 15:24:08 UTC (rev 7719) +++ trunk/octave-forge/main/control/inst/lsim.m 2010-09-14 19:52:29 UTC (rev 7720) @@ -55,6 +55,8 @@ function [y_r, t_r, x_r] = lsim (sys, u, t = [], x0 = [], method = "zoh") + ## TODO: multiplot feature: lsim (sys1, "b", sys2, "r", ..., u, t) + if (nargin < 2 || nargin > 5) print_usage (); endif Modified: trunk/octave-forge/main/control/inst/margin.m =================================================================== --- trunk/octave-forge/main/control/inst/margin.m 2010-09-14 15:24:08 UTC (rev 7719) +++ trunk/octave-forge/main/control/inst/margin.m 2010-09-14 19:52:29 UTC (rev 7720) @@ -123,6 +123,8 @@ function [gamma_r, phi_r, w_gamma_r, w_phi_r] = margin (sys, tol = sqrt (eps)) + ## TODO: multiplot feature: margin (sys1, "b", sys2, "r", ...) + ## check whether arguments are OK if (nargin < 1 || nargin > 2) print_usage (); Modified: trunk/octave-forge/main/control/inst/nichols.m =================================================================== --- trunk/octave-forge/main/control/inst/nichols.m 2010-09-14 15:24:08 UTC (rev 7719) +++ trunk/octave-forge/main/control/inst/nichols.m 2010-09-14 19:52:29 UTC (rev 7720) @@ -49,6 +49,8 @@ function [mag_r, pha_r, w_r] = nichols (sys, w = []) + ## TODO: multiplot feature: nichols (sys1, "b", sys2, "r", ...) + if (nargin == 0 || nargin > 2) print_usage (); endif Modified: trunk/octave-forge/main/control/inst/nyquist.m =================================================================== --- trunk/octave-forge/main/control/inst/nyquist.m 2010-09-14 15:24:08 UTC (rev 7719) +++ trunk/octave-forge/main/control/inst/nyquist.m 2010-09-14 19:52:29 UTC (rev 7720) @@ -49,6 +49,8 @@ function [re_r, im_r, w_r] = nyquist (sys, w = []) + ## TODO: multiplot feature: nyquist (sys1, "b", sys2, "r", ...) + if (nargin == 0 || nargin > 2) print_usage (); endif Modified: trunk/octave-forge/main/control/inst/pzmap.m =================================================================== --- trunk/octave-forge/main/control/inst/pzmap.m 2010-09-14 15:24:08 UTC (rev 7719) +++ trunk/octave-forge/main/control/inst/pzmap.m 2010-09-14 19:52:29 UTC (rev 7720) @@ -27,6 +27,9 @@ function [pol_r, zer_r] = pzmap (sys) + ## TODO: multiplot feature: pzmap (sys1, "b", sys2, "r", ...) + ## TODO: use better symbols for poles and zeros, fltk backend might be helpful + if (nargin != 1) print_usage (); endif Modified: trunk/octave-forge/main/control/inst/rlocus.m =================================================================== --- trunk/octave-forge/main/control/inst/rlocus.m 2010-09-14 15:24:08 UTC (rev 7719) +++ trunk/octave-forge/main/control/inst/rlocus.m 2010-09-14 19:52:29 UTC (rev 7720) @@ -65,6 +65,8 @@ function [rldata_r, k_break, rlpol, gvec, real_ax_pts] = rlocus (sys, increment, min_k, max_k) + ## TODO: multiplot feature: rlocus (sys1, "b", sys2, "r", ...) + if (nargin < 1 || nargin > 4) print_usage (); endif Modified: trunk/octave-forge/main/control/inst/sigma.m =================================================================== --- trunk/octave-forge/main/control/inst/sigma.m 2010-09-14 15:24:08 UTC (rev 7719) +++ trunk/octave-forge/main/control/inst/sigma.m 2010-09-14 19:52:29 UTC (rev 7720) @@ -61,6 +61,8 @@ function [sv_r, w_r] = sigma (sys, w = [], resptype = 0) + ## TODO: multiplot feature: sigma (sys1, "b", sys2, "r", ...) + if (nargin == 0 || nargin > 3) print_usage (); endif Modified: trunk/octave-forge/main/control/inst/step.m =================================================================== --- trunk/octave-forge/main/control/inst/step.m 2010-09-14 15:24:08 UTC (rev 7719) +++ trunk/octave-forge/main/control/inst/step.m 2010-09-14 19:52:29 UTC (rev 7720) @@ -58,6 +58,8 @@ function [y_r, t_r, x_r] = step (sys, tfinal = [], dt = []) + ## TODO: multiplot feature: step (sys1, "b", sys2, "r", ...) + if (nargin == 0 || nargin > 3) print_usage (); endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <par...@us...> - 2010-09-14 23:59:27
|
Revision: 7721 http://octave.svn.sourceforge.net/octave/?rev=7721&view=rev Author: paramaniac Date: 2010-09-14 23:59:19 +0000 (Tue, 14 Sep 2010) Log Message: ----------- control: try sticking to GNU coding standards (just the beginning) Modified Paths: -------------- trunk/octave-forge/main/control/inst/@lti/get.m trunk/octave-forge/main/control/inst/@lti/set.m trunk/octave-forge/main/control/inst/@ss/__get__.m trunk/octave-forge/main/control/inst/@ss/__set__.m trunk/octave-forge/main/control/inst/@ss/__sysgroup__.m trunk/octave-forge/main/control/inst/@ss/ss.m trunk/octave-forge/main/control/inst/@tf/__get__.m trunk/octave-forge/main/control/inst/@tf/__set__.m trunk/octave-forge/main/control/inst/@tf/tf.m trunk/octave-forge/main/control/inst/bode.m trunk/octave-forge/main/control/inst/bodemag.m trunk/octave-forge/main/control/inst/impulse.m trunk/octave-forge/main/control/inst/initial.m trunk/octave-forge/main/control/inst/margin.m trunk/octave-forge/main/control/inst/nichols.m trunk/octave-forge/main/control/inst/nyquist.m trunk/octave-forge/main/control/inst/sigma.m trunk/octave-forge/main/control/inst/step.m Added Paths: ----------- trunk/octave-forge/main/control/inst/@lti/__property_names__.m trunk/octave-forge/main/control/inst/@ss/__property_names__.m trunk/octave-forge/main/control/inst/@tf/__property_names__.m trunk/octave-forge/main/control/inst/__frequency_response__.m trunk/octave-forge/main/control/inst/__ss_dim__.m trunk/octave-forge/main/control/inst/__tf_dim__.m trunk/octave-forge/main/control/inst/__time_response__.m Removed Paths: ------------- trunk/octave-forge/main/control/inst/@lti/__propnames__.m trunk/octave-forge/main/control/inst/@ss/__propnames__.m trunk/octave-forge/main/control/inst/@tf/__propnames__.m trunk/octave-forge/main/control/inst/__getfreqresp__.m trunk/octave-forge/main/control/inst/__ssmatdim__.m trunk/octave-forge/main/control/inst/__tfnddim__.m trunk/octave-forge/main/control/inst/__timeresp__.m Added: trunk/octave-forge/main/control/inst/@lti/__property_names__.m =================================================================== --- trunk/octave-forge/main/control/inst/@lti/__property_names__.m (rev 0) +++ trunk/octave-forge/main/control/inst/@lti/__property_names__.m 2010-09-14 23:59:19 UTC (rev 7721) @@ -0,0 +1,37 @@ +## Copyright (C) 2009 Lukas F. Reichlin +## +## 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. +## +## 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. +## +## You should have received a copy of the GNU General Public License +## along with this program. If not, see <http://www.gnu.org/licenses/>. + +## -*- texinfo -*- +## @deftypefn {Function File} {[@var{props}, @var{vals}] =} __property_names__ (@var{sys}) +## Return the list of properties as well as the assignable values for a lti object sys. +## @end deftypefn + +## Author: Lukas Reichlin <luk...@gm...> +## Created: September 2009 +## Version: 0.1 + +function [props, vals] = __property_names__ (sys) + + ## cell vector of lti-specific properties + props = {"tsam"; + "inname"; + "outname"}; + + ## cell vector of lti-specific assignable values + vals = {"scalar (sample time in seconds)"; + "m-by-1 cell vector of strings"; + "p-by-1 cell vector of strings"}; + +endfunction \ No newline at end of file Deleted: trunk/octave-forge/main/control/inst/@lti/__propnames__.m =================================================================== --- trunk/octave-forge/main/control/inst/@lti/__propnames__.m 2010-09-14 19:52:29 UTC (rev 7720) +++ trunk/octave-forge/main/control/inst/@lti/__propnames__.m 2010-09-14 23:59:19 UTC (rev 7721) @@ -1,37 +0,0 @@ -## Copyright (C) 2009 Lukas F. Reichlin -## -## 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. -## -## 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. -## -## You should have received a copy of the GNU General Public License -## along with this program. If not, see <http://www.gnu.org/licenses/>. - -## -*- texinfo -*- -## @deftypefn {Function File} {[@var{propv}, @var{asgnvalv}] =} __propnames__ (@var{sys}) -## Return the list of properties as well as the assignable values for a lti object sys. -## @end deftypefn - -## Author: Lukas Reichlin <luk...@gm...> -## Created: September 2009 -## Version: 0.1 - -function [propv, asgnvalv] = __propnames__ (sys) - - ## cell vector of lti-specific properties - propv = {"tsam"; - "inname"; - "outname"}; - - ## cell vector of lti-specific assignable values - asgnvalv = {"scalar (sample time in seconds)"; - "m-by-1 cell vector of strings"; - "p-by-1 cell vector of strings"}; - -endfunction \ No newline at end of file Modified: trunk/octave-forge/main/control/inst/@lti/get.m =================================================================== --- trunk/octave-forge/main/control/inst/@lti/get.m 2010-09-14 19:52:29 UTC (rev 7720) +++ trunk/octave-forge/main/control/inst/@lti/get.m 2010-09-14 23:59:19 UTC (rev 7721) @@ -28,10 +28,10 @@ function varargout = get (sys, varargin) if (nargin == 1) - [propv, valv] = __propnames__ (sys); - nrows = numel (propv); - str = strjust (strvcat (propv), "right"); - str = horzcat (repmat (" ", nrows, 1), str, repmat (": ", nrows, 1), strvcat (valv)); + [props, vals] = __property_names__ (sys); + nrows = numel (props); + str = strjust (strvcat (props), "right"); + str = horzcat (repmat (" ", nrows, 1), str, repmat (": ", nrows, 1), strvcat (vals)); disp (str); else for k = 1 : (nargin-1) Modified: trunk/octave-forge/main/control/inst/@lti/set.m =================================================================== --- trunk/octave-forge/main/control/inst/@lti/set.m 2010-09-14 19:52:29 UTC (rev 7720) +++ trunk/octave-forge/main/control/inst/@lti/set.m 2010-09-14 23:59:19 UTC (rev 7721) @@ -29,11 +29,11 @@ if (nargin == 1) # set (sys), sys = set (sys) - [propv, valv] = __propnames__ (sys); - nrows = numel (propv); + [props, vals] = __property_names__ (sys); + nrows = numel (props); - str = strjust (strvcat (propv), "right"); - str = horzcat (repmat (" ", nrows, 1), str, repmat (": ", nrows, 1), strvcat (valv)); + str = strjust (strvcat (props), "right"); + str = horzcat (repmat (" ", nrows, 1), str, repmat (": ", nrows, 1), strvcat (vals)); disp (str); Modified: trunk/octave-forge/main/control/inst/@ss/__get__.m =================================================================== --- trunk/octave-forge/main/control/inst/@ss/__get__.m 2010-09-14 19:52:29 UTC (rev 7720) +++ trunk/octave-forge/main/control/inst/@ss/__get__.m 2010-09-14 23:59:19 UTC (rev 7721) @@ -41,7 +41,7 @@ val = sys.stname; otherwise - error ("get: invalid property name"); + error ("ss: get: invalid property name"); endswitch Added: trunk/octave-forge/main/control/inst/@ss/__property_names__.m =================================================================== --- trunk/octave-forge/main/control/inst/@ss/__property_names__.m (rev 0) +++ trunk/octave-forge/main/control/inst/@ss/__property_names__.m 2010-09-14 23:59:19 UTC (rev 7721) @@ -0,0 +1,52 @@ +## Copyright (C) 2009 Lukas F. Reichlin +## +## 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. +## +## 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. +## +## You should have received a copy of the GNU General Public License +## along with this program. If not, see <http://www.gnu.org/licenses/>. + +## -*- texinfo -*- +## @deftypefn {Function File} {[@var{props}, @var{vals}] =} __property_names__ (@var{sys}) +## @deftypefnx {Function File} {[@var{props}, @var{vals}] =} __property_names__ (@var{sys}, @var{"specific"}) +## Return the list of properties as well as the assignable values for a ss object sys. +## @end deftypefn + +## Author: Lukas Reichlin <luk...@gm...> +## Created: September 2009 +## Version: 0.1 + +function [props, vals] = __property_names__ (sys, flg) + + ## cell vector of ss-specific properties + props = {"a"; + "b"; + "c"; + "d"; + "stname"}; + + ## cell vector of ss-specific assignable values + vals = {"n-by-n matrix (n = number of states)"; + "n-by-m matrix (m = number of inputs)"; + "p-by-n matrix (p = number of outputs)"; + "p-by-m matrix"; + "n-by-1 cell vector of strings"}; + + if (nargin == 1) + [ltiprops, ltivals] = __property_names__ (sys.lti); + + props = [props; + ltiprops]; + + vals = [vals; + ltivals]; + endif + +endfunction \ No newline at end of file Deleted: trunk/octave-forge/main/control/inst/@ss/__propnames__.m =================================================================== --- trunk/octave-forge/main/control/inst/@ss/__propnames__.m 2010-09-14 19:52:29 UTC (rev 7720) +++ trunk/octave-forge/main/control/inst/@ss/__propnames__.m 2010-09-14 23:59:19 UTC (rev 7721) @@ -1,52 +0,0 @@ -## Copyright (C) 2009 Lukas F. Reichlin -## -## 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. -## -## 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. -## -## You should have received a copy of the GNU General Public License -## along with this program. If not, see <http://www.gnu.org/licenses/>. - -## -*- texinfo -*- -## @deftypefn {Function File} {[@var{propv}, @var{asgnvalv}] =} __propnames__ (@var{sys}) -## @deftypefnx {Function File} {[@var{propv}, @var{asgnvalv}] =} __propnames__ (@var{sys}, @var{"specific"}) -## Return the list of properties as well as the assignable values for a ss object sys. -## @end deftypefn - -## Author: Lukas Reichlin <luk...@gm...> -## Created: September 2009 -## Version: 0.1 - -function [propv, asgnvalv] = __propnames__ (sys, flg) - - ## cell vector of ss-specific properties - propv = {"a"; - "b"; - "c"; - "d"; - "stname"}; - - ## cell vector of ss-specific assignable values - asgnvalv = {"n-by-n matrix (n = number of states)"; - "n-by-m matrix (m = number of inputs)"; - "p-by-n matrix (p = number of outputs)"; - "p-by-m matrix"; - "n-by-1 cell vector of strings"}; - - if (nargin == 1) - [ltipropv, ltiasgnvalv] = __propnames__ (sys.lti); - - propv = [propv; - ltipropv]; - - asgnvalv = [asgnvalv; - ltiasgnvalv]; - endif - -endfunction \ No newline at end of file Modified: trunk/octave-forge/main/control/inst/@ss/__set__.m =================================================================== --- trunk/octave-forge/main/control/inst/@ss/__set__.m 2010-09-14 19:52:29 UTC (rev 7720) +++ trunk/octave-forge/main/control/inst/@ss/__set__.m 2010-09-14 23:59:19 UTC (rev 7721) @@ -26,19 +26,19 @@ switch (prop) # {<internal name>, <user name>} case "a" - [m, n, p] = __ssmatdim__ (val, sys.b, sys.c, sys.d); + [m, n, p] = __ss_dim__ (val, sys.b, sys.c, sys.d); sys.a = val; case "b" - [m, n, p] = __ssmatdim__ (sys.a, val, sys.c, sys.d); + [m, n, p] = __ss_dim__ (sys.a, val, sys.c, sys.d); sys.b = val; case "c" - [m, n, p] = __ssmatdim__ (sys.a, sys.b, val, sys.d); + [m, n, p] = __ss_dim__ (sys.a, sys.b, val, sys.d); sys.c = val; case "d" - [m, n, p] = __ssmatdim__ (sys.a, sys.b, sys.c, val); + [m, n, p] = __ss_dim__ (sys.a, sys.b, sys.c, val); sys.d = val; case {"stname", "statename"} @@ -46,7 +46,7 @@ sys.stname = __checkname__ (val, n); otherwise - error ("set: invalid property name"); + error ("ss: set: invalid property name"); endswitch Modified: trunk/octave-forge/main/control/inst/@ss/__sysgroup__.m =================================================================== --- trunk/octave-forge/main/control/inst/@ss/__sysgroup__.m 2010-09-14 19:52:29 UTC (rev 7720) +++ trunk/octave-forge/main/control/inst/@ss/__sysgroup__.m 2010-09-14 23:59:19 UTC (rev 7721) @@ -47,8 +47,8 @@ C2 = sys2.c; D2 = sys2.d; - [m1, n1, p1] = __ssmatdim__ (A1, B1, C1, D1); - [m2, n2, p2] = __ssmatdim__ (A2, B2, C2, D2); + [m1, n1, p1] = __ss_dim__ (A1, B1, C1, D1); + [m2, n2, p2] = __ss_dim__ (A2, B2, C2, D2); A12 = zeros (n1, n2); B12 = zeros (n1, m2); Modified: trunk/octave-forge/main/control/inst/@ss/ss.m =================================================================== --- trunk/octave-forge/main/control/inst/@ss/ss.m 2010-09-14 19:52:29 UTC (rev 7720) +++ trunk/octave-forge/main/control/inst/@ss/ss.m 2010-09-14 23:59:19 UTC (rev 7721) @@ -54,7 +54,7 @@ function sys = ss (a = [], b = [], c = [], d = [], varargin) ## model precedence: frd > ss > zpk > tf > double - %inferiorto ("frd"); + ## inferiorto ("frd"); superiorto ("zpk", "tf", "double"); argc = 0; @@ -113,7 +113,7 @@ tsam = -1; endif - [m, n, p] = __ssmatdim__ (a, b, c, d); + [m, n, p] = __ss_dim__ (a, b, c, d); stname = repmat ({""}, n, 1); Modified: trunk/octave-forge/main/control/inst/@tf/__get__.m =================================================================== --- trunk/octave-forge/main/control/inst/@tf/__get__.m 2010-09-14 19:52:29 UTC (rev 7720) +++ trunk/octave-forge/main/control/inst/@tf/__get__.m 2010-09-14 23:59:19 UTC (rev 7721) @@ -27,12 +27,15 @@ switch (prop) # {<internal name>, <user name>} case "num" val = cellfun ("@tfpoly/get", sys.num, "uniformoutput", false); + case "den" val = cellfun ("@tfpoly/get", sys.den, "uniformoutput", false); + case {"tfvar", "variable"} val = sys.tfvar; + otherwise - error ("get: invalid property name"); + error ("tf: get: invalid property name"); endswitch endfunction \ No newline at end of file Added: trunk/octave-forge/main/control/inst/@tf/__property_names__.m =================================================================== --- trunk/octave-forge/main/control/inst/@tf/__property_names__.m (rev 0) +++ trunk/octave-forge/main/control/inst/@tf/__property_names__.m 2010-09-14 23:59:19 UTC (rev 7721) @@ -0,0 +1,48 @@ +## Copyright (C) 2009 Lukas F. Reichlin +## +## 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. +## +## 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. +## +## You should have received a copy of the GNU General Public License +## along with this program. If not, see <http://www.gnu.org/licenses/>. + +## -*- texinfo -*- +## @deftypefn {Function File} {[@var{props}, @var{vals}] =} __property_names__ (@var{sys}) +## @deftypefnx {Function File} {[@var{props}, @var{vals}] =} __property_names__ (@var{sys}, @var{"specific"}) +## Return the list of properties as well as the assignable values for a ss object sys. +## @end deftypefn + +## Author: Lukas Reichlin <luk...@gm...> +## Created: October 2009 +## Version: 0.1 + +function [props, vals] = __property_names__ (sys, flg) + + ## cell vector of tf-specific properties + props = {"num"; + "den"; + "tfvar"}; + + ## cell vector of tf-specific assignable values + vals = {"p-by-m cell array of row vectors (m = number of inputs)"; + "p-by-m cell array of row vectors (p = number of outputs)"; + "string (usually s or z)"}; + + if (nargin == 1) + [ltiprops, ltivals] = __property_names__ (sys.lti); + + props = [props; + ltiprops]; + + vals = [vals; + ltivals]; + endif + +endfunction \ No newline at end of file Deleted: trunk/octave-forge/main/control/inst/@tf/__propnames__.m =================================================================== --- trunk/octave-forge/main/control/inst/@tf/__propnames__.m 2010-09-14 19:52:29 UTC (rev 7720) +++ trunk/octave-forge/main/control/inst/@tf/__propnames__.m 2010-09-14 23:59:19 UTC (rev 7721) @@ -1,48 +0,0 @@ -## Copyright (C) 2009 Lukas F. Reichlin -## -## 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. -## -## 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. -## -## You should have received a copy of the GNU General Public License -## along with this program. If not, see <http://www.gnu.org/licenses/>. - -## -*- texinfo -*- -## @deftypefn {Function File} {[@var{propv}, @var{asgnvalv}] =} __propnames__ (@var{sys}) -## @deftypefnx {Function File} {[@var{propv}, @var{asgnvalv}] =} __propnames__ (@var{sys}, @var{"specific"}) -## Return the list of properties as well as the assignable values for a ss object sys. -## @end deftypefn - -## Author: Lukas Reichlin <luk...@gm...> -## Created: October 2009 -## Version: 0.1 - -function [propv, asgnvalv] = __propnames__ (sys, flg) - - ## cell vector of tf-specific properties - propv = {"num"; - "den"; - "tfvar"}; - - ## cell vector of tf-specific assignable values - asgnvalv = {"p-by-m cell array of row vectors (m = number of inputs)"; - "p-by-m cell array of row vectors (p = number of outputs)"; - "string (usually s or z)"}; - - if (nargin == 1) - [ltipropv, ltiasgnvalv] = __propnames__ (sys.lti); - - propv = [propv; - ltipropv]; - - asgnvalv = [asgnvalv; - ltiasgnvalv]; - endif - -endfunction \ No newline at end of file Modified: trunk/octave-forge/main/control/inst/@tf/__set__.m =================================================================== --- trunk/octave-forge/main/control/inst/@tf/__set__.m 2010-09-14 19:52:29 UTC (rev 7720) +++ trunk/octave-forge/main/control/inst/@tf/__set__.m 2010-09-14 23:59:19 UTC (rev 7721) @@ -27,12 +27,12 @@ switch (prop) # {<internal name>, <user name>} case "num" num = __conv2tfpolycell__ (val); - [p, m] = __tfnddim__ (num, sys.den); + [p, m] = __tf_dim__ (num, sys.den); sys.num = num; case "den" den = __conv2tfpolycell__ (val); - [p, m] = __tfnddim__ (sys.num, den); + [p, m] = __tf_dim__ (sys.num, den); sys.den = den; case {"tfvar", "variable"} @@ -43,7 +43,7 @@ endif otherwise - error ("set: invalid property name"); + error ("tf: set: invalid property name"); endswitch Modified: trunk/octave-forge/main/control/inst/@tf/tf.m =================================================================== --- trunk/octave-forge/main/control/inst/@tf/tf.m 2010-09-14 19:52:29 UTC (rev 7720) +++ trunk/octave-forge/main/control/inst/@tf/tf.m 2010-09-14 23:59:19 UTC (rev 7721) @@ -59,7 +59,7 @@ function sys = tf (num = {}, den = {}, varargin) ## model precedence: frd > ss > zpk > tf > double - %inferiorto ("frd", "ss", "zpk"); # error if de-commented. bug in octave? + ## inferiorto ("frd", "ss", "zpk"); # error if de-commented. bug in octave? superiorto ("double"); argc = 0; @@ -134,7 +134,7 @@ endswitch - [p, m] = __tfnddim__ (num, den); + [p, m] = __tf_dim__ (num, den); tfdata = struct ("num", {num}, "den", {den}, Added: trunk/octave-forge/main/control/inst/__frequency_response__.m =================================================================== --- trunk/octave-forge/main/control/inst/__frequency_response__.m (rev 0) +++ trunk/octave-forge/main/control/inst/__frequency_response__.m 2010-09-14 23:59:19 UTC (rev 7721) @@ -0,0 +1,52 @@ +## Copyright (C) 2009 Lukas F. Reichlin +## +## This file is part of LTI Syncope. +## +## 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. +## +## 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. If not, see <http://www.gnu.org/licenses/>. + +## -*- texinfo -*- +## Return frequency response H and frequency vector w. +## If w is empty, it will be calculated by __freqbounds__ + +## Author: Lukas Reichlin <luk...@gm...> +## Created: November 2009 +## Version: 0.1 + +function [H, w] = __frequency_response__ (sys, w = [], mimoflag = 0, resptype = 0, wbounds = "std") + + ## check arguments + if(! isa (sys, "lti")) + error ("frequency_response: first argument sys must be a LTI system"); + endif + + if (! isempty (w) && ! (isreal (w) && isvector (w))) + error ("frequency_response: second argument w must be a vector of frequencies"); + endif + + if (! mimoflag && ! issiso (sys)) + error ("frequency_response: require SISO system"); + endif + + ## find interesting frequency range w if not specified + if (isempty (w)) + ## begin plot at 10^dec_min, end plot at 10^dec_max [rad/s] + [dec_min, dec_max] = __freqbounds__ (sys, wbounds); + + w = logspace (dec_min, dec_max, 500); # [rad/s] + endif + + ## frequency response + H = __freqresp__ (sys, w, resptype); + +endfunction \ No newline at end of file Deleted: trunk/octave-forge/main/control/inst/__getfreqresp__.m =================================================================== --- trunk/octave-forge/main/control/inst/__getfreqresp__.m 2010-09-14 19:52:29 UTC (rev 7720) +++ trunk/octave-forge/main/control/inst/__getfreqresp__.m 2010-09-14 23:59:19 UTC (rev 7721) @@ -1,52 +0,0 @@ -## Copyright (C) 2009 Lukas F. Reichlin -## -## This file is part of LTI Syncope. -## -## 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. -## -## 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. If not, see <http://www.gnu.org/licenses/>. - -## -*- texinfo -*- -## Return frequency response H and frequency vector w. -## If w is empty, it will be calculated by __freqbounds__ - -## Author: Lukas Reichlin <luk...@gm...> -## Created: November 2009 -## Version: 0.1 - -function [H, w] = __getfreqresp__ (sys, w = [], mimoflag = 0, resptype = 0, wbounds = "std") - - ## check arguments - if(! isa (sys, "lti")) - error ("getfreqresp: first argument sys must be a LTI system"); - endif - - if (! isempty (w) && ! (isreal (w) && isvector (w))) - error ("getfreqresp: second argument w must be a vector of frequencies"); - endif - - if (! mimoflag && ! issiso (sys)) - error ("getfreqresp: require SISO system"); - endif - - ## find interesting frequency range w if not specified - if (isempty (w)) - ## begin plot at 10^dec_min, end plot at 10^dec_max [rad/s] - [dec_min, dec_max] = __freqbounds__ (sys, wbounds); - - w = logspace (dec_min, dec_max, 500); # [rad/s] - endif - - ## frequency response - H = __freqresp__ (sys, w, resptype); - -endfunction \ No newline at end of file Added: trunk/octave-forge/main/control/inst/__ss_dim__.m =================================================================== --- trunk/octave-forge/main/control/inst/__ss_dim__.m (rev 0) +++ trunk/octave-forge/main/control/inst/__ss_dim__.m 2010-09-14 23:59:19 UTC (rev 7721) @@ -0,0 +1,65 @@ +## Copyright (C) 2009 Lukas F. Reichlin +## +## This file is part of LTI Syncope. +## +## 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. +## +## 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. If not, see <http://www.gnu.org/licenses/>. + +## -*- texinfo -*- +## 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.2 + +function [m, n, p] = __ss_dim__ (a, b, c, d) + + [arows, acols] = size (a); + [brows, bcols] = size (b); + [crows, ccols] = size (c); + [drows, dcols] = size (d); + + 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); + endif + + if (brows != arows) + error ("ss: system matrices a(%dx%d) and b(%dx%d) are incompatible", + arows, acols, brows, bcols); + endif + + if (ccols != acols) + error ("ss: system matrices a(%dx%d) and c(%dx%d) are incompatible", + arows, acols, crows, ccols); + endif + + if (bcols != dcols) + error ("ss: system matrices b(%dx%d) and d(%dx%d) are incompatible", + brows, bcols, drows, dcols); + endif + + if (crows != drows) + error ("ss: system matrices c(%dx%d) and d(%dx%d) are incompatible", + crows, ccols, drows, dcols); + endif + + if (! isreal (a) || ! isreal (b) || ! isreal (c) || ! isreal (d)) + error ("ss: system matrices are not real"); + endif + +endfunction Deleted: trunk/octave-forge/main/control/inst/__ssmatdim__.m =================================================================== --- trunk/octave-forge/main/control/inst/__ssmatdim__.m 2010-09-14 19:52:29 UTC (rev 7720) +++ trunk/octave-forge/main/control/inst/__ssmatdim__.m 2010-09-14 23:59:19 UTC (rev 7721) @@ -1,65 +0,0 @@ -## Copyright (C) 2009 Lukas F. Reichlin -## -## This file is part of LTI Syncope. -## -## 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. -## -## 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. If not, see <http://www.gnu.org/licenses/>. - -## -*- texinfo -*- -## 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.2 - -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); - - 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); - endif - - if (brows != arows) - error ("ss: system matrices a(%dx%d) and b(%dx%d) are incompatible", - arows, acols, brows, bcols); - endif - - if (ccols != acols) - error ("ss: system matrices a(%dx%d) and c(%dx%d) are incompatible", - arows, acols, crows, ccols); - endif - - if (bcols != dcols) - error ("ss: system matrices b(%dx%d) and d(%dx%d) are incompatible", - brows, bcols, drows, dcols); - endif - - if (crows != drows) - error ("ss: system matrices c(%dx%d) and d(%dx%d) are incompatible", - crows, ccols, drows, dcols); - endif - - if (! isreal (a) || ! isreal (b) || ! isreal (c) || ! isreal (d)) - error ("ss: system matrices are not real"); - endif - -endfunction Added: trunk/octave-forge/main/control/inst/__tf_dim__.m =================================================================== --- trunk/octave-forge/main/control/inst/__tf_dim__.m (rev 0) +++ trunk/octave-forge/main/control/inst/__tf_dim__.m 2010-09-14 23:59:19 UTC (rev 7721) @@ -0,0 +1,36 @@ +## Copyright (C) 2009 Lukas F. Reichlin +## +## This file is part of LTI Syncope. +## +## 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. +## +## 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. If not, see <http://www.gnu.org/licenses/>. + +## -*- texinfo -*- +## Number of outputs and inputs of transfer function numerator and +## denominator. For internal use only. + +## Author: Lukas Reichlin <luk...@gm...> +## Created: October 2009 +## Version: 0.1 + +function [nrows, ncols] = __tf_dim__ (num, den) + + [nrows, ncols] = size (num); + [drows, dcols] = size (den); + + if (nrows != drows || ncols != dcols) + error ("tf: num(%dx%d) and den(%dx%d) must have equal dimensions", + nrows, ncols, drows, dcols); + endif + +endfunction \ No newline at end of file Deleted: trunk/octave-forge/main/control/inst/__tfnddim__.m =================================================================== --- trunk/octave-forge/main/control/inst/__tfnddim__.m 2010-09-14 19:52:29 UTC (rev 7720) +++ trunk/octave-forge/main/control/inst/__tfnddim__.m 2010-09-14 23:59:19 UTC (rev 7721) @@ -1,36 +0,0 @@ -## Copyright (C) 2009 Lukas F. Reichlin -## -## This file is part of LTI Syncope. -## -## 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. -## -## 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. If not, see <http://www.gnu.org/licenses/>. - -## -*- texinfo -*- -## Number of outputs and inputs of transfer function numerator and -## denominator. For internal use only. - -## Author: Lukas Reichlin <luk...@gm...> -## Created: October 2009 -## Version: 0.1 - -function [nrows, ncols] = __tfnddim__ (num, den) - - [nrows, ncols] = size (num); - [drows, dcols] = size (den); - - if (nrows != drows || ncols != dcols) - error ("tf: num(%dx%d) and den(%dx%d) must have equal dimensions", - nrows, ncols, drows, dcols); - endif - -endfunction \ No newline at end of file Added: trunk/octave-forge/main/control/inst/__time_response__.m =================================================================== --- trunk/octave-forge/main/control/inst/__time_response__.m (rev 0) +++ trunk/octave-forge/main/control/inst/__time_response__.m 2010-09-14 23:59:19 UTC (rev 7721) @@ -0,0 +1,309 @@ +## Copyright (C) 2009 - 2010 Lukas F. Reichlin +## +## This file is part of LTI Syncope. +## +## 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. +## +## 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. If not, see <http://www.gnu.org/licenses/>. + +## -*- texinfo -*- +## Common code for the time response functions step, impulse and initial. + +## Author: Lukas Reichlin <luk...@gm...> +## Created: October 2009 +## Version: 0.2 + +function [y, t, x_arr] = __time_response__ (sys, resptype, plotflag, tfinal, dt, x0) + + if (! isa (sys, "ss")) + sys = ss (sys); # sys must be proper + endif + + if (! isempty (tfinal) && ! isscalar (tfinal)) # time vector t passed + dt = tfinal(2) - tfinal(1); # assume that t is regularly spaced + tfinal = tfinal(end); + endif + + [A, B, C, D, tsam] = ssdata (sys); + + discrete = ! isct (sys); # static gains are treated as analog systems + + if (discrete) + if (! isempty (dt)) + warning ("time_response: argument dt has no effect on sampling time of discrete system"); + endif + + dt = tsam; + endif + + [tfinal, dt] = __sim_horizon__ (A, discrete, tfinal, dt); + + if (! discrete) + sys = c2d (sys, dt, "zoh"); + endif + + [F, G] = ssdata (sys); # matrices C and D don't change + + n = rows (F); # number of states + m = columns (G); # number of inputs + p = rows (C); # number of outputs + + ## time vector + t = reshape (0 : dt : tfinal, [], 1); + l_t = length (t); + + switch (resptype) + case "initial" + str = "Response to Initial Conditions"; + yfinal = zeros (p, 1); + + ## preallocate memory + y = zeros (l_t, p); + x_arr = zeros (l_t, n); + + ## initial conditions + x = reshape (x0, [], 1); # make sure that x is a column vector + + if (n != length (x0)) + error ("initial: x0 must be a vector with %d elements", n); + endif + + ## simulation + for k = 1 : l_t + y(k, :) = C * x; + x_arr(k, :) = x; + x = F * x; + endfor + + case "step" + str = "Step Response"; + yfinal = dcgain (sys); + + ## preallocate memory + y = zeros (l_t, p, m); + x_arr = zeros (l_t, n, m); + + for j = 1 : m # for every input channel + ## initial conditions + x = zeros (n, 1); + u = zeros (m, 1); + u(j) = 1; + + ## simulation + for k = 1 : l_t + y(k, :, j) = C * x + D * u; + x_arr(k, :, j) = x; + x = F * x + G * u; + endfor + endfor + + case "impulse" + str = "Impulse Response"; + yfinal = zeros (p, m); + + ## preallocate memory + y = zeros (l_t, p, m); + x_arr = zeros (l_t, n, m); + + for j = 1 : m # for every input channel + ## initial conditions + u = zeros (m, 1); + u(j) = 1; + + if (discrete) + x = zeros (n, 1); # zero by definition + y(1, :, j) = D * u / dt; + x_arr(1, :, j) = x; + x = G * u / dt; + else + x = B * u; # B, not G! + y(1, :, j) = C * x; + x_arr(1, :, j) = x; + x = F * x; + endif + + ## simulation + for k = 2 : l_t + y (k, :, j) = C * x; + x_arr(k, :, j) = x; + x = F * x; + endfor + endfor + + if (discrete) + y *= dt; + x_arr *= dt; + endif + + otherwise + error ("time_response: invalid response type"); + + endswitch + + + if (plotflag) # display plot + + ## TODO: Set correct titles, especially for multi-input systems + ## Limitations probably due to the Gnuplot backend + + stable = isstable (sys); + outname = get (sys, "outname"); + + if (isempty (outname) || isequal ("", outname{:})) + outname = strseq ("y_", 1 : length (outname)); + else + outname = __markemptynames__ (outname); + endif + + if (strcmp (resptype, "initial")) + cols = 1; + else + cols = m; + endif + + if (discrete) # discrete system + for k = 1 : p + for j = 1 : cols + + subplot (p, cols, (k-1)*cols+j); + + if (stable) + stairs (t, [y(:, k, j), yfinal(k, j) * ones(l_t, 1)]); + else + stairs (t, y(:, k, j)); + endif + + grid ("on"); + + if (k == 1 && j == 1) + title (str); + endif + + if (j == 1) + ylabel (sprintf ("Amplitude %s", outname{k})); + endif + + endfor + endfor + + xlabel ("Time [s]"); + + else # continuous system + for k = 1 : p + for j = 1 : cols + + subplot (p, cols, (k-1)*cols+j); + + if (stable) + plot (t, [y(:, k, j), yfinal(k, j) * ones(l_t, 1)]); + else + plot (t, y(:, k, j)); + endif + + grid ("on"); + + if (k == 1 && j == 1) + title (str); + endif + + if (j == 1) + ylabel (sprintf ("Amplitude %s", outname{k})); + endif + + endfor + endfor + + xlabel ("Time [s]"); + + endif + endif + +endfunction + + +function [tfinal, dt] = __sim_horizon__ (A, discrete, tfinal, Ts) + + ## code based on __stepimp__.m of Kai P. Mueller and A. Scottedward Hodel + + TOL = 1.0e-10; # values below TOL are assumed to be zero + N_MIN = 50; # min number of points + N_MAX = 2000; # max number of points + N_DEF = 1000; # default number of points + T_DEF = 10; # default simulation time + + n = rows (A); + eigw = eig (A); + + if (discrete) + ## perform bilinear transformation on poles in z + for k = 1 : n + pol = eigw(k); + if (abs (pol + 1) < TOL) + eigw(k) = 0; + else + eigw(k) = 2 / Ts * (pol - 1) / (pol + 1); + endif + endfor + endif + + ## remove poles near zero from eigenvalue array eigw + nk = n; + for k = 1 : n + if (abs (real (eigw(k))) < TOL) + eigw(k) = 0; + nk -= 1; + endif + endfor + + if (nk == 0) + if (isempty (tfinal)) + tfinal = T_DEF; + endif + + if (! discrete) + dt = tfinal / N_DEF; + endif + else + eigw = eigw(find (eigw)); + eigw_max = max (abs (eigw)); + + if (! discrete) + dt = 0.2 * pi / eigw_max; + endif + + if (isempty (tfinal)) + eigw_min = min (abs (real (eigw))); + tfinal = 5.0 / eigw_min; + + ## round up + yy = 10^(ceil (log10 (tfinal)) - 1); + tfinal = yy * ceil (tfinal / yy); + endif + + if (! discrete) + N = tfinal / dt; + + if (N < N_MIN) + dt = tfinal / N_MIN; + endif + + if (N > N_MAX) + dt = tfinal / N_MAX; + endif + endif + endif + + if (! isempty (Ts)) # catch case analog system with dt specified + dt = Ts; + endif + +endfunction Deleted: trunk/octave-forge/main/control/inst/__timeresp__.m =================================================================== --- trunk/octave-forge/main/control/inst/__timeresp__.m 2010-09-14 19:52:29 UTC (rev 7720) +++ trunk/octave-forge/main/control/inst/__timeresp__.m 2010-09-14 23:59:19 UTC (rev 7721) @@ -1,309 +0,0 @@ -## Copyright (C) 2009 - 2010 Lukas F. Reichlin -## -## This file is part of LTI Syncope. -## -## 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. -## -## 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. If not, see <http://www.gnu.org/licenses/>. - -## -*- texinfo -*- -## Common code for the time response functions step, impulse and initial. - -## Author: Lukas Reichlin <luk...@gm...> -## Created: October 2009 -## Version: 0.2 - -function [y, t, x_arr] = __timeresp__ (sys, resptype, plotflag, tfinal, dt, x0) - - if (! isa (sys, "ss")) - sys = ss (sys); # sys must be proper - endif - - if (! isempty (tfinal) && ! isscalar (tfinal)) # time vector t passed - dt = tfinal(2) - tfinal(1); # assume that t is regularly spaced - tfinal = tfinal(end); - endif - - [A, B, C, D, tsam] = ssdata (sys); - - discrete = ! isct (sys); # static gains are treated as analog systems - - if (discrete) - if (! isempty (dt)) - warning ("timeresp: argument dt has no effect on sampling time of discrete system"); - endif - - dt = tsam; - endif - - [tfinal, dt] = __simhorizon__ (A, discrete, tfinal, dt); - - if (! discrete) - sys = c2d (sys, dt, "zoh"); - endif - - [F, G] = ssdata (sys); # matrices C and D don't change - - n = rows (F); # number of states - m = columns (G); # number of inputs - p = rows (C); # number of outputs - - ## time vector - t = reshape (0 : dt : tfinal, [], 1); - l_t = length (t); - - switch (resptype) - case "initial" - str = "Response to Initial Conditions"; - yfinal = zeros (p, 1); - - ## preallocate memory - y = zeros (l_t, p); - x_arr = zeros (l_t, n); - - ## initial conditions - x = reshape (x0, [], 1); # make sure that x is a column vector - - if (n != length (x0)) - error ("initial: x0 must be a vector with %d elements", n); - endif - - ## simulation - for k = 1 : l_t - y(k, :) = C * x; - x_arr(k, :) = x; - x = F * x; - endfor - - case "step" - str = "Step Response"; - yfinal = dcgain (sys); - - ## preallocate memory - y = zeros (l_t, p, m); - x_arr = zeros (l_t, n, m); - - for j = 1 : m # for every input channel - ## initial conditions - x = zeros (n, 1); - u = zeros (m, 1); - u(j) = 1; - - ## simulation - for k = 1 : l_t - y(k, :, j) = C * x + D * u; - x_arr(k, :, j) = x; - x = F * x + G * u; - endfor - endfor - - case "impulse" - str = "Impulse Response"; - yfinal = zeros (p, m); - - ## preallocate memory - y = zeros (l_t, p, m); - x_arr = zeros (l_t, n, m); - - for j = 1 : m # for every input channel - ## initial conditions - u = zeros (m, 1); - u(j) = 1; - - if (discrete) - x = zeros (n, 1); # zero by definition - y(1, :, j) = D * u / dt; - x_arr(1, :, j) = x; - x = G * u / dt; - else - x = B * u; # B, not G! - y(1, :, j) = C * x; - x_arr(1, :, j) = x; - x = F * x; - endif - - ## simulation - for k = 2 : l_t - y (k, :, j) = C * x; - x_arr(k, :, j) = x; - x = F * x; - endfor - endfor - - if (discrete) - y *= dt; - x_arr *= dt; - endif - - otherwise - error ("timeresp: invalid response type"); - - endswitch - - - if (plotflag) # display plot - - ## TODO: Set correct titles, especially for multi-input systems - ## Limitations probably due to the Gnuplot backend - - stable = isstable (sys); - outname = get (sys, "outname"); - - if (isempty (outname) || isequal ("", outname{:})) - outname = strseq ("y_", 1 : length (outname)); - else - outname = __markemptynames__ (outname); - endif - - if (strcmp (resptype, "initial")) - cols = 1; - else - cols = m; - endif - - if (discrete) # discrete system - for k = 1 : p - for j = 1 : cols - - subplot (p, cols, (k-1)*cols+j); - - if (stable) - stairs (t, [y(:, k, j), yfinal(k, j) * ones(l_t, 1)]); - else - stairs (t, y(:, k, j)); - endif - - grid ("on"); - - if (k == 1 && j == 1) - title (str); - endif - - if (j == 1) - ylabel (sprintf ("Amplitude %s", outname{k})); - endif - - endfor - endfor - - xlabel ("Time [s]"); - - else # continuous system - for k = 1 : p - for j = 1 : cols - - subplot (p, cols, (k-1)*cols+j); - - if (stable) - plot (t, [y(:, k, j), yfinal(k, j) * ones(l_t, 1)]); - else - plot (t, y(:, k, j)); - endif - - grid ("on"); - - if (k == 1 && j == 1) - title (str); - endif - - if (j == 1) - ylabel (sprintf ("Amplitude %s", outname{k})); - endif - - endfor - endfor - - xlabel ("Time [s]"); - - endif - endif - -endfunction - - -function [tfinal, dt] = __simhorizon__ (A, discrete, tfinal, Ts) - - ## code based on __stepimp__.m of Kai P. Mueller and A. Scottedward Hodel - - TOL = 1.0e-10; # values below TOL are assumed to be zero - N_MIN = 50; # min number of points - N_MAX = 2000; # max number of points - N_DEF = 1000; # default number of points - T_DEF = 10; # default simulation time - - n = rows (A); - eigw = eig (A); - - if (discrete) - ## perform bilinear transformation on poles in z - for k = 1 : n - pol = eigw(k); - if (abs (pol + 1) < TOL) - eigw(k) = 0; - else - eigw(k) = 2 / Ts * (pol - 1) / (pol + 1); - endif - endfor - endif - - ## remove poles near zero from eigenvalue array eigw - nk = n; - for k = 1 : n - if (abs (real (eigw(k))) < TOL) - eigw(k) = 0; - nk -= 1; - endif - endfor - - if (nk == 0) - if (isempty (tfinal)) - tfinal = T_DEF; - endif - - if (! discrete) - dt = tfinal / N_DEF; - endif - else - eigw = eigw(find (eigw)); - eigw_max = max (abs (eigw)); - - if (! discrete) - dt = 0.2 * pi / eigw_max; - endif - - if (isempty (tfinal)) - eigw_min = min (abs (real (eigw))); - tfinal = 5.0 / eigw_min; - - ## round up - yy = 10^(ceil (log10 (tfinal)) - 1); - tfinal = yy * ceil (tfinal / yy); - endif - - if (! discrete) - N = tfinal / dt; - - if (N < N_MIN) - dt = tfinal / N_MIN; - endif - - if (N > N_MAX) - dt = tfinal / N_MAX; - endif - endif - endif - - if (! isempty (Ts)) # catch case analog system with dt specified - dt = Ts; - endif - -endfunction Modified: trunk/octave-forge/main/control/inst/bode.m =================================================================== --- trunk/octave-forge/main/control/inst/bode.m 2010-09-14 19:52:29 UTC (rev 7720) +++ trunk/octave-forge/main/control/inst/bode.m 2010-09-14 23:59:19 UTC (rev 7721) @@ -55,7 +55,7 @@ print_usage (); endif - [H, w] = __getfreqresp__ (sys, w, false, 0, "std"); + [H, w] = __frequency_response__ (sys, w, false, 0, "std"); H = reshape (H, [], 1); mag = abs (H); Modified: trunk/octave-forge/main/control/inst/bodemag.m =================================================================== --- trunk/octave-forge/main/control/inst/bodemag.m 2010-09-14 19:52:29 UTC (rev 7720) +++ trunk/octave-forge/main/control/inst/bodemag.m 2010-09-14 23:59:19 UTC (rev 7721) @@ -53,7 +53,7 @@ print_usage (); endif - [H, w] = __getfreqresp__ (sys, w, false, 0, "std"); + [H, w] = __frequency_response__ (sys, w, false, 0, "std"); H = reshape (H, [], 1); mag = abs (H); Modified: trunk/octave-forge/main/control/inst/impulse.m =================================================================== --- trunk/octave-forge/main/control/inst/impulse.m 2010-09-14 19:52:29 UTC (rev 7720) +++ trunk/octave-forge/main/control/inst/impulse.m 2010-09-14 23:59:19 UTC (rev 7721) @@ -64,7 +64,7 @@ print_usage (); endif - [y, t, x] = __timeresp__ (sys, "impulse", ! nargout, tfinal, dt); + [y, t, x] = __time_response__ (sys, "impulse", ! nargout, tfinal, dt); if (nargout) y_r = y; Modified: trunk/octave-forge/main/control/inst/initial.m =================================================================== --- trunk/octave-forge/main/control/inst/initial.m 2010-09-14 19:52:29 UTC (rev 7720) +++ trunk/octave-forge/main/control/inst/initial.m 2010-09-14 23:59:19 UTC (rev 7721) @@ -74,7 +74,7 @@ print_usage (); endif - [y, t, x] = __timeresp__ (sys, "initial", ! nargout, tfinal, dt, x0); + [y, t, x] = __time_response__ (sys, "initial", ! nargout, tfinal, dt, x0); if (nargout) y_r = y; Modified: trunk/octave-forge/main/control/inst/margin.m =================================================================== --- trunk/octave-forge/main/control/inst/margin.m 2010-09-14 19:52:29 UTC (rev 7720) +++ trunk/octave-forge/main/control/inst/margin.m 2010-09-14 23:59:19 UTC (rev 7721) @@ -262,7 +262,7 @@ if (nargout == 0) # show bode diagram - [H, w] = __getfreqresp__ (sys, [], false, 0, "std"); + [H, w] = __frequency_response__ (sys, [], false, 0, "std"); H = reshape (H, [], 1); mag_db = 20 * log10 (abs (H)); Modified: trunk/octave-forge/main/control/inst/nichols.m =================================================================== --- trunk/octave-forge/main/control/inst/nichols.m 2010-09-14 19:52:29 UTC (rev 7720) +++ trunk/octave-forge/main/control/inst/nichols.m 2010-09-14 23:59:19 UTC (rev 7721) @@ -55,7 +55,7 @@ print_usage (); endif - [H, w] = __getfreqresp__ (sys, w, false, 0, "ext"); + [H, w] = __frequency_response__ (sys, w, false, 0, "ext"); H = reshape (H, [], 1); mag = abs (H); Modified: trunk/octave-forge/main/control/inst/nyquist.m =================================================================== --- trunk/octave-forge/main/control/inst/nyquist.m 2010-09-14 19:52:29 UTC (rev 7720) +++ trunk/octave-forge/main/control/inst/nyquist.m 2010-09-14 23:59:19 UTC (rev 7721) @@ -55,7 +55,7 @@ print_usage (); endif - [H, w] = __getfreqresp__ (sys, w, false, 0, "ext"); + [H, w] = __frequency_response__ (sys, w, false, 0, "ext"); H = reshape (H, [], 1); re = real (H); Modified: trunk/octave-forge/main/control/inst/sigma.m =================================================================== --- trunk/octave-forge/main/control/inst/sigma.m 2010-09-14 19:52:29 UTC (rev 7720) +++ trunk/octave-forge/main/control/inst/sigma.m 2010-09-14 23:59:19 UTC (rev 7721) @@ -67,7 +67,7 @@ print_usage (); endif - [H, w] = __getfreqresp__ (sys, w, true, resptype, "std"); + [H, w] = __frequency_response__ (sys, w, true, resptype, "std"); [p, m] = size (sys); l_w = length (w); Modified: trunk/octave-forge/main/control/inst/step.m =================================================================== --- trunk/octave-forge/main/control/inst/step.m 2010-09-14 19:52:29 UTC (rev 7720) +++ trunk/octave-forge/main/control/inst/step.m 2010-09-14 23:59:19 UTC (rev 7721) @@ -64,7 +64,7 @@ print_usage (); endif - [y, t, x] = __timeresp__ (sys, "step", ! nargout, tfinal, dt); + [y, t, x] = __time_response__ (sys, "step", ! nargout, tfinal, dt); if (nargout) y_r = y; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <par...@us...> - 2010-09-15 00:13:47
|
Revision: 7722 http://octave.svn.sourceforge.net/octave/?rev=7722&view=rev Author: paramaniac Date: 2010-09-15 00:13:40 +0000 (Wed, 15 Sep 2010) Log Message: ----------- control: try sticking to GNU coding standards (more to come) Modified Paths: -------------- trunk/octave-forge/main/control/inst/@ss/__sysgroup__.m trunk/octave-forge/main/control/inst/@ss/__sysprune__.m trunk/octave-forge/main/control/inst/@tf/__sysgroup__.m trunk/octave-forge/main/control/inst/@tf/__sysprune__.m trunk/octave-forge/main/control/inst/__frequency_response__.m Added Paths: ----------- trunk/octave-forge/main/control/inst/@lti/__lti_group__.m trunk/octave-forge/main/control/inst/@lti/__lti_prune__.m trunk/octave-forge/main/control/inst/__frequency_range__.m Removed Paths: ------------- trunk/octave-forge/main/control/inst/@lti/__ltigroup__.m trunk/octave-forge/main/control/inst/@lti/__ltiprune__.m trunk/octave-forge/main/control/inst/__freqbounds__.m Added: trunk/octave-forge/main/control/inst/@lti/__lti_group__.m =================================================================== --- trunk/octave-forge/main/control/inst/@lti/__lti_group__.m (rev 0) +++ trunk/octave-forge/main/control/inst/@lti/__lti_group__.m 2010-09-15 00:13:40 UTC (rev 7722) @@ -0,0 +1,47 @@ +## Copyright (C) 2009 Lukas F. Reichlin +## +## This file is part of LTI Syncope. +## +## 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. +## +## 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. If not, see <http://www.gnu.org/licenses/>. + +## -*- texinfo -*- +## Block diagonal concatenation of two LTI models. +## This file is part of the Model Abstraction Layer. +## For internal use only. + +## Author: Lukas Reichlin <luk...@gm...> +## Created: September 2009 +## Version: 0.1 + +function retlti = __lti_group__ (lti1, lti2) + + retlti = lti (); + + retlti.inname = [lti1.inname; + lti2.inname]; + + retlti.outname = [lti1.outname; + lti2.outname]; + + if (lti1.tsam == lti2.tsam) + retlti.tsam = lti1.tsam; + elseif (lti1.tsam == -1) + retlti.tsam = lti2.tsam; + elseif (lti2.tsam == -1) + retlti.tsam = lti1.tsam; + else + error ("lti_group: systems must have identical sampling times"); + endif + +endfunction \ No newline at end of file Added: trunk/octave-forge/main/control/inst/@lti/__lti_prune__.m =================================================================== --- trunk/octave-forge/main/control/inst/@lti/__lti_prune__.m (rev 0) +++ trunk/octave-forge/main/control/inst/@lti/__lti_prune__.m 2010-09-15 00:13:40 UTC (rev 7722) @@ -0,0 +1,32 @@ +## Copyright (C) 2009 Lukas F. Reichlin +## +## This file is part of LTI Syncope. +## +## 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. +## +## 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. If not, see <http://www.gnu.org/licenses/>. + +## -*- texinfo -*- +## Submodel extraction and reordering for LTI objects. +## This file is part of the Model Abstraction Layer. +## For internal use only. + +## Author: Lukas Reichlin <luk...@gm...> +## Created: September 2009 +## Version: 0.1 + +function lti = __lti_prune__ (lti, out_idx, in_idx) + + lti.inname = lti.inname(in_idx); + lti.outname = lti.outname(out_idx); + +endfunction \ No newline at end of file Deleted: trunk/octave-forge/main/control/inst/@lti/__ltigroup__.m =================================================================== --- trunk/octave-forge/main/control/inst/@lti/__ltigroup__.m 2010-09-14 23:59:19 UTC (rev 7721) +++ trunk/octave-forge/main/control/inst/@lti/__ltigroup__.m 2010-09-15 00:13:40 UTC (rev 7722) @@ -1,47 +0,0 @@ -## Copyright (C) 2009 Lukas F. Reichlin -## -## This file is part of LTI Syncope. -## -## 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. -## -## 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. If not, see <http://www.gnu.org/licenses/>. - -## -*- texinfo -*- -## Block diagonal concatenation of two LTI models. -## This file is part of the Model Abstraction Layer. -## For internal use only. - -## Author: Lukas Reichlin <luk...@gm...> -## Created: September 2009 -## Version: 0.1 - -function retlti = __ltigroup__ (lti1, lti2) - - retlti = lti (); - - retlti.inname = [lti1.inname; - lti2.inname]; - - retlti.outname = [lti1.outname; - lti2.outname]; - - if (lti1.tsam == lti2.tsam) - retlti.tsam = lti1.tsam; - elseif (lti1.tsam == -1) - retlti.tsam = lti2.tsam; - elseif (lti2.tsam == -1) - retlti.tsam = lti1.tsam; - else - error ("ltigroup: systems must have identical sampling times"); - endif - -endfunction \ No newline at end of file Deleted: trunk/octave-forge/main/control/inst/@lti/__ltiprune__.m =================================================================== --- trunk/octave-forge/main/control/inst/@lti/__ltiprune__.m 2010-09-14 23:59:19 UTC (rev 7721) +++ trunk/octave-forge/main/control/inst/@lti/__ltiprune__.m 2010-09-15 00:13:40 UTC (rev 7722) @@ -1,32 +0,0 @@ -## Copyright (C) 2009 Lukas F. Reichlin -## -## This file is part of LTI Syncope. -## -## 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. -## -## 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. If not, see <http://www.gnu.org/licenses/>. - -## -*- texinfo -*- -## Submodel extraction and reordering for LTI objects. -## This file is part of the Model Abstraction Layer. -## For internal use only. - -## Author: Lukas Reichlin <luk...@gm...> -## Created: September 2009 -## Version: 0.1 - -function lti = __ltiprune__ (lti, out_idx, in_idx) - - lti.inname = lti.inname(in_idx); - lti.outname = lti.outname(out_idx); - -endfunction \ No newline at end of file Modified: trunk/octave-forge/main/control/inst/@ss/__sysgroup__.m =================================================================== --- trunk/octave-forge/main/control/inst/@ss/__sysgroup__.m 2010-09-14 23:59:19 UTC (rev 7721) +++ trunk/octave-forge/main/control/inst/@ss/__sysgroup__.m 2010-09-15 00:13:40 UTC (rev 7722) @@ -36,7 +36,7 @@ retsys = ss (); - retsys.lti = __ltigroup__ (sys1.lti, sys2.lti); + retsys.lti = __lti_group__ (sys1.lti, sys2.lti); A1 = sys1.a; B1 = sys1.b; Modified: trunk/octave-forge/main/control/inst/@ss/__sysprune__.m =================================================================== --- trunk/octave-forge/main/control/inst/@ss/__sysprune__.m 2010-09-14 23:59:19 UTC (rev 7721) +++ trunk/octave-forge/main/control/inst/@ss/__sysprune__.m 2010-09-15 00:13:40 UTC (rev 7722) @@ -26,7 +26,7 @@ function sys = __sysprune__ (sys, out_idx, in_idx, st_idx = ":") - sys.lti = __ltiprune__ (sys.lti, out_idx, in_idx); + sys.lti = __lti_prune__ (sys.lti, out_idx, in_idx); sys.a = sys.a(st_idx, st_idx); sys.b = sys.b(st_idx, in_idx); Modified: trunk/octave-forge/main/control/inst/@tf/__sysgroup__.m =================================================================== --- trunk/octave-forge/main/control/inst/@tf/__sysgroup__.m 2010-09-14 23:59:19 UTC (rev 7721) +++ trunk/octave-forge/main/control/inst/@tf/__sysgroup__.m 2010-09-15 00:13:40 UTC (rev 7722) @@ -36,7 +36,7 @@ retsys = tf (); - retsys.lti = __ltigroup__ (sys1.lti, sys2.lti); + retsys.lti = __lti_group__ (sys1.lti, sys2.lti); [p1, m1] = size (sys1); [p2, m2] = size (sys2); Modified: trunk/octave-forge/main/control/inst/@tf/__sysprune__.m =================================================================== --- trunk/octave-forge/main/control/inst/@tf/__sysprune__.m 2010-09-14 23:59:19 UTC (rev 7721) +++ trunk/octave-forge/main/control/inst/@tf/__sysprune__.m 2010-09-15 00:13:40 UTC (rev 7722) @@ -26,7 +26,7 @@ function sys = __sysprune__ (sys, out_idx, in_idx) - sys.lti = __ltiprune__ (sys.lti, out_idx, in_idx); + sys.lti = __lti_prune__ (sys.lti, out_idx, in_idx); sys.num = sys.num(out_idx, in_idx); sys.den = sys.den(out_idx, in_idx); Deleted: trunk/octave-forge/main/control/inst/__freqbounds__.m =================================================================== --- trunk/octave-forge/main/control/inst/__freqbounds__.m 2010-09-14 23:59:19 UTC (rev 7721) +++ trunk/octave-forge/main/control/inst/__freqbounds__.m 2010-09-15 00:13:40 UTC (rev 7722) @@ -1,122 +0,0 @@ -## Copyright (C) 1996, 2000, 2004, 2005, 2006, 2007 -## Auburn University. All rights reserved. -## -## -## 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. -## -## 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. -## -## 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/>. - -## -*- texinfo -*- -## @deftypefn {Function File} {[@var{dec_min}, @var{dec_max}] =} __freqbounds__ (@var{sys}) -## Get default range of frequencies based on cutoff frequencies of system -## poles and zeros. -## Frequency range is the interval -## @iftex -## @tex -## $ [ 10^{w_{min}}, 10^{w_{max}} ] $ -## @end tex -## @end iftex -## @ifinfo -## [10^@var{wmin}, 10^@var{wmax}] -## @end ifinfo -## -## Used internally in @command{margin} (@command{bode}, @command{nyquist}) -## @end deftypefn - -## Adapted-By: Lukas Reichlin <luk...@gm...> -## Date: October 2009 -## Version: 0.1 - -function [dec_min, dec_max] = __freqbounds__ (sys, wbounds = "std") - - zer = zero (sys); - pol = pole (sys); - tsam = get (sys, "tsam"); - discrete = (tsam > 0); # static gains (tsam = -1) are continuous - - ## make sure zer, pol are row vectors - pol = reshape (pol, 1, []); - zer = reshape (zer, 1, []); - - ## check for natural frequencies away from omega = 0 - if (discrete) - ## The 2nd conditions prevents log(0) in the next log command - iiz = find (abs(zer-1) > norm(zer)*eps && abs(zer) > norm(zer)*eps); - iip = find (abs(pol-1) > norm(pol)*eps && abs(pol) > norm(pol)*eps); - - ## avoid dividing empty matrices, it would work but looks nasty - if (! isempty (iiz)) - czer = log (zer(iiz))/tsam; - else - czer = []; - endif - - if (! isempty (iip)) - cpol = log (pol(iip))/tsam; - else - cpol = []; - endif - else - ## continuous - iip = find (abs(pol) > norm(pol)*eps); - iiz = find (abs(zer) > norm(zer)*eps); - - if (! isempty (zer)) - czer = zer(iiz); - else - czer = []; - endif - if (! isempty (pol)) - cpol = pol(iip); - else - cpol = []; - endif - endif - - if (isempty (iip) && isempty (iiz)) - ## no poles/zeros away from omega = 0; pick defaults - dec_min = 0; # -1 - dec_max = 2; # 3 - else - dec_min = floor (log10 (min (abs ([cpol, czer])))); - dec_max = ceil (log10 (max (abs ([cpol, czer])))); - endif - - ## expand to show the entirety of the "interesting" portion of the plot - switch (wbounds) - case "std" # standard - if (dec_min == dec_max) - dec_min -= 2; - dec_max += 2; - else - dec_min--; - dec_max++; - endif - case "ext" # extended (for nyquist) - if (any (abs (pol) < sqrt (eps))) # look for integrators - ## dec_min -= 0.5; - dec_max += 2; - else - dec_min -= 2; - dec_max += 2; - endif - otherwise - error ("freqbounds: second argument invalid"); - endswitch - - ## run discrete frequency all the way to pi - if (discrete) - dec_max = log10 (pi/tsam); - endif - -endfunction Added: trunk/octave-forge/main/control/inst/__frequency_range__.m =================================================================== --- trunk/octave-forge/main/control/inst/__frequency_range__.m (rev 0) +++ trunk/octave-forge/main/control/inst/__frequency_range__.m 2010-09-15 00:13:40 UTC (rev 7722) @@ -0,0 +1,122 @@ +## Copyright (C) 1996, 2000, 2004, 2005, 2006, 2007 +## Auburn University. All rights reserved. +## +## +## 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. +## +## 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. +## +## 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/>. + +## -*- texinfo -*- +## @deftypefn {Function File} {[@var{dec_min}, @var{dec_max}] =} __frequency_range__ (@var{sys}) +## Get default range of frequencies based on cutoff frequencies of system +## poles and zeros. +## Frequency range is the interval +## @iftex +## @tex +## $ [ 10^{w_{min}}, 10^{w_{max}} ] $ +## @end tex +## @end iftex +## @ifinfo +## [10^@var{wmin}, 10^@var{wmax}] +## @end ifinfo +## +## Used internally in @command{margin} (@command{bode}, @command{nyquist}) +## @end deftypefn + +## Adapted-By: Lukas Reichlin <luk...@gm...> +## Date: October 2009 +## Version: 0.1 + +function [dec_min, dec_max] = __frequency_range__ (sys, wbounds = "std") + + zer = zero (sys); + pol = pole (sys); + tsam = get (sys, "tsam"); + discrete = (tsam > 0); # static gains (tsam = -1) are continuous + + ## make sure zer, pol are row vectors + pol = reshape (pol, 1, []); + zer = reshape (zer, 1, []); + + ## check for natural frequencies away from omega = 0 + if (discrete) + ## The 2nd conditions prevents log(0) in the next log command + iiz = find (abs(zer-1) > norm(zer)*eps && abs(zer) > norm(zer)*eps); + iip = find (abs(pol-1) > norm(pol)*eps && abs(pol) > norm(pol)*eps); + + ## avoid dividing empty matrices, it would work but looks nasty + if (! isempty (iiz)) + czer = log (zer(iiz))/tsam; + else + czer = []; + endif + + if (! isempty (iip)) + cpol = log (pol(iip))/tsam; + else + cpol = []; + endif + else + ## continuous + iip = find (abs(pol) > norm(pol)*eps); + iiz = find (abs(zer) > norm(zer)*eps); + + if (! isempty (zer)) + czer = zer(iiz); + else + czer = []; + endif + if (! isempty (pol)) + cpol = pol(iip); + else + cpol = []; + endif + endif + + if (isempty (iip) && isempty (iiz)) + ## no poles/zeros away from omega = 0; pick defaults + dec_min = 0; # -1 + dec_max = 2; # 3 + else + dec_min = floor (log10 (min (abs ([cpol, czer])))); + dec_max = ceil (log10 (max (abs ([cpol, czer])))); + endif + + ## expand to show the entirety of the "interesting" portion of the plot + switch (wbounds) + case "std" # standard + if (dec_min == dec_max) + dec_min -= 2; + dec_max += 2; + else + dec_min--; + dec_max++; + endif + case "ext" # extended (for nyquist) + if (any (abs (pol) < sqrt (eps))) # look for integrators + ## dec_min -= 0.5; + dec_max += 2; + else + dec_min -= 2; + dec_max += 2; + endif + otherwise + error ("frequency_range: second argument invalid"); + endswitch + + ## run discrete frequency all the way to pi + if (discrete) + dec_max = log10 (pi/tsam); + endif + +endfunction Modified: trunk/octave-forge/main/control/inst/__frequency_response__.m =================================================================== --- trunk/octave-forge/main/control/inst/__frequency_response__.m 2010-09-14 23:59:19 UTC (rev 7721) +++ trunk/octave-forge/main/control/inst/__frequency_response__.m 2010-09-15 00:13:40 UTC (rev 7722) @@ -17,7 +17,7 @@ ## -*- texinfo -*- ## Return frequency response H and frequency vector w. -## If w is empty, it will be calculated by __freqbounds__ +## If w is empty, it will be calculated by __frequency_range__ ## Author: Lukas Reichlin <luk...@gm...> ## Created: November 2009 @@ -41,7 +41,7 @@ ## find interesting frequency range w if not specified if (isempty (w)) ## begin plot at 10^dec_min, end plot at 10^dec_max [rad/s] - [dec_min, dec_max] = __freqbounds__ (sys, wbounds); + [dec_min, dec_max] = __frequency_range__ (sys, wbounds); w = logspace (dec_min, dec_max, 500); # [rad/s] endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <par...@us...> - 2010-09-15 00:36:54
|
Revision: 7723 http://octave.svn.sourceforge.net/octave/?rev=7723&view=rev Author: paramaniac Date: 2010-09-15 00:36:45 +0000 (Wed, 15 Sep 2010) Log Message: ----------- control: try sticking to GNU coding standards (still more to come) Modified Paths: -------------- trunk/octave-forge/main/control/inst/@lti/append.m trunk/octave-forge/main/control/inst/@lti/connect.m trunk/octave-forge/main/control/inst/@lti/feedback.m trunk/octave-forge/main/control/inst/@lti/horzcat.m trunk/octave-forge/main/control/inst/@lti/inv.m trunk/octave-forge/main/control/inst/@lti/lft.m trunk/octave-forge/main/control/inst/@lti/mconnect.m trunk/octave-forge/main/control/inst/@lti/minus.m trunk/octave-forge/main/control/inst/@lti/mldivide.m trunk/octave-forge/main/control/inst/@lti/mrdivide.m trunk/octave-forge/main/control/inst/@lti/mtimes.m trunk/octave-forge/main/control/inst/@lti/plus.m trunk/octave-forge/main/control/inst/@lti/sminreal.m trunk/octave-forge/main/control/inst/@lti/ssdata.m trunk/octave-forge/main/control/inst/@lti/subsref.m trunk/octave-forge/main/control/inst/@lti/tfdata.m trunk/octave-forge/main/control/inst/@lti/vertcat.m trunk/octave-forge/main/control/inst/@lti/xperm.m trunk/octave-forge/main/control/inst/@tf/__minreal__.m Added Paths: ----------- trunk/octave-forge/main/control/inst/@ss/__sys_connect__.m trunk/octave-forge/main/control/inst/@ss/__sys_data__.m trunk/octave-forge/main/control/inst/@ss/__sys_group__.m trunk/octave-forge/main/control/inst/@ss/__sys_inverse__.m trunk/octave-forge/main/control/inst/@ss/__sys_prune__.m trunk/octave-forge/main/control/inst/@tf/__sys_connect__.m trunk/octave-forge/main/control/inst/@tf/__sys_data__.m trunk/octave-forge/main/control/inst/@tf/__sys_group__.m trunk/octave-forge/main/control/inst/@tf/__sys_inverse__.m trunk/octave-forge/main/control/inst/@tf/__sys_prune__.m Removed Paths: ------------- trunk/octave-forge/main/control/inst/@ss/__getsysdata__.m trunk/octave-forge/main/control/inst/@ss/__sysconnect__.m trunk/octave-forge/main/control/inst/@ss/__sysgroup__.m trunk/octave-forge/main/control/inst/@ss/__sysinv__.m trunk/octave-forge/main/control/inst/@ss/__sysprune__.m trunk/octave-forge/main/control/inst/@tf/__getsysdata__.m trunk/octave-forge/main/control/inst/@tf/__sysconnect__.m trunk/octave-forge/main/control/inst/@tf/__sysgroup__.m trunk/octave-forge/main/control/inst/@tf/__sysinv__.m trunk/octave-forge/main/control/inst/@tf/__sysprune__.m Modified: trunk/octave-forge/main/control/inst/@lti/append.m =================================================================== --- trunk/octave-forge/main/control/inst/@lti/append.m 2010-09-15 00:13:40 UTC (rev 7722) +++ trunk/octave-forge/main/control/inst/@lti/append.m 2010-09-15 00:36:45 UTC (rev 7723) @@ -30,7 +30,7 @@ if (nargin > 1) for k = 2 : nargin - sys = __sysgroup__ (sys, varargin{k}); + sys = __sys_group__ (sys, varargin{k}); endfor endif Modified: trunk/octave-forge/main/control/inst/@lti/connect.m =================================================================== --- trunk/octave-forge/main/control/inst/@lti/connect.m 2010-09-15 00:13:40 UTC (rev 7722) +++ trunk/octave-forge/main/control/inst/@lti/connect.m 2010-09-15 00:36:45 UTC (rev 7723) @@ -53,7 +53,7 @@ endfor endfor - sys = __sysconnect__ (sys, M); - sys = __sysprune__ (sys, out_idx, in_idx); + sys = __sys_connect__ (sys, M); + sys = __sys_prune__ (sys, out_idx, in_idx); endfunction \ No newline at end of file Modified: trunk/octave-forge/main/control/inst/@lti/feedback.m =================================================================== --- trunk/octave-forge/main/control/inst/@lti/feedback.m 2010-09-15 00:13:40 UTC (rev 7722) +++ trunk/octave-forge/main/control/inst/@lti/feedback.m 2010-09-15 00:36:45 UTC (rev 7723) @@ -133,9 +133,9 @@ in_idx = 1 : m1; out_idx = 1 : p1; - sys = __sysgroup__ (sys1, sys2); - sys = __sysconnect__ (sys, M); - sys = __sysprune__ (sys, out_idx, in_idx); + sys = __sys_group__ (sys1, sys2); + sys = __sys_connect__ (sys, M); + sys = __sys_prune__ (sys, out_idx, in_idx); endfunction Modified: trunk/octave-forge/main/control/inst/@lti/horzcat.m =================================================================== --- trunk/octave-forge/main/control/inst/@lti/horzcat.m 2010-09-15 00:13:40 UTC (rev 7722) +++ trunk/octave-forge/main/control/inst/@lti/horzcat.m 2010-09-15 00:36:45 UTC (rev 7723) @@ -17,7 +17,7 @@ ## -*- texinfo -*- ## Horizontal concatenation of LTI objects. If necessary, object conversion -## is done by sysgroup. Used by Octave for "[lti1, lti2]". +## is done by sys_group. Used by Octave for "[lti1, lti2]". ## Author: Lukas Reichlin <luk...@gm...> ## Created: September 2009 @@ -38,7 +38,7 @@ p1, m1, p2, m2); endif - sys = __sysgroup__ (sys1, sys2); + sys = __sys_group__ (sys1, sys2); out_scl = [eye(p1), eye(p2)]; Modified: trunk/octave-forge/main/control/inst/@lti/inv.m =================================================================== --- trunk/octave-forge/main/control/inst/@lti/inv.m 2010-09-15 00:13:40 UTC (rev 7722) +++ trunk/octave-forge/main/control/inst/@lti/inv.m 2010-09-15 00:36:45 UTC (rev 7723) @@ -30,7 +30,7 @@ error ("lti: inv: system must be square"); endif - retsys = __sysinv__ (sys); + retsys = __sys_inverse__ (sys); ## TODO: handle i/o names Modified: trunk/octave-forge/main/control/inst/@lti/lft.m =================================================================== --- trunk/octave-forge/main/control/inst/@lti/lft.m 2010-09-15 00:13:40 UTC (rev 7722) +++ trunk/octave-forge/main/control/inst/@lti/lft.m 2010-09-15 00:36:45 UTC (rev 7723) @@ -95,7 +95,7 @@ print_usage (); endif - ## object conversion done by sysgroup if necessary + ## object conversion done by sys_group if necessary [p1, m1] = size (sys1); [p2, m2] = size (sys2); @@ -134,9 +134,9 @@ in_idx = [1 : (m1-nu), m1 + (ny+1 : m2)]; out_idx = [1 : (p1-ny), p1 + (nu+1 : p2)]; - sys = __sysgroup__ (sys1, sys2); - sys = __sysconnect__ (sys, M); - sys = __sysprune__ (sys, out_idx, in_idx); + sys = __sys_group__ (sys1, sys2); + sys = __sys_connect__ (sys, M); + sys = __sys_prune__ (sys, out_idx, in_idx); [p, m] = size (sys); Modified: trunk/octave-forge/main/control/inst/@lti/mconnect.m =================================================================== --- trunk/octave-forge/main/control/inst/@lti/mconnect.m 2010-09-15 00:13:40 UTC (rev 7722) +++ trunk/octave-forge/main/control/inst/@lti/mconnect.m 2010-09-15 00:36:45 UTC (rev 7723) @@ -79,10 +79,10 @@ error ("mconnect: second argument must be a matrix with real coefficients"); endif - sys = __sysconnect__ (sys, M); + sys = __sys_connect__ (sys, M); if (nargin == 4) - sys = __sysprune__ (sys, out_idx, in_idx); + sys = __sys_prune__ (sys, out_idx, in_idx); endif endfunction \ No newline at end of file Modified: trunk/octave-forge/main/control/inst/@lti/minus.m =================================================================== --- trunk/octave-forge/main/control/inst/@lti/minus.m 2010-09-15 00:13:40 UTC (rev 7722) +++ trunk/octave-forge/main/control/inst/@lti/minus.m 2010-09-15 00:36:45 UTC (rev 7723) @@ -17,7 +17,7 @@ ## -*- texinfo -*- ## Binary subtraction of LTI objects. If necessary, object conversion -## is done by sysgroup. Used by Octave for "lti1 - lti2". +## is done by sys_group. Used by Octave for "lti1 - lti2". ## Author: Lukas Reichlin <luk...@gm...> ## Created: September 2009 @@ -33,7 +33,7 @@ p1, m1, p2, m2); endif - sys = __sysgroup__ (sys1, sys2); + sys = __sys_group__ (sys1, sys2); in_scl = [eye(m1); eye(m2)]; out_scl = [eye(p1), -eye(p2)]; Modified: trunk/octave-forge/main/control/inst/@lti/mldivide.m =================================================================== --- trunk/octave-forge/main/control/inst/@lti/mldivide.m 2010-09-15 00:13:40 UTC (rev 7722) +++ trunk/octave-forge/main/control/inst/@lti/mldivide.m 2010-09-15 00:36:45 UTC (rev 7723) @@ -17,7 +17,7 @@ ## -*- texinfo -*- ## Matrix left division of LTI objects. If necessary, object conversion -## is done by sysgroup in mtimes. Used by Octave for "lti1 \ lti2". +## is done by sys_group in mtimes. Used by Octave for "lti1 \ lti2". ## Author: Lukas Reichlin <luk...@gm...> ## Created: October 2009 Modified: trunk/octave-forge/main/control/inst/@lti/mrdivide.m =================================================================== --- trunk/octave-forge/main/control/inst/@lti/mrdivide.m 2010-09-15 00:13:40 UTC (rev 7722) +++ trunk/octave-forge/main/control/inst/@lti/mrdivide.m 2010-09-15 00:36:45 UTC (rev 7723) @@ -17,7 +17,7 @@ ## -*- texinfo -*- ## Matrix right division of LTI objects. If necessary, object conversion -## is done by sysgroup in mtimes. Used by Octave for "lti1 / lti2". +## is done by sys_group in mtimes. Used by Octave for "lti1 / lti2". ## Author: Lukas Reichlin <luk...@gm...> ## Created: October 2009 Modified: trunk/octave-forge/main/control/inst/@lti/mtimes.m =================================================================== --- trunk/octave-forge/main/control/inst/@lti/mtimes.m 2010-09-15 00:13:40 UTC (rev 7722) +++ trunk/octave-forge/main/control/inst/@lti/mtimes.m 2010-09-15 00:36:45 UTC (rev 7723) @@ -17,7 +17,7 @@ ## -*- texinfo -*- ## Matrix multiplication of LTI objects. If necessary, object conversion -## is done by sysgroup. Used by Octave for "lti1 * lti2". +## is done by sys_group. Used by Octave for "lti1 * lti2". ## Author: Lukas Reichlin <luk...@gm...> ## Created: September 2009 @@ -44,9 +44,9 @@ out_idx = 1 : p2; in_idx = m2 + (1 : m1); - sys = __sysgroup__ (sys2, sys1); - sys = __sysconnect__ (sys, M); - sys = __sysprune__ (sys, out_idx, in_idx); + sys = __sys_group__ (sys2, sys1); + sys = __sys_connect__ (sys, M); + sys = __sys_prune__ (sys, out_idx, in_idx); endfunction Modified: trunk/octave-forge/main/control/inst/@lti/plus.m =================================================================== --- trunk/octave-forge/main/control/inst/@lti/plus.m 2010-09-15 00:13:40 UTC (rev 7722) +++ trunk/octave-forge/main/control/inst/@lti/plus.m 2010-09-15 00:36:45 UTC (rev 7723) @@ -17,7 +17,7 @@ ## -*- texinfo -*- ## Binary addition of LTI objects. If necessary, object conversion -## is done by sysgroup. Used by Octave for "lti1 + lti2". +## is done by sys_group. Used by Octave for "lti1 + lti2". ## Operation is also known as "parallel connection". ## Author: Lukas Reichlin <luk...@gm...> @@ -34,7 +34,7 @@ p1, m1, p2, m2); endif - sys = __sysgroup__ (sys1, sys2); + sys = __sys_group__ (sys1, sys2); in_scl = [eye(m1); eye(m2)]; out_scl = [eye(p1), eye(p2)]; Modified: trunk/octave-forge/main/control/inst/@lti/sminreal.m =================================================================== --- trunk/octave-forge/main/control/inst/@lti/sminreal.m 2010-09-15 00:13:40 UTC (rev 7722) +++ trunk/octave-forge/main/control/inst/@lti/sminreal.m 2010-09-15 00:36:45 UTC (rev 7723) @@ -71,7 +71,7 @@ st_idx = intersect (co_idx, ob_idx); - sys = __sysprune__ (sys, ":", ":", st_idx); + sys = __sys_prune__ (sys, ":", ":", st_idx); endfunction Modified: trunk/octave-forge/main/control/inst/@lti/ssdata.m =================================================================== --- trunk/octave-forge/main/control/inst/@lti/ssdata.m 2010-09-15 00:13:40 UTC (rev 7722) +++ trunk/octave-forge/main/control/inst/@lti/ssdata.m 2010-09-15 00:36:45 UTC (rev 7723) @@ -30,7 +30,7 @@ sys = ss (sys); endif - sysdata = __getsysdata__ (sys); + sysdata = __sys_data__ (sys); a = sysdata.a; b = sysdata.b; Modified: trunk/octave-forge/main/control/inst/@lti/subsref.m =================================================================== --- trunk/octave-forge/main/control/inst/@lti/subsref.m 2010-09-15 00:13:40 UTC (rev 7722) +++ trunk/octave-forge/main/control/inst/@lti/subsref.m 2010-09-15 00:36:45 UTC (rev 7723) @@ -35,7 +35,7 @@ case "()" idx = s(k).subs; if (numel (idx) == 2) - a = __sysprune__ (a, idx{1}, idx{2}); + a = __sys_prune__ (a, idx{1}, idx{2}); elseif (numel (idx) == 1) a = __freqresp__ (a, idx{1}); else Modified: trunk/octave-forge/main/control/inst/@lti/tfdata.m =================================================================== --- trunk/octave-forge/main/control/inst/@lti/tfdata.m 2010-09-15 00:13:40 UTC (rev 7722) +++ trunk/octave-forge/main/control/inst/@lti/tfdata.m 2010-09-15 00:36:45 UTC (rev 7723) @@ -31,7 +31,7 @@ sys = tf (sys); endif - sysdata = __getsysdata__ (sys); + sysdata = __sys_data__ (sys); num = sysdata.num; den = sysdata.den; Modified: trunk/octave-forge/main/control/inst/@lti/vertcat.m =================================================================== --- trunk/octave-forge/main/control/inst/@lti/vertcat.m 2010-09-15 00:13:40 UTC (rev 7722) +++ trunk/octave-forge/main/control/inst/@lti/vertcat.m 2010-09-15 00:36:45 UTC (rev 7723) @@ -17,7 +17,7 @@ ## -*- texinfo -*- ## Vertical concatenation of LTI objects. If necessary, object conversion -## is done by sysgroup. Used by Octave for "[lti1; lti2]". +## is done by sys_group. Used by Octave for "[lti1; lti2]". ## Author: Lukas Reichlin <luk...@gm...> ## Created: September 2009 @@ -38,7 +38,7 @@ p1, m1, p2, m2); endif - sys = __sysgroup__ (sys1, sys2); + sys = __sys_group__ (sys1, sys2); in_scl = [eye(m1); eye(m2)]; Modified: trunk/octave-forge/main/control/inst/@lti/xperm.m =================================================================== --- trunk/octave-forge/main/control/inst/@lti/xperm.m 2010-09-15 00:13:40 UTC (rev 7722) +++ trunk/octave-forge/main/control/inst/@lti/xperm.m 2010-09-15 00:36:45 UTC (rev 7723) @@ -39,6 +39,6 @@ sys = ss (sys); endif - sys = __sysprune__ (sys, ":", ":", st_idx); + sys = __sys_prune__ (sys, ":", ":", st_idx); endfunction \ No newline at end of file Deleted: trunk/octave-forge/main/control/inst/@ss/__getsysdata__.m =================================================================== --- trunk/octave-forge/main/control/inst/@ss/__getsysdata__.m 2010-09-15 00:13:40 UTC (rev 7722) +++ trunk/octave-forge/main/control/inst/@ss/__getsysdata__.m 2010-09-15 00:36:45 UTC (rev 7723) @@ -1,33 +0,0 @@ -## Copyright (C) 2009 Lukas F. Reichlin -## -## This file is part of LTI Syncope. -## -## 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. -## -## 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. If not, see <http://www.gnu.org/licenses/>. - -## -*- texinfo -*- -## Used by ssdata instead of get (). - -## Author: Lukas Reichlin <luk...@gm...> -## Created: September 2009 -## Version: 0.1 - -function data = __getsysdata__ (sys) - - data.a = sys.a; - data.b = sys.b; - data.c = sys.c; - data.d = sys.d; - data.stname = sys.stname; - -endfunction \ No newline at end of file Added: trunk/octave-forge/main/control/inst/@ss/__sys_connect__.m =================================================================== --- trunk/octave-forge/main/control/inst/@ss/__sys_connect__.m (rev 0) +++ trunk/octave-forge/main/control/inst/@ss/__sys_connect__.m 2010-09-15 00:36:45 UTC (rev 7723) @@ -0,0 +1,87 @@ +## Copyright (C) 2009 Lukas F. Reichlin +## +## This file is part of LTI Syncope. +## +## 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. +## +## 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. If not, see <http://www.gnu.org/licenses/>. + +## -*- texinfo -*- +## @deftypefn {Function File} {@var{retsys} =} __sys_connect__ (@var{sys}, @var{M}) +## This function is part of the Model Abstraction Layer. No argument checking. +## For internal use only. +## @example +## @group +## Problem: Solve the system equations of +## . +## x(t) = A x(t) + B e(t) +## +## y(t) = C x(t) + D e(t) +## +## e(t) = u(t) + M y(t) +## +## in order to build +## . +## x(t) = F x(t) + G u(t) +## +## y(t) = H x(t) + J u(t) +## +## Solution: Laplace Transformation +## s X(s) = A X(s) + B U(s) + B M Y(s) [1] +## +## Y(s) = C X(s) + D U(s) + D M Y(s) [2] +## +## solve [2] for Y(s) +## Y(s) = [I - D M]^(-1) C X(s) + [I - D M]^(-1) D U(s) +## +## substitute Z = [I - D M]^(-1) +## Y(s) = Z C X(s) + Z D U(s) [3] +## +## insert [3] in [1], solve for X(s) +## X(s) = [s I - (A + B M Z C)]^(-1) (B + B M Z D) U(s) [4] +## +## inserting [4] in [3] finally yields +## Y(s) = Z C [s I - (A + B M Z C)]^(-1) (B + B M Z D) U(s) + Z D U(s) +## \ / \_____ _____/ \_____ _____/ \ / +## H F G J +## @end group +## @end example +## @end deftypefn + +## Author: Lukas Reichlin <luk...@gm...> +## Created: September 2009 +## Version: 0.1 + +function sys = __sys_connect__ (sys, M) + + [p, m] = size (sys); + + A = sys.a; + B = sys.b; + C = sys.c; + D = sys.d; + + I = eye (p); + Z = I - D*M; + + if (rcond (Z) < eps) # check for singularity + error ("ss: sys_connect: (I - D*M) not invertible"); + endif + + Z = inv (Z); + + sys.a = A + B*M*Z*C; # F + sys.b = B + B*M*Z*D; # G + sys.c = Z*C; # H + sys.d = Z*D; # J + +endfunction \ No newline at end of file Added: trunk/octave-forge/main/control/inst/@ss/__sys_data__.m =================================================================== --- trunk/octave-forge/main/control/inst/@ss/__sys_data__.m (rev 0) +++ trunk/octave-forge/main/control/inst/@ss/__sys_data__.m 2010-09-15 00:36:45 UTC (rev 7723) @@ -0,0 +1,33 @@ +## Copyright (C) 2009 Lukas F. Reichlin +## +## This file is part of LTI Syncope. +## +## 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. +## +## 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. If not, see <http://www.gnu.org/licenses/>. + +## -*- texinfo -*- +## Used by ssdata instead of multiple get calls. + +## Author: Lukas Reichlin <luk...@gm...> +## Created: September 2009 +## Version: 0.1 + +function data = __sys_data__ (sys) + + data.a = sys.a; + data.b = sys.b; + data.c = sys.c; + data.d = sys.d; + data.stname = sys.stname; + +endfunction \ No newline at end of file Added: trunk/octave-forge/main/control/inst/@ss/__sys_group__.m =================================================================== --- trunk/octave-forge/main/control/inst/@ss/__sys_group__.m (rev 0) +++ trunk/octave-forge/main/control/inst/@ss/__sys_group__.m 2010-09-15 00:36:45 UTC (rev 7723) @@ -0,0 +1,76 @@ +## Copyright (C) 2009 Lukas F. Reichlin +## +## This file is part of LTI Syncope. +## +## 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. +## +## 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. If not, see <http://www.gnu.org/licenses/>. + +## -*- texinfo -*- +## Block diagonal concatenation of two SS models. +## This file is part of the Model Abstraction Layer. +## For internal use only. + +## Author: Lukas Reichlin <luk...@gm...> +## Created: September 2009 +## Version: 0.1 + +function retsys = __sys_group__ (sys1, sys2) + + if (! isa (sys1, "ss")) + sys1 = ss (sys1); + endif + + if (! isa (sys2, "ss")) + sys2 = ss (sys2); + endif + + retsys = ss (); + + retsys.lti = __lti_group__ (sys1.lti, sys2.lti); + + A1 = sys1.a; + B1 = sys1.b; + C1 = sys1.c; + D1 = sys1.d; + A2 = sys2.a; + B2 = sys2.b; + C2 = sys2.c; + D2 = sys2.d; + + [m1, n1, p1] = __ss_dim__ (A1, B1, C1, D1); + [m2, n2, p2] = __ss_dim__ (A2, B2, C2, D2); + + A12 = zeros (n1, n2); + B12 = zeros (n1, m2); + B21 = zeros (n2, m1); + C12 = zeros (p1, n2); + C21 = zeros (p2, n1); + D12 = zeros (p1, m2); + D21 = zeros (p2, m1); + + retsys.a = [A1 , A12; + A12.', A2 ]; + + retsys.b = [B1 , B12; + B21, B2 ]; + + retsys.c = [C1 , C12; + C21, C2 ]; + + retsys.d = [D1 , D12; + D21, D2 ]; + + retsys.stname = [sys1.stname; + sys2.stname]; + +endfunction \ No newline at end of file Added: trunk/octave-forge/main/control/inst/@ss/__sys_inverse__.m =================================================================== --- trunk/octave-forge/main/control/inst/@ss/__sys_inverse__.m (rev 0) +++ trunk/octave-forge/main/control/inst/@ss/__sys_inverse__.m 2010-09-15 00:36:45 UTC (rev 7723) @@ -0,0 +1,48 @@ +## Copyright (C) 2009 Lukas F. Reichlin +## +## This file is part of LTI Syncope. +## +## 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. +## +## 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. If not, see <http://www.gnu.org/licenses/>. + +## -*- texinfo -*- +## Inversion of SS models. + +## Author: Lukas Reichlin <luk...@gm...> +## Created: October 2009 +## Version: 0.1 + +function sys = __sys_inverse__ (sys) + + a = sys.a; + b = sys.b; + c = sys.c; + d = sys.d; + + if (rcond (d) < eps) + error ("ss: sys_inverse: inverse is not proper, case not implemented yet"); + else + di = inv (d); + + f = a - b * di * c; + g = b * di; + h = -di * c; + j = di; + endif + + sys.a = f; + sys.b = g; + sys.c = h; + sys.d = j; + +endfunction \ No newline at end of file Added: trunk/octave-forge/main/control/inst/@ss/__sys_prune__.m =================================================================== --- trunk/octave-forge/main/control/inst/@ss/__sys_prune__.m (rev 0) +++ trunk/octave-forge/main/control/inst/@ss/__sys_prune__.m 2010-09-15 00:36:45 UTC (rev 7723) @@ -0,0 +1,38 @@ +## Copyright (C) 2009 Lukas F. Reichlin +## +## This file is part of LTI Syncope. +## +## 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. +## +## 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. If not, see <http://www.gnu.org/licenses/>. + +## -*- texinfo -*- +## Submodel extraction and reordering for SS objects. +## This file is part of the Model Abstraction Layer. +## For internal use only. + +## Author: Lukas Reichlin <luk...@gm...> +## Created: September 2009 +## Version: 0.1 + +function sys = __sys_prune__ (sys, out_idx, in_idx, st_idx = ":") + + sys.lti = __lti_prune__ (sys.lti, out_idx, in_idx); + + sys.a = sys.a(st_idx, st_idx); + sys.b = sys.b(st_idx, in_idx); + sys.c = sys.c(out_idx, st_idx); + sys.d = sys.d(out_idx, in_idx); + + sys.stname = sys.stname(st_idx); + +endfunction \ No newline at end of file Deleted: trunk/octave-forge/main/control/inst/@ss/__sysconnect__.m =================================================================== --- trunk/octave-forge/main/control/inst/@ss/__sysconnect__.m 2010-09-15 00:13:40 UTC (rev 7722) +++ trunk/octave-forge/main/control/inst/@ss/__sysconnect__.m 2010-09-15 00:36:45 UTC (rev 7723) @@ -1,87 +0,0 @@ -## Copyright (C) 2009 Lukas F. Reichlin -## -## This file is part of LTI Syncope. -## -## 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. -## -## 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. If not, see <http://www.gnu.org/licenses/>. - -## -*- texinfo -*- -## @deftypefn {Function File} {@var{retsys} =} __sysconnect__ (@var{sys}, @var{M}) -## This function is part of the Model Abstraction Layer. No argument checking. -## For internal use only. -## @example -## @group -## Problem: Solve the system equations of -## . -## x(t) = A x(t) + B e(t) -## -## y(t) = C x(t) + D e(t) -## -## e(t) = u(t) + M y(t) -## -## in order to build -## . -## x(t) = F x(t) + G u(t) -## -## y(t) = H x(t) + J u(t) -## -## Solution: Laplace Transformation -## s X(s) = A X(s) + B U(s) + B M Y(s) [1] -## -## Y(s) = C X(s) + D U(s) + D M Y(s) [2] -## -## solve [2] for Y(s) -## Y(s) = [I - D M]^(-1) C X(s) + [I - D M]^(-1) D U(s) -## -## substitute Z = [I - D M]^(-1) -## Y(s) = Z C X(s) + Z D U(s) [3] -## -## insert [3] in [1], solve for X(s) -## X(s) = [s I - (A + B M Z C)]^(-1) (B + B M Z D) U(s) [4] -## -## inserting [4] in [3] finally yields -## Y(s) = Z C [s I - (A + B M Z C)]^(-1) (B + B M Z D) U(s) + Z D U(s) -## \ / \_____ _____/ \_____ _____/ \ / -## H F G J -## @end group -## @end example -## @end deftypefn - -## Author: Lukas Reichlin <luk...@gm...> -## Created: September 2009 -## Version: 0.1 - -function sys = __sysconnect__ (sys, M) - - [p, m] = size (sys); - - A = sys.a; - B = sys.b; - C = sys.c; - D = sys.d; - - I = eye (p); - Z = I - D*M; - - if (rcond (Z) < eps) # check for singularity - error ("ss: sysconnect: (I - D*M) not invertible"); - endif - - Z = inv (Z); - - sys.a = A + B*M*Z*C; # F - sys.b = B + B*M*Z*D; # G - sys.c = Z*C; # H - sys.d = Z*D; # J - -endfunction \ No newline at end of file Deleted: trunk/octave-forge/main/control/inst/@ss/__sysgroup__.m =================================================================== --- trunk/octave-forge/main/control/inst/@ss/__sysgroup__.m 2010-09-15 00:13:40 UTC (rev 7722) +++ trunk/octave-forge/main/control/inst/@ss/__sysgroup__.m 2010-09-15 00:36:45 UTC (rev 7723) @@ -1,76 +0,0 @@ -## Copyright (C) 2009 Lukas F. Reichlin -## -## This file is part of LTI Syncope. -## -## 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. -## -## 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. If not, see <http://www.gnu.org/licenses/>. - -## -*- texinfo -*- -## Block diagonal concatenation of two SS models. -## This file is part of the Model Abstraction Layer. -## For internal use only. - -## Author: Lukas Reichlin <luk...@gm...> -## Created: September 2009 -## Version: 0.1 - -function retsys = __sysgroup__ (sys1, sys2) - - if (! isa (sys1, "ss")) - sys1 = ss (sys1); - endif - - if (! isa (sys2, "ss")) - sys2 = ss (sys2); - endif - - retsys = ss (); - - retsys.lti = __lti_group__ (sys1.lti, sys2.lti); - - A1 = sys1.a; - B1 = sys1.b; - C1 = sys1.c; - D1 = sys1.d; - A2 = sys2.a; - B2 = sys2.b; - C2 = sys2.c; - D2 = sys2.d; - - [m1, n1, p1] = __ss_dim__ (A1, B1, C1, D1); - [m2, n2, p2] = __ss_dim__ (A2, B2, C2, D2); - - A12 = zeros (n1, n2); - B12 = zeros (n1, m2); - B21 = zeros (n2, m1); - C12 = zeros (p1, n2); - C21 = zeros (p2, n1); - D12 = zeros (p1, m2); - D21 = zeros (p2, m1); - - retsys.a = [A1 , A12; - A12.', A2 ]; - - retsys.b = [B1 , B12; - B21, B2 ]; - - retsys.c = [C1 , C12; - C21, C2 ]; - - retsys.d = [D1 , D12; - D21, D2 ]; - - retsys.stname = [sys1.stname; - sys2.stname]; - -endfunction \ No newline at end of file Deleted: trunk/octave-forge/main/control/inst/@ss/__sysinv__.m =================================================================== --- trunk/octave-forge/main/control/inst/@ss/__sysinv__.m 2010-09-15 00:13:40 UTC (rev 7722) +++ trunk/octave-forge/main/control/inst/@ss/__sysinv__.m 2010-09-15 00:36:45 UTC (rev 7723) @@ -1,48 +0,0 @@ -## Copyright (C) 2009 Lukas F. Reichlin -## -## This file is part of LTI Syncope. -## -## 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. -## -## 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. If not, see <http://www.gnu.org/licenses/>. - -## -*- texinfo -*- -## Inversion of SS models. - -## Author: Lukas Reichlin <luk...@gm...> -## Created: October 2009 -## Version: 0.1 - -function sys = __sysinv__ (sys) - - a = sys.a; - b = sys.b; - c = sys.c; - d = sys.d; - - if (rcond (d) < eps) - error ("ss: sysinv: inverse is not proper, case not implemented yet"); - else - di = inv (d); - - f = a - b * di * c; - g = b * di; - h = -di * c; - j = di; - endif - - sys.a = f; - sys.b = g; - sys.c = h; - sys.d = j; - -endfunction \ No newline at end of file Deleted: trunk/octave-forge/main/control/inst/@ss/__sysprune__.m =================================================================== --- trunk/octave-forge/main/control/inst/@ss/__sysprune__.m 2010-09-15 00:13:40 UTC (rev 7722) +++ trunk/octave-forge/main/control/inst/@ss/__sysprune__.m 2010-09-15 00:36:45 UTC (rev 7723) @@ -1,38 +0,0 @@ -## Copyright (C) 2009 Lukas F. Reichlin -## -## This file is part of LTI Syncope. -## -## 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. -## -## 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. If not, see <http://www.gnu.org/licenses/>. - -## -*- texinfo -*- -## Submodel extraction and reordering for SS objects. -## This file is part of the Model Abstraction Layer. -## For internal use only. - -## Author: Lukas Reichlin <luk...@gm...> -## Created: September 2009 -## Version: 0.1 - -function sys = __sysprune__ (sys, out_idx, in_idx, st_idx = ":") - - sys.lti = __lti_prune__ (sys.lti, out_idx, in_idx); - - sys.a = sys.a(st_idx, st_idx); - sys.b = sys.b(st_idx, in_idx); - sys.c = sys.c(out_idx, st_idx); - sys.d = sys.d(out_idx, in_idx); - - sys.stname = sys.stname(st_idx); - -endfunction \ No newline at end of file Deleted: trunk/octave-forge/main/control/inst/@tf/__getsysdata__.m =================================================================== --- trunk/octave-forge/main/control/inst/@tf/__getsysdata__.m 2010-09-15 00:13:40 UTC (rev 7722) +++ trunk/octave-forge/main/control/inst/@tf/__getsysdata__.m 2010-09-15 00:36:45 UTC (rev 7723) @@ -1,31 +0,0 @@ -## Copyright (C) 2009 Lukas F. Reichlin -## -## This file is part of LTI Syncope. -## -## 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. -## -## 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. If not, see <http://www.gnu.org/licenses/>. - -## -*- texinfo -*- -## Used by tfdata instead of get (). - -## Author: Lukas Reichlin <luk...@gm...> -## Created: October 2009 -## Version: 0.1 - -function data = __getsysdata__ (sys) - - data.num = sys.num; - data.den = sys.den; - data.tfvar = sys.tfvar; - -endfunction \ No newline at end of file Modified: trunk/octave-forge/main/control/inst/@tf/__minreal__.m =================================================================== --- trunk/octave-forge/main/control/inst/@tf/__minreal__.m 2010-09-15 00:13:40 UTC (rev 7722) +++ trunk/octave-forge/main/control/inst/@tf/__minreal__.m 2010-09-15 00:36:45 UTC (rev 7723) @@ -33,7 +33,7 @@ for ny = 1 : p for nu = 1 : m - sisosys = __sysprune__ (sys, ny, nu); + sisosys = __sys_prune__ (sys, ny, nu); [zer, gain] = zero (sisosys); pol = pole (sisosys); Added: trunk/octave-forge/main/control/inst/@tf/__sys_connect__.m =================================================================== --- trunk/octave-forge/main/control/inst/@tf/__sys_connect__.m (rev 0) +++ trunk/octave-forge/main/control/inst/@tf/__sys_connect__.m 2010-09-15 00:36:45 UTC (rev 7723) @@ -0,0 +1,99 @@ +## Copyright (C) 2009 Lukas F. Reichlin +## +## This file is part of LTI Syncope. +## +## 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. +## +## 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. If not, see <http://www.gnu.org/licenses/>. + +## -*- texinfo -*- +## @deftypefn {Function File} {@var{retsys} =} __sys_connect__ (@var{sys}, @var{M}) +## This function is part of the Model Abstraction Layer. No argument checking. +## For internal use only. +## @example +## @group +## Problem: Solve the system equations of +## Y(s) = G(s) E(s) +## E(s) = U(s) + M Y(s) +## in order to build +## Y(s) = H(s) U(s) +## Solution: +## Y(s) = G(s) [I - M G(s)]^-1 U(s) +## = [I - G(s) M]^-1 G(s) U(s) +## @end group +## @end example +## @end deftypefn + +## Author: Lukas Reichlin <luk...@gm...> +## Created: October 2009 +## Version: 0.1 + +function sys = __sys_connect__ (sys, M) + + [p, m] = size (sys); + + num = sys.num; + den = sys.den; + + ## TODO: Implementation for MIMO models. There are three possibilities: + ## 1. An _algebraic_ solution of the inversion problem in order + ## to not introduce unwanted zero/pole pairs. Difficult. + ## 2. A numeric solution of the inversion problem. Afterwards, + ## elimination of _all_ zero/pole pairs by minreal. Bad. + ## 3. Conversion to state-space, solving the problem there and + ## converting back to transfer function. Easier, but obviously, + ## this way needs MIMO __sys2ss__ and __sys2tf__ implementations + ## as described in Thomas Kailath's classic "Linear Systems". + ## Possibly this is the way to go, but it works for proper systems + ## only unless descriptor state-space models are implemented. + + ## WARNING: The code below is a cheap hack to quickly enable SISO TF connections. + + ## TODO: Check for den = 0, e.g. in feedback (tf (1), tf (-1)) + + if (m == 2 && p == 2 && num{1,2} == 0 && num{2,1} == 0) + sys.num(1,1) = num{1,1} * den{2,2}; + sys.num(1,2) = M(1,2) * num{1,1} * num{2,2}; + sys.num(2,1) = M(2,1) * num{1,1} * num{2,2}; + sys.num(2,2) = num{2,2} * den{1,1}; + + sys.den(:) = den{1,1} * den{2,2} - M(1,2) * M(2,1) * num{1,1} * num{2,2}; + + elseif (m == 4 && p == 3) # TODO: extend check + sys.num(:) = tfpoly (0); + sys.den(:) = tfpoly (1); + + sys.num(1,1) = num{1,1}; + sys.num(1,2) = num{1,2}; + sys.num(1,3) = num{1,1} * num{2,3}; + sys.num(1,4) = num{1,2} * num{3,4}; + sys.num(2,3) = num{2,3}; + sys.num(3,4) = num{3,4}; + + sys.den(1,3) = den{2,3}; + sys.den(1,4) = den{3,4}; + sys.den(2,3) = den{2,3}; + sys.den(3,4) = den{3,4}; + + elseif (m == 3 && p == 3) # TODO: extend check + sys.num = num; + sys.den = den; + + sys.num(1,3) = num{1,1} * den{1,2} + num{1,2} * den{1,1}; + sys.den(1,3) = den{1,1} * den{1,2}; + + else + error ("tf: sys_connect: MIMO systems not supported yet"); + + endif + +endfunction \ No newline at end of file Added: trunk/octave-forge/main/control/inst/@tf/__sys_data__.m =================================================================== --- trunk/octave-forge/main/control/inst/@tf/__sys_data__.m (rev 0) +++ trunk/octave-forge/main/control/inst/@tf/__sys_data__.m 2010-09-15 00:36:45 UTC (rev 7723) @@ -0,0 +1,31 @@ +## Copyright (C) 2009 Lukas F. Reichlin +## +## This file is part of LTI Syncope. +## +## 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. +## +## 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. If not, see <http://www.gnu.org/licenses/>. + +## -*- texinfo -*- +## Used by tfdata instead of multiple get calls. + +## Author: Lukas Reichlin <luk...@gm...> +## Created: October 2009 +## Version: 0.1 + +function data = __sys_data__ (sys) + + data.num = sys.num; + data.den = sys.den; + data.tfvar = sys.tfvar; + +endfunction \ No newline at end of file Added: trunk/octave-forge/main/control/inst/@tf/__sys_group__.m =================================================================== --- trunk/octave-forge/main/control/inst/@tf/__sys_group__.m (rev 0) +++ trunk/octave-forge/main/control/inst/@tf/__sys_group__.m 2010-09-15 00:36:45 UTC (rev 7723) @@ -0,0 +1,64 @@ +## Copyright (C) 2009 Lukas F. Reichlin +## +## This file is part of LTI Syncope. +## +## 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. +## +## 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. If not, see <http://www.gnu.org/licenses/>. + +## -*- texinfo -*- +## Block diagonal concatenation of two TF models. +## This file is part of the Model Abstraction Layer. +## For internal use only. + +## Author: Lukas Reichlin <luk...@gm...> +## Created: September 2009 +## Version: 0.1 + +function retsys = __sys_group__ (sys1, sys2) + + if (! isa (sys1, "tf")) + sys1 = tf (sys1); + endif + + if (! isa (sys2, "tf")) + sys2 = tf (sys2); + endif + + retsys = tf (); + + retsys.lti = __lti_group__ (sys1.lti, sys2.lti); + + [p1, m1] = size (sys1); + [p2, m2] = size (sys2); + + empty12 = tfpolyzeros (p1, m2); + empty21 = tfpolyzeros (p2, m1); + + retsys.num = [sys1.num, empty12 ; + empty21, sys2.num]; + + empty12 = tfpolyones (p1, m2); + empty21 = tfpolyones (p2, m1); + + retsys.den = [sys1.den, empty12 ; + empty21, sys2.den]; + + if (sys1.tfvar == sys2.tfvar) + retsys.tfvar = sys1.tfvar; + elseif (sys1.tfvar == "x") + retsys.tfvar = sys2.tfvar; + else + retsys.tfvar = sys1.tfvar; + endif + +endfunction \ No newline at end of file Added: trunk/octave-forge/main/control/inst/@tf/__sys_inverse__.m =================================================================== --- trunk/octave-forge/main/control/inst/@tf/__sys_inverse__.m (rev 0) +++ trunk/octave-forge/main/control/inst/@tf/__sys_inverse__.m 2010-09-15 00:36:45 UTC (rev 7723) @@ -0,0 +1,46 @@ +## Copyright (C) 2009 Lukas F. Reichlin +## +## This file is part of LTI Syncope. +## +## 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. +## +## 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. If not, see <http://www.gnu.org/licenses/>. + +## -*- texinfo -*- +## Inversion of TF models. + +## Author: Lukas Reichlin <luk...@gm...> +## Created: October 2009 +## Version: 0.1 + +function sys = __sys_inverse__ (sys) + + [p, m] = size (sys); + + ## TODO: inversion of MIMO TF models + + if (p != 1 || m != 1) + error ("tf: sys_inverse: MIMO systems not supported yet"); + endif + + den = sys.num; + num = sys.den; + + if (den{1, 1} == 0) # catch case den = 0 + num{1, 1} = tfpoly (0); + den{1, 1} = tfpoly (1); + endif + + sys.num = num; + sys.den = den; + +endfunction \ No newline at end of file Added: trunk/octave-forge/main/control/inst/@tf/__sys_prune__.m =================================================================== --- trunk/octave-forge/main/control/inst/@tf/__sys_prune__.m (rev 0) +++ trunk/octave-forge/main/control/inst/@tf/__sys_prune__.m 2010-09-15 00:36:45 UTC (rev 7723) @@ -0,0 +1,34 @@ +## Copyright (C) 2009 Lukas F. Reichlin +## +## This file is part of LTI Syncope. +## +## 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. +## +## 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. If not, see <http://www.gnu.org/licenses/>. + +## -*- texinfo -*- +## Submodel extraction and reordering for TF objects. +## This file is part of the Model Abstraction Layer. +## For internal use only. + +## Author: Lukas Reichlin <luk...@gm...> +## Created: October 2009 +## Version: 0.1 + +function sys = __sys_prune__ (sys, out_idx, in_idx) + + sys.lti = __lti_prune__ (sys.lti, out_idx, in_idx); + + sys.num = sys.num(out_idx, in_idx); + sys.den = sys.den(out_idx, in_idx); + +endfunction \ No newline at end of file Deleted: trunk/octave-forge/main/control/inst/@tf/__sysconnect__.m =================================================================== --- trunk/octave-forge/main/control/inst/@tf/__sysconnect__.m 2010-09-15 00:13:40 UTC (rev 7722) +++ trunk/octave-forge/main/control/inst/@tf/__sysconnect__.m 2010-09-15 00:36:45 UTC (rev 7723) @@ -1,99 +0,0 @@ -## Copyright (C) 2009 Lukas F. Reichlin -## -## This file is part of LTI Syncope. -## -## 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. -## -## 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. If not, see <http://www.gnu.org/licenses/>. - -## -*- texinfo -*- -## @deftypefn {Function File} {@var{retsys} =} __sysconnect__ (@var{sys}, @var{M}) -## This function is part of the Model Abstraction Layer. No argument checking. -## For internal use only. -## @example -## @group -## Problem: Solve the system equations of -## Y(s) = G(s) E(s) -## E(s) = U(s) + M Y(s) -## in order to build -## Y(s) = H(s) U(s) -## Solution: -## Y(s) = G(s) [I - M G(s)]^-1 U(s) -## = [I - G(s) M]^-1 G(s) U(s) -## @end group -## @end example -## @end deftypefn - -## Author: Lukas Reichlin <luk...@gm...> -## Created: October 2009 -## Version: 0.1 - -function sys = __sysconnect__ (sys, M) - - [p, m] = size (sys); - - num = sys.num; - den = sys.den; - - ## TODO: Implementation for MIMO models. There are three possibilities: - ## 1. An _algebraic_ solution of the inversion problem in order - ## to not introduce unwanted zero/pole pairs. Difficult. - ## 2. A numeric solution of the inversion problem. Afterwards, - ## elimination of _all_ zero/pole pairs by minreal. Bad. - ## 3. Conversion to state-space, solving the problem there and - ## converting back to transfer function. Easier, but obviously, - ## this way needs MIMO __sys2ss__ and __sys2tf__ implementations - ## as described in Thomas Kailath's classic "Linear Systems". - ## Possibly this is the way to go, but it works for proper systems - ## only unless descriptor state-space models are implemented. - - ## WARNING: The code below is a cheap hack to quickly enable SISO TF connections. - - ## TODO: Check for den = 0, e.g. in feedback (tf (1), tf (-1)) - - if (m == 2 && p == 2 && num{1,2} == 0 && num{2,1} == 0) - sys.num(1,1) = num{1,1} * den{2,2}; - sys.num(1,2) = M(1,2) * num{1,1} * num{2,2}; - sys.num(2,1) = M(2,1) * num{1,1} * num{2,2}; - sys.num(2,2) = num{2,2} * den{1,1}; - - sys.den(:) = den{1,1} * den{2,2} - M(1,2) * M(2,1) * num{1,1} * num{2,2}; - - elseif (m == 4 && p == 3) # TODO: extend check - sys.num(:) = tfpoly (0); - sys.den(:) = tfpoly (1); - - sys.num(1,1) = num{1,1}; - sys.num(1,2) = num{1,2}; - sys.num(1,3) = num{1,1} * num{2,3}; - sys.num(1,4) = num{1,2} * num{3,4}; - sys.num(2,3) = num{2,3}; - sys.num(3,4) = num{3,4}; - - sys.den(1,3) = den{2,3}; - sys.den(1,4) = den{3,4}; - sys.den(2,3) = den{2,3}; - sys.den(3,4) = den{3,4}; - - elseif (m == 3 && p == 3) # TODO: extend check - sys.num = num; - sys.den = den; - - sys.num(1,3) = num{1,1} * den{1,2} + num{1,2} * den{1,1}; - sys.den(1,3) = den{1,1} * den{1,2}; - - else - error ("tf: sysconnect: MIMO systems not supported yet"); - - endif - -endfunction \ No newline at end of file Deleted: trunk/octave-forge/main/control/inst/@tf/__sysgroup__.m =================================================================== --- trunk/octave-forge/main/control/inst/@tf/__sysgroup__.m 2010-09-15 00:13:40 UTC (rev 7722) +++ trunk/octave-forge/main/control/inst/@tf/__sysgroup__.m 2010-09-15 00:36:45 UTC (rev 7723) @@ -1,64 +0,0 @@ -## Copyright (C) 2009 Lukas F. Reichlin -## -## This file is part of LTI Syncope. -## -## 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. -## -## 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. If not, see <http://www.gnu.org/licenses/>. - -## -*- texinfo -*- -## Block diagonal concatenation of two TF models. -## This file is part of the Model Abstraction Layer. -## For internal use only. - -## Author: Lukas Reichlin <luk...@gm...> -## Created: September 2009 -## Version: 0.1 - -function retsys = __sysgroup__ (sys1, sys2) - - if (! isa (sys1, "tf")) - sys1 = tf (sys1); - endif - - if (! isa (sys2, "tf")) - sys2 = tf (sys2); - endif - - retsys = tf (); - - retsys.lti = __lti_group__ (sys1.lti, sys2.lti); - - [p1, m1] = size (sys1); - [p2, m2] = size (sys2); - - empty12 = tfpolyzeros (p1, m2); - empty21 = tfpolyzeros (p2, m1); - - retsys.num = [sys1.num, empty12 ; - empty21, sys2.num]; - - empty12 = tfpolyones (p1, m2); - empty21 = tfpolyones (p2, m1); - - retsys.den = [sys1.den, empty12 ; - empty21, sys2.den]; - - if (sys1.tfvar == sys2.tfvar) - retsys.tfvar = sys1.tfvar; - elseif (sys1.tfvar == "x") - retsys.tfvar = sys2.tfvar; - else - retsys.tfvar = sys1.tfvar; - endif - -endfunction \ No newline at end of file Deleted: trunk/octave-forge/main/control/inst/@tf/__sysinv__.m =================================================================== --- trunk/octave-forge/main/control/inst/@tf/__sysinv__.m 2010-09-15 00:13:40 UTC (rev 7722) +++ trunk/octave-forge/main/control/inst/@tf/__sysinv__.m 2010-09-15 00:36:45 UTC (rev 7723) @@ -1,46 +0,0 @@ -## Copyright (C) 2009 Lukas F. Reichlin -## -## This file is part of LTI Syncope. -## -## 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. -## -## 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. If not, see <http://www.gnu.org/licenses/>. - -## -*- texinfo -*- -## Inversion of TF models. - -## Author: Lukas Reichlin <luk...@gm...> -## Created: October 2009 -## Version: 0.1 - -function sys = __sysinv__ (sys) - - [p, m] = size (sys); - - ## TODO: inversion of MIMO TF models - - if (p != 1 || m != 1) - error ("tf: sysinv: MIMO systems not supported yet"); - endif - - den = sys.num; - num = sys.den; - - if (den{1, 1} == 0) # catch case den = 0 - num{1, 1} = tfpoly (0); - den{1, 1} = tfpoly (1); - endif - - sys.num = num; - sys.den = den; - -endfunction \ No newline at end of file Deleted: trunk/octave-forge/main/control/inst/@tf/__sysprune__.m =================================================================== --- trunk/octave-forge/main/control/inst/@tf/__sysprune__.m 2010-09-15 00:13:40 UTC (rev 7722) +++ trunk/octave-forge/main/control/inst/@tf/__sysprune__.m 2010-09-15 00:36:45 UTC (rev 7723) @@ -1,34 +0,0 @@ -## Copyright (C) 2009 Lukas F. Reichlin -## -## This file is part of LTI Syncope. -## -## 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. -## -## 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. If not, see <http://www.gnu.org/licenses/>. - -## -*- texinfo -*- -## Submodel extraction and reordering for TF objects. -## This file is part of the Model Abstraction Layer. -## For internal use only. - -## Author: Lukas Reichlin <luk...@gm...> -## Created: October 2009 -## Version: 0.1 - -function sys = __sysprune__ (sys, out_idx, in_idx) - - sys.lti = __lti_prune__ (sys.lti, out_idx, in_idx); - - sys.num = sys.num(out_idx, in_idx); - sys.den = sys.den(out_idx, in_idx); - -endfunction \ 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-15 00:52:58
|
Revision: 7724 http://octave.svn.sourceforge.net/octave/?rev=7724&view=rev Author: paramaniac Date: 2010-09-15 00:52:51 +0000 (Wed, 15 Sep 2010) Log Message: ----------- control: try sticking to GNU coding standards (not finished yet) Modified Paths: -------------- trunk/octave-forge/main/control/inst/@tf/__set__.m trunk/octave-forge/main/control/inst/@tf/tf.m trunk/octave-forge/main/control/inst/@tfpoly/minus.m trunk/octave-forge/main/control/inst/@tfpoly/plus.m trunk/octave-forge/main/control/inst/@tfpoly/tfpoly.m Added Paths: ----------- trunk/octave-forge/main/control/inst/@tfpoly/__make_equally_long__.m trunk/octave-forge/main/control/inst/@tfpoly/__remove_leading_zeros__.m trunk/octave-forge/main/control/inst/__vec2tfpoly__.m Removed Paths: ------------- trunk/octave-forge/main/control/inst/@tfpoly/__equalizer__.m trunk/octave-forge/main/control/inst/@tfpoly/__remleadzer__.m trunk/octave-forge/main/control/inst/__conv2tfpolycell__.m Modified: trunk/octave-forge/main/control/inst/@tf/__set__.m =================================================================== --- trunk/octave-forge/main/control/inst/@tf/__set__.m 2010-09-15 00:36:45 UTC (rev 7723) +++ trunk/octave-forge/main/control/inst/@tf/__set__.m 2010-09-15 00:52:51 UTC (rev 7724) @@ -26,12 +26,12 @@ switch (prop) # {<internal name>, <user name>} case "num" - num = __conv2tfpolycell__ (val); + num = __vec2tfpoly__ (val); [p, m] = __tf_dim__ (num, sys.den); sys.num = num; case "den" - den = __conv2tfpolycell__ (val); + den = __vec2tfpoly__ (val); [p, m] = __tf_dim__ (sys.num, den); sys.den = den; Modified: trunk/octave-forge/main/control/inst/@tf/tf.m =================================================================== --- trunk/octave-forge/main/control/inst/@tf/tf.m 2010-09-15 00:36:45 UTC (rev 7723) +++ trunk/octave-forge/main/control/inst/@tf/tf.m 2010-09-15 00:52:51 UTC (rev 7724) @@ -79,15 +79,15 @@ return; elseif (isnumeric (num)) # static gain num = num2cell (num); - num = __conv2tfpolycell__ (num); + num = __vec2tfpoly__ (num); [p, m] = size (num); den = tfpolyones (p, m); tsam = -1; tfvar = "x"; # undefined elseif (ischar (num)) # s = tf ("s") tfvar = num; - num = __conv2tfpolycell__ ([1, 0]); - den = __conv2tfpolycell__ ([1]); + num = __vec2tfpoly__ ([1, 0]); + den = __vec2tfpoly__ ([1]); tsam = 0; else print_usage (); @@ -97,18 +97,18 @@ if (ischar (num) && issample (den)) # z = tf ("z", 0.3) tfvar = num; tsam = den; - num = __conv2tfpolycell__ ([1, 0]); - den = __conv2tfpolycell__ ([1]); + num = __vec2tfpoly__ ([1, 0]); + den = __vec2tfpoly__ ([1]); else # sys = tf (num, den) - num = __conv2tfpolycell__ (num); - den = __conv2tfpolycell__ (den); + num = __vec2tfpoly__ (num); + den = __vec2tfpoly__ (den); tfvar = "s"; tsam = 0; endif otherwise # default case - num = __conv2tfpolycell__ (num); - den = __conv2tfpolycell__ (den); + num = __vec2tfpoly__ (num); + den = __vec2tfpoly__ (den); argc = numel (varargin); if (issample (varargin{1}, 1)) # sys = tf (num, den, tsam, "prop1, "val1", ...) Deleted: trunk/octave-forge/main/control/inst/@tfpoly/__equalizer__.m =================================================================== --- trunk/octave-forge/main/control/inst/@tfpoly/__equalizer__.m 2010-09-15 00:36:45 UTC (rev 7723) +++ trunk/octave-forge/main/control/inst/@tfpoly/__equalizer__.m 2010-09-15 00:52:51 UTC (rev 7724) @@ -1,41 +0,0 @@ -## Copyright (C) 2009 Lukas F. Reichlin -## -## This file is part of LTI Syncope. -## -## 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. -## -## 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. If not, see <http://www.gnu.org/licenses/>. - -## -*- texinfo -*- -## Make two polynomials equally long by adding leading zeros -## to the shorter one. For internal use only. - -## Author: Lukas Reichlin <luk...@gm...> -## Created: September 2009 -## Version: 0.1 - -function [peq1, peq2] = __equalizer__ (p1, p2) - - lp1 = length (p1.poly); - lp2 = length (p2.poly); - lmax = max (lp1, lp2); - - leadzer1 = zeros (1, lmax - lp1); - leadzer2 = zeros (1, lmax - lp2); - - peq1 = p1; - peq2 = p2; - - peq1.poly = [leadzer1, p1.poly]; - peq2.poly = [leadzer2, p2.poly]; - -endfunction \ No newline at end of file Added: trunk/octave-forge/main/control/inst/@tfpoly/__make_equally_long__.m =================================================================== --- trunk/octave-forge/main/control/inst/@tfpoly/__make_equally_long__.m (rev 0) +++ trunk/octave-forge/main/control/inst/@tfpoly/__make_equally_long__.m 2010-09-15 00:52:51 UTC (rev 7724) @@ -0,0 +1,41 @@ +## Copyright (C) 2009 Lukas F. Reichlin +## +## This file is part of LTI Syncope. +## +## 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. +## +## 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. If not, see <http://www.gnu.org/licenses/>. + +## -*- texinfo -*- +## Make two polynomials equally long by adding leading zeros +## to the shorter one. For internal use only. + +## Author: Lukas Reichlin <luk...@gm...> +## Created: September 2009 +## Version: 0.1 + +function [peq1, peq2] = __make_equally_long__ (p1, p2) + + lp1 = length (p1.poly); + lp2 = length (p2.poly); + lmax = max (lp1, lp2); + + leadzer1 = zeros (1, lmax - lp1); + leadzer2 = zeros (1, lmax - lp2); + + peq1 = p1; + peq2 = p2; + + peq1.poly = [leadzer1, p1.poly]; + peq2.poly = [leadzer2, p2.poly]; + +endfunction \ No newline at end of file Deleted: trunk/octave-forge/main/control/inst/@tfpoly/__remleadzer__.m =================================================================== --- trunk/octave-forge/main/control/inst/@tfpoly/__remleadzer__.m 2010-09-15 00:36:45 UTC (rev 7723) +++ trunk/octave-forge/main/control/inst/@tfpoly/__remleadzer__.m 2010-09-15 00:52:51 UTC (rev 7724) @@ -1,34 +0,0 @@ -## Copyright (C) 2009 Lukas F. Reichlin -## -## This file is part of LTI Syncope. -## -## 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. -## -## 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. If not, see <http://www.gnu.org/licenses/>. - -## -*- texinfo -*- -## Remove leading zeros from a polynomial, except for polynomials -## which are of length 1. For internal use only. - -## Author: Lukas Reichlin <luk...@gm...> -## Created: September 2009 -## Version: 0.1 - -function p = __remleadzer__ (p) - - idx = find (p.poly != 0); - - if (! isempty (idx) && idx(1) > 1) - p.poly = p.poly(idx(1) : end); # p.poly(idx) would remove all zeros - endif - -endfunction \ No newline at end of file Added: trunk/octave-forge/main/control/inst/@tfpoly/__remove_leading_zeros__.m =================================================================== --- trunk/octave-forge/main/control/inst/@tfpoly/__remove_leading_zeros__.m (rev 0) +++ trunk/octave-forge/main/control/inst/@tfpoly/__remove_leading_zeros__.m 2010-09-15 00:52:51 UTC (rev 7724) @@ -0,0 +1,34 @@ +## Copyright (C) 2009 Lukas F. Reichlin +## +## This file is part of LTI Syncope. +## +## 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. +## +## 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. If not, see <http://www.gnu.org/licenses/>. + +## -*- texinfo -*- +## Remove leading zeros from a polynomial, except for polynomials +## which are of length 1. For internal use only. + +## Author: Lukas Reichlin <luk...@gm...> +## Created: September 2009 +## Version: 0.1 + +function p = __remove_leading_zeros__ (p) + + idx = find (p.poly != 0); + + if (! isempty (idx) && idx(1) > 1) + p.poly = p.poly(idx(1) : end); # p.poly(idx) would remove all zeros + endif + +endfunction \ No newline at end of file Modified: trunk/octave-forge/main/control/inst/@tfpoly/minus.m =================================================================== --- trunk/octave-forge/main/control/inst/@tfpoly/minus.m 2010-09-15 00:36:45 UTC (rev 7723) +++ trunk/octave-forge/main/control/inst/@tfpoly/minus.m 2010-09-15 00:52:51 UTC (rev 7724) @@ -32,12 +32,12 @@ b = tfpoly (b); endif - [a, b] = __equalizer__ (a, b); + [a, b] = __make_equally_long__ (a, b); p = tfpoly (); p.poly = a.poly - b.poly; - p = __remleadzer__ (p); + p = __remove_leading_zeros__ (p); endfunction \ No newline at end of file Modified: trunk/octave-forge/main/control/inst/@tfpoly/plus.m =================================================================== --- trunk/octave-forge/main/control/inst/@tfpoly/plus.m 2010-09-15 00:36:45 UTC (rev 7723) +++ trunk/octave-forge/main/control/inst/@tfpoly/plus.m 2010-09-15 00:52:51 UTC (rev 7724) @@ -32,12 +32,12 @@ b = tfpoly (b); endif - [a, b] = __equalizer__ (a, b); + [a, b] = __make_equally_long__ (a, b); p = tfpoly (); p.poly = a.poly + b.poly; - p = __remleadzer__ (p); + p = __remove_leading_zeros__ (p); endfunction \ No newline at end of file Modified: trunk/octave-forge/main/control/inst/@tfpoly/tfpoly.m =================================================================== --- trunk/octave-forge/main/control/inst/@tfpoly/tfpoly.m 2010-09-15 00:36:45 UTC (rev 7723) +++ trunk/octave-forge/main/control/inst/@tfpoly/tfpoly.m 2010-09-15 00:52:51 UTC (rev 7724) @@ -38,7 +38,7 @@ elseif (isreal (a) && isvector (a)) p.poly = reshape (a, 1, []); p = class (p, "tfpoly"); - p = __remleadzer__ (p); + p = __remove_leading_zeros__ (p); else error ("tfpoly: argument must be a real vector"); endif Deleted: trunk/octave-forge/main/control/inst/__conv2tfpolycell__.m =================================================================== --- trunk/octave-forge/main/control/inst/__conv2tfpolycell__.m 2010-09-15 00:36:45 UTC (rev 7723) +++ trunk/octave-forge/main/control/inst/__conv2tfpolycell__.m 2010-09-15 00:52:51 UTC (rev 7724) @@ -1,34 +0,0 @@ -## Copyright (C) 2009 - 2010 Lukas F. Reichlin -## -## This file is part of LTI Syncope. -## -## 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. -## -## 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. If not, see <http://www.gnu.org/licenses/>. - -## -*- texinfo -*- -## Convert a (cell of) row vector(s) to a cell of tfpoly objects. -## Used by tf and __set__. - -## Author: Lukas Reichlin <luk...@gm...> -## Created: October 2009 -## Version: 0.2 - -function ndr = __conv2tfpolycell__ (nd) - - if (! iscell (nd)) - nd = {nd}; - endif - - ndr = cellfun (@tfpoly, nd, "uniformoutput", false); - -endfunction \ No newline at end of file Added: trunk/octave-forge/main/control/inst/__vec2tfpoly__.m =================================================================== --- trunk/octave-forge/main/control/inst/__vec2tfpoly__.m (rev 0) +++ trunk/octave-forge/main/control/inst/__vec2tfpoly__.m 2010-09-15 00:52:51 UTC (rev 7724) @@ -0,0 +1,34 @@ +## Copyright (C) 2009 - 2010 Lukas F. Reichlin +## +## This file is part of LTI Syncope. +## +## 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. +## +## 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. If not, see <http://www.gnu.org/licenses/>. + +## -*- texinfo -*- +## Convert a (cell of) row vector(s) to a cell of tfpoly objects. +## Used by tf and __set__. + +## Author: Lukas Reichlin <luk...@gm...> +## Created: October 2009 +## Version: 0.2 + +function ndr = __vec2tfpoly__ (nd) + + if (! iscell (nd)) + nd = {nd}; + endif + + ndr = cellfun (@tfpoly, nd, "uniformoutput", false); + +endfunction \ 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-15 01:46:52
|
Revision: 7725 http://octave.svn.sourceforge.net/octave/?rev=7725&view=rev Author: paramaniac Date: 2010-09-15 01:46:45 +0000 (Wed, 15 Sep 2010) Log Message: ----------- control: try sticking to GNU coding standards, improve efficiency Modified Paths: -------------- trunk/octave-forge/main/control/inst/@lti/set.m trunk/octave-forge/main/control/inst/@ss/__set__.m trunk/octave-forge/main/control/inst/@ss/display.m trunk/octave-forge/main/control/inst/@ss/ss.m trunk/octave-forge/main/control/inst/@tf/display.m trunk/octave-forge/main/control/inst/__time_response__.m trunk/octave-forge/main/control/inst/bode.m trunk/octave-forge/main/control/inst/bodemag.m trunk/octave-forge/main/control/inst/lsim.m trunk/octave-forge/main/control/inst/margin.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 Added Paths: ----------- trunk/octave-forge/main/control/inst/@lti/__lti_data__.m trunk/octave-forge/main/control/inst/__axis_limits__.m trunk/octave-forge/main/control/inst/__check_name_numel__.m trunk/octave-forge/main/control/inst/__mark_empty_names__.m Removed Paths: ------------- trunk/octave-forge/main/control/inst/__axis2dlim__.m trunk/octave-forge/main/control/inst/__checkname__.m trunk/octave-forge/main/control/inst/__markemptynames__.m Added: trunk/octave-forge/main/control/inst/@lti/__lti_data__.m =================================================================== --- trunk/octave-forge/main/control/inst/@lti/__lti_data__.m (rev 0) +++ trunk/octave-forge/main/control/inst/@lti/__lti_data__.m 2010-09-15 01:46:45 UTC (rev 7725) @@ -0,0 +1,31 @@ +## Copyright (C) 2010 Lukas F. Reichlin +## +## This file is part of LTI Syncope. +## +## 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. +## +## 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. If not, see <http://www.gnu.org/licenses/>. + +## -*- texinfo -*- +## Used by display routines instead of multiple get calls. + +## Author: Lukas Reichlin <luk...@gm...> +## Created: September 2010 +## Version: 0.1 + +function [inname, outname, tsam] = __lti_data__ (sys) + + inname = sys.inname; + outname = sys.outname; + tsam = sys.tsam; + +endfunction \ No newline at end of file Modified: trunk/octave-forge/main/control/inst/@lti/set.m =================================================================== --- trunk/octave-forge/main/control/inst/@lti/set.m 2010-09-15 00:52:51 UTC (rev 7724) +++ trunk/octave-forge/main/control/inst/@lti/set.m 2010-09-15 01:46:45 UTC (rev 7725) @@ -60,10 +60,10 @@ switch (prop) case {"inname", "inputname"} - sys.inname = __checkname__ (val, m); + sys.inname = __check_name_numel__ (val, m); case {"outname", "outputname"} - sys.outname = __checkname__ (val, p); + sys.outname = __check_name_numel__ (val, p); case {"tsam", "ts"} if (issample (val)) Modified: trunk/octave-forge/main/control/inst/@ss/__set__.m =================================================================== --- trunk/octave-forge/main/control/inst/@ss/__set__.m 2010-09-15 00:52:51 UTC (rev 7724) +++ trunk/octave-forge/main/control/inst/@ss/__set__.m 2010-09-15 01:46:45 UTC (rev 7725) @@ -43,7 +43,7 @@ case {"stname", "statename"} n = rows (sys.a); - sys.stname = __checkname__ (val, n); + sys.stname = __check_name_numel__ (val, n); otherwise error ("ss: set: invalid property name"); Modified: trunk/octave-forge/main/control/inst/@ss/display.m =================================================================== --- trunk/octave-forge/main/control/inst/@ss/display.m 2010-09-15 00:52:51 UTC (rev 7724) +++ trunk/octave-forge/main/control/inst/@ss/display.m 2010-09-15 01:46:45 UTC (rev 7725) @@ -1,4 +1,4 @@ -## Copyright (C) 2009 Lukas F. Reichlin +## Copyright (C) 2009 - 2010 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## @@ -20,42 +20,44 @@ ## Author: Lukas Reichlin <luk...@gm...> ## Created: September 2009 -## Version: 0.1 +## Version: 0.2 function display (sys) - tsam = get (sys, "tsam"); - inname = get (sys, "inname"); - outname = get (sys, "outname"); + [inname, outname, tsam] = __lti_data__ (sys.lti); stname = sys.stname; - if (isempty (inname) || isequal ("", inname{:})) - inname = strseq ("u", 1 : length (inname)); + m = numel (inname); + p = numel (outname); + n = numel (stname); + + if (m == 0 || isequal ("", inname{:})) + inname = strseq ("u", 1:m); else - inname = __markemptynames__ (inname); + inname = __mark_empty_names__ (inname); endif - if (isempty (outname) || isequal ("", outname{:})) - outname = strseq ("y", 1 : length (outname)); + if (p == 0 || isequal ("", outname{:})) + outname = strseq ("y", 1:p); else - outname = __markemptynames__ (outname); + outname = __mark_empty_names__ (outname); endif - if (isempty (stname) || isequal ("", stname{:})) - stname = strseq ("x", 1 : length (stname)); + if (n == 0 || isequal ("", stname{:})) + stname = strseq ("x", 1:n); else - stname = __markemptynames__ (stname); + stname = __mark_empty_names__ (stname); endif disp (""); if (! isempty (sys.a)) - dispmat (sys.a, [inputname(1), ".a"], stname, stname); - dispmat (sys.b, [inputname(1), ".b"], stname, inname); - dispmat (sys.c, [inputname(1), ".c"], outname, stname); + __disp_mat__ (sys.a, [inputname(1), ".a"], stname, stname); + __disp_mat__ (sys.b, [inputname(1), ".b"], stname, inname); + __disp_mat__ (sys.c, [inputname(1), ".c"], outname, stname); endif - dispmat (sys.d, [inputname(1), ".d"], outname, inname); + __disp_mat__ (sys.d, [inputname(1), ".d"], outname, inname); display (sys.lti); # display sampling time @@ -70,7 +72,7 @@ endfunction -function dispmat (m, mname, rname, cname) +function __disp_mat__ (m, mname, rname, cname) MAX_LEN = 12; # max length of row name and column name [mrows, mcols] = size (m); Modified: trunk/octave-forge/main/control/inst/@ss/ss.m =================================================================== --- trunk/octave-forge/main/control/inst/@ss/ss.m 2010-09-15 00:52:51 UTC (rev 7724) +++ trunk/octave-forge/main/control/inst/@ss/ss.m 2010-09-15 01:46:45 UTC (rev 7725) @@ -89,11 +89,11 @@ tsam = 0; case 4 # continuous system ss (a, b, c, d), ss ([], [], [], d) - [b, c] = __gaincheck__ (b, c, d); + [b, c] = __gain_check__ (b, c, d); tsam = 0; otherwise # default case - [b, c] = __gaincheck__ (b, c, d); + [b, c] = __gain_check__ (b, c, d); argc = numel (varargin); if (issample (varargin{1}, 1)) # sys = ss (a, b, c, d, tsam, "prop1, "val1", ...) @@ -132,7 +132,7 @@ endfunction -function [b, c] = __gaincheck__ (b, c, d) +function [b, c] = __gain_check__ (b, c, d) ## catch the case sys = ss ([], [], [], d) ## don't forget to set tsam = -1 Modified: trunk/octave-forge/main/control/inst/@tf/display.m =================================================================== --- trunk/octave-forge/main/control/inst/@tf/display.m 2010-09-15 00:52:51 UTC (rev 7724) +++ trunk/octave-forge/main/control/inst/@tf/display.m 2010-09-15 01:46:45 UTC (rev 7725) @@ -1,4 +1,4 @@ -## Copyright (C) 2009 Lukas F. Reichlin +## Copyright (C) 2009 - 2010 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## @@ -20,32 +20,33 @@ ## Author: Lukas Reichlin <luk...@gm...> ## Created: September 2009 -## Version: 0.1 +## Version: 0.2 function display (sys) - [ny, nu] = size (sys); - inname = get (sys, "inname"); - outname = get (sys, "outname"); + [inname, outname] = __lti_data__ (sys.lti); - if (isempty (inname) || isequal ("", inname{:})) - inname = strseq ("u", 1 : length (inname)); + m = numel (inname); + p = numel (outname); + + if (m == 0 || isequal ("", inname{:})) + inname = strseq ("u", 1:m); else - inname = __markemptynames__ (inname); + inname = __mark_empty_names__ (inname); endif - if (isempty (outname) || isequal ("", outname{:})) - outname = strseq ("y", 1 : length (outname)); + if (p == 0 || isequal ("", outname{:})) + outname = strseq ("y", 1:p); else - outname = __markemptynames__ (outname); + outname = __mark_empty_names__ (outname); endif disp (""); - for m = 1 : nu - disp (["Transfer function \"", inputname(1), "\" from input \"", inname{m}, "\" to output ..."]); - for p = 1 : ny - dispfrac (sys.num{p, m}, sys.den{p, m}, sys.tfvar, outname{p}); + for nu = 1 : m + disp (["Transfer function \"", inputname(1), "\" from input \"", inname{nu}, "\" to output ..."]); + for ny = 1 : p + __disp_frac__ (sys.num{ny, nu}, sys.den{ny, nu}, sys.tfvar, outname{ny}); endfor endfor @@ -54,7 +55,7 @@ endfunction -function dispfrac (num, den, tfvar, name) +function __disp_frac__ (num, den, tfvar, name) MAX_LEN = 12; # max length of output name Deleted: trunk/octave-forge/main/control/inst/__axis2dlim__.m =================================================================== --- trunk/octave-forge/main/control/inst/__axis2dlim__.m 2010-09-15 00:52:51 UTC (rev 7724) +++ trunk/octave-forge/main/control/inst/__axis2dlim__.m 2010-09-15 01:46:45 UTC (rev 7725) @@ -1,71 +0,0 @@ -## Copyright (C) 1998, 2000, 2004, 2005, 2007 -## Auburn University. All rights reserved. -## -## -## 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. -## -## 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. -## -## 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/>. - -## -*- texinfo -*- -## @deftypefn {Function File} {} __axis2dlim__ (@var{axdata}) -## Determine axis limits for 2-D data (column vectors); leaves a 10% -## margin around the plots. -## Inserts margins of +/- 0.1 if data is one-dimensional -## (or a single point). -## -## @strong{Input} -## @table @var -## @item axdata -## @var{n} by 2 matrix of data [@var{x}, @var{y}]. -## @end table -## -## @strong{Output} -## @table @var -## @item axvec -## Vector of axis limits appropriate for call to @command{axis} function. -## @end table -## @end deftypefn - -function axvec = __axis2dlim__ (axdata) - - if (nargin < 1 || isempty (axdata)) - axdata = 0; - endif - - ## compute axis limits - minv = min (axdata); - maxv = max (axdata); - delv = (maxv-minv)/2; # breadth of the plot - midv = (minv + maxv)/2; # midpoint of the plot - axmid = [midv(1), midv(1), midv(2), midv(2)]; - axdel = [-0.1, 0.1, -0.1, 0.1]; # default plot width (if less than 2-d data) - if (max (delv) == 0) - if (midv(1) != 0) - axdel(1:2) = [-0.1*midv(1), 0.1*midv(1)]; - endif - if (midv(2) != 0) - axdel(3:4) = [-0.1*midv(2), 0.1*midv(2)]; - endif - else - ## they're at least one-dimensional - tolv = max(1e-8, 1e-8*abs(midv)); - if (abs (delv(1)) >= tolv(1)) - axdel(1:2) = 1.1*[-delv(1),delv(1)]; - endif - if (abs (delv(2)) >= tolv(2)) - axdel(3:4) = 1.1*[-delv(2),delv(2)]; - endif - endif - axvec = axmid + axdel; - -endfunction Added: trunk/octave-forge/main/control/inst/__axis_limits__.m =================================================================== --- trunk/octave-forge/main/control/inst/__axis_limits__.m (rev 0) +++ trunk/octave-forge/main/control/inst/__axis_limits__.m 2010-09-15 01:46:45 UTC (rev 7725) @@ -0,0 +1,71 @@ +## Copyright (C) 1998, 2000, 2004, 2005, 2007 +## Auburn University. All rights reserved. +## +## +## 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. +## +## 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. +## +## 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/>. + +## -*- texinfo -*- +## @deftypefn {Function File} {} __axis_limits__ (@var{axdata}) +## Determine axis limits for 2-D data (column vectors); leaves a 10% +## margin around the plots. +## Inserts margins of +/- 0.1 if data is one-dimensional +## (or a single point). +## +## @strong{Input} +## @table @var +## @item axdata +## @var{n} by 2 matrix of data [@var{x}, @var{y}]. +## @end table +## +## @strong{Output} +## @table @var +## @item axvec +## Vector of axis limits appropriate for call to @command{axis} function. +## @end table +## @end deftypefn + +function axvec = __axis_limits__ (axdata) + + if (nargin < 1 || isempty (axdata)) + axdata = 0; + endif + + ## compute axis limits + minv = min (axdata); + maxv = max (axdata); + delv = (maxv-minv)/2; # breadth of the plot + midv = (minv + maxv)/2; # midpoint of the plot + axmid = [midv(1), midv(1), midv(2), midv(2)]; + axdel = [-0.1, 0.1, -0.1, 0.1]; # default plot width (if less than 2-d data) + if (max (delv) == 0) + if (midv(1) != 0) + axdel(1:2) = [-0.1*midv(1), 0.1*midv(1)]; + endif + if (midv(2) != 0) + axdel(3:4) = [-0.1*midv(2), 0.1*midv(2)]; + endif + else + ## they're at least one-dimensional + tolv = max(1e-8, 1e-8*abs(midv)); + if (abs (delv(1)) >= tolv(1)) + axdel(1:2) = 1.1*[-delv(1),delv(1)]; + endif + if (abs (delv(2)) >= tolv(2)) + axdel(3:4) = 1.1*[-delv(2),delv(2)]; + endif + endif + axvec = axmid + axdel; + +endfunction Added: trunk/octave-forge/main/control/inst/__check_name_numel__.m =================================================================== --- trunk/octave-forge/main/control/inst/__check_name_numel__.m (rev 0) +++ trunk/octave-forge/main/control/inst/__check_name_numel__.m 2010-09-15 01:46:45 UTC (rev 7725) @@ -0,0 +1,38 @@ +## Copyright (C) 2009 -2010 Lukas F. Reichlin +## +## This file is part of LTI Syncope. +## +## 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. +## +## 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. If not, see <http://www.gnu.org/licenses/>. + +## -*- texinfo -*- +## Check whether a cell contains the required number of strings. +## Used by set and __set__. + +## Author: Lukas Reichlin <luk...@gm...> +## Created: October 2009 +## Version: 0.2 + +function name = __check_name_numel__ (name, req_len) + + if (! iscell (name)) # catch the siso case, + name = {name}; # e.g. sys = set (sys, "inname", "u_1") + endif + + name = reshape (name, [], 1); + + if (numel (name) != req_len) + error ("lti: set: cell must contain %d strings", req_len); + endif + +endfunction \ No newline at end of file Deleted: trunk/octave-forge/main/control/inst/__checkname__.m =================================================================== --- trunk/octave-forge/main/control/inst/__checkname__.m 2010-09-15 00:52:51 UTC (rev 7724) +++ trunk/octave-forge/main/control/inst/__checkname__.m 2010-09-15 01:46:45 UTC (rev 7725) @@ -1,38 +0,0 @@ -## Copyright (C) 2009 -2010 Lukas F. Reichlin -## -## This file is part of LTI Syncope. -## -## 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. -## -## 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. If not, see <http://www.gnu.org/licenses/>. - -## -*- texinfo -*- -## Check whether a cell contains the required number of strings. -## Used by set and __set__. - -## Author: Lukas Reichlin <luk...@gm...> -## Created: October 2009 -## Version: 0.2 - -function name = __checkname__ (name, req_len) - - if (! iscell (name)) # catch the siso case, - name = {name}; # e.g. sys = set (sys, "inname", "u_1") - endif - - name = reshape (name, [], 1); - - if (numel (name) != req_len) - error ("lti: set: cell must contain %d strings", req_len); - endif - -endfunction \ No newline at end of file Added: trunk/octave-forge/main/control/inst/__mark_empty_names__.m =================================================================== --- trunk/octave-forge/main/control/inst/__mark_empty_names__.m (rev 0) +++ trunk/octave-forge/main/control/inst/__mark_empty_names__.m 2010-09-15 01:46:45 UTC (rev 7725) @@ -0,0 +1,34 @@ +## Copyright (C) 2009 Lukas F. Reichlin +## +## This file is part of LTI Syncope. +## +## 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. +## +## 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. If not, see <http://www.gnu.org/licenses/>. + +## -*- texinfo -*- +## Check whether a string of the cell "name" is empty and mark them +## with "?". Used by display routines. + +## Author: Lukas Reichlin <luk...@gm...> +## Created: October 2009 +## Version: 0.1 + +function name = __mark_empty_names__ (name) + + for k = 1 : numel (name) + if (isempty (name{k})) + name{k} = "?"; + endif + endfor + +endfunction \ No newline at end of file Deleted: trunk/octave-forge/main/control/inst/__markemptynames__.m =================================================================== --- trunk/octave-forge/main/control/inst/__markemptynames__.m 2010-09-15 00:52:51 UTC (rev 7724) +++ trunk/octave-forge/main/control/inst/__markemptynames__.m 2010-09-15 01:46:45 UTC (rev 7725) @@ -1,34 +0,0 @@ -## Copyright (C) 2009 Lukas F. Reichlin -## -## This file is part of LTI Syncope. -## -## 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. -## -## 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. If not, see <http://www.gnu.org/licenses/>. - -## -*- texinfo -*- -## Check whether a string of the cell "name" is empty and mark them -## with "?". Used by display routines. - -## Author: Lukas Reichlin <luk...@gm...> -## Created: October 2009 -## Version: 0.1 - -function name = __markemptynames__ (name) - - for k = 1 : numel (name) - if (isempty (name{k})) - name{k} = "?"; - endif - endfor - -endfunction \ No newline at end of file Modified: trunk/octave-forge/main/control/inst/__time_response__.m =================================================================== --- trunk/octave-forge/main/control/inst/__time_response__.m 2010-09-15 00:52:51 UTC (rev 7724) +++ trunk/octave-forge/main/control/inst/__time_response__.m 2010-09-15 01:46:45 UTC (rev 7725) @@ -161,7 +161,7 @@ if (isempty (outname) || isequal ("", outname{:})) outname = strseq ("y_", 1 : length (outname)); else - outname = __markemptynames__ (outname); + outname = __mark_empty_names__ (outname); endif if (strcmp (resptype, "initial")) Modified: trunk/octave-forge/main/control/inst/bode.m =================================================================== --- trunk/octave-forge/main/control/inst/bode.m 2010-09-15 00:52:51 UTC (rev 7724) +++ trunk/octave-forge/main/control/inst/bode.m 2010-09-15 01:46:45 UTC (rev 7725) @@ -65,9 +65,9 @@ mag_db = 20 * log10 (mag); wv = [min(w), max(w)]; - ax_vec_mag = __axis2dlim__ ([reshape(w, [], 1), reshape(mag_db, [], 1)]); + ax_vec_mag = __axis_limits__ ([reshape(w, [], 1), reshape(mag_db, [], 1)]); ax_vec_mag(1:2) = wv; - ax_vec_pha = __axis2dlim__ ([reshape(w, [], 1), reshape(pha, [], 1)]); + ax_vec_pha = __axis_limits__ ([reshape(w, [], 1), reshape(pha, [], 1)]); ax_vec_pha(1:2) = wv; if (isct (sys)) Modified: trunk/octave-forge/main/control/inst/bodemag.m =================================================================== --- trunk/octave-forge/main/control/inst/bodemag.m 2010-09-15 00:52:51 UTC (rev 7724) +++ trunk/octave-forge/main/control/inst/bodemag.m 2010-09-15 01:46:45 UTC (rev 7725) @@ -62,7 +62,7 @@ mag_db = 20 * log10 (mag); wv = [min(w), max(w)]; - ax_vec_mag = __axis2dlim__ ([reshape(w, [], 1), reshape(mag_db, [], 1)]); + ax_vec_mag = __axis_limits__ ([reshape(w, [], 1), reshape(mag_db, [], 1)]); ax_vec_mag(1:2) = wv; if (isct (sys)) Modified: trunk/octave-forge/main/control/inst/lsim.m =================================================================== --- trunk/octave-forge/main/control/inst/lsim.m 2010-09-15 00:52:51 UTC (rev 7724) +++ trunk/octave-forge/main/control/inst/lsim.m 2010-09-15 01:46:45 UTC (rev 7725) @@ -141,7 +141,7 @@ if (isempty (outname) || isequal ("", outname{:})) outname = strseq ("y_", 1 : length (outname)); else - outname = __markemptynames__ (outname); + outname = __mark_empty_names__ (outname); endif if (discrete) # discrete system Modified: trunk/octave-forge/main/control/inst/margin.m =================================================================== --- trunk/octave-forge/main/control/inst/margin.m 2010-09-15 00:52:51 UTC (rev 7724) +++ trunk/octave-forge/main/control/inst/margin.m 2010-09-15 01:46:45 UTC (rev 7725) @@ -270,9 +270,9 @@ gamma_db = 20 * log10 (gamma); wv = [min(w), max(w)]; - ax_vec_mag = __axis2dlim__ ([reshape(w, [], 1), reshape(mag_db, [], 1)]); + ax_vec_mag = __axis_limits__ ([reshape(w, [], 1), reshape(mag_db, [], 1)]); ax_vec_mag(1:2) = wv; - ax_vec_pha = __axis2dlim__ ([reshape(w, [], 1), reshape(pha, [], 1)]); + ax_vec_pha = __axis_limits__ ([reshape(w, [], 1), reshape(pha, [], 1)]); ax_vec_pha(1:2) = wv; wgm = [w_gamma, w_gamma]; Modified: trunk/octave-forge/main/control/inst/nichols.m =================================================================== --- trunk/octave-forge/main/control/inst/nichols.m 2010-09-15 00:52:51 UTC (rev 7724) +++ trunk/octave-forge/main/control/inst/nichols.m 2010-09-15 01:46:45 UTC (rev 7725) @@ -63,7 +63,7 @@ if (! nargout) mag_db = 20 * log10 (mag); - ax_vec = __axis2dlim__ ([reshape(pha, [], 1), reshape(mag_db, [], 1)]); + ax_vec = __axis_limits__ ([reshape(pha, [], 1), reshape(mag_db, [], 1)]); plot (pha, mag_db) axis (ax_vec) Modified: trunk/octave-forge/main/control/inst/nyquist.m =================================================================== --- trunk/octave-forge/main/control/inst/nyquist.m 2010-09-15 00:52:51 UTC (rev 7724) +++ trunk/octave-forge/main/control/inst/nyquist.m 2010-09-15 01:46:45 UTC (rev 7725) @@ -62,7 +62,7 @@ im = imag (H); if (! nargout) - ax_vec = __axis2dlim__ ([re, im; re, -im]); + ax_vec = __axis_limits__ ([re, im; re, -im]); plot (re, im, "b", re, -im, "r") axis (ax_vec) Modified: trunk/octave-forge/main/control/inst/rlocus.m =================================================================== --- trunk/octave-forge/main/control/inst/rlocus.m 2010-09-15 00:52:51 UTC (rev 7724) +++ trunk/octave-forge/main/control/inst/rlocus.m 2010-09-15 01:46:45 UTC (rev 7725) @@ -226,7 +226,7 @@ if (nargout == 0) rlpolv = vec(rlpol); axdata = [real(rlpolv), imag(rlpolv); real(olzer), imag(olzer)]; - axlim = __axis2dlim__ (axdata); + axlim = __axis_limits__ (axdata); rldata = [real(rlpolv), imag(rlpolv) ]; %inname = get (sys, "inname"); Modified: trunk/octave-forge/main/control/inst/sigma.m =================================================================== --- trunk/octave-forge/main/control/inst/sigma.m 2010-09-15 00:52:51 UTC (rev 7724) +++ trunk/octave-forge/main/control/inst/sigma.m 2010-09-15 01:46:45 UTC (rev 7725) @@ -84,8 +84,8 @@ sv_db = 20 * log10 (sv); ## determine axes - ax_vec = __axis2dlim__ ([reshape(w, [], 1), reshape(min(sv_db, [], 1), [], 1); - reshape(w, [], 1), reshape(max(sv_db, [], 1), [], 1)]); + ax_vec = __axis_limits__ ([reshape(w, [], 1), reshape(min(sv_db, [], 1), [], 1); + reshape(w, [], 1), reshape(max(sv_db, [], 1), [], 1)]); ax_vec(1:2) = [min(w), max(w)]; ## determine xlabel This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <par...@us...> - 2010-09-15 09:59:10
|
Revision: 7727 http://octave.svn.sourceforge.net/octave/?rev=7727&view=rev Author: paramaniac Date: 2010-09-15 09:59:03 +0000 (Wed, 15 Sep 2010) Log Message: ----------- control: simplifications Modified Paths: -------------- trunk/octave-forge/main/control/inst/@lti/ssdata.m trunk/octave-forge/main/control/inst/@lti/tfdata.m trunk/octave-forge/main/control/inst/@ss/__sys_data__.m trunk/octave-forge/main/control/inst/@tf/__sys_data__.m Modified: trunk/octave-forge/main/control/inst/@lti/ssdata.m =================================================================== --- trunk/octave-forge/main/control/inst/@lti/ssdata.m 2010-09-15 08:01:56 UTC (rev 7726) +++ trunk/octave-forge/main/control/inst/@lti/ssdata.m 2010-09-15 09:59:03 UTC (rev 7727) @@ -30,12 +30,8 @@ sys = ss (sys); endif - sysdata = __sys_data__ (sys); + [a, b, c, d] = __sys_data__ (sys); - a = sysdata.a; - b = sysdata.b; - c = sysdata.c; - d = sysdata.d; tsam = sys.tsam; endfunction \ No newline at end of file Modified: trunk/octave-forge/main/control/inst/@lti/tfdata.m =================================================================== --- trunk/octave-forge/main/control/inst/@lti/tfdata.m 2010-09-15 08:01:56 UTC (rev 7726) +++ trunk/octave-forge/main/control/inst/@lti/tfdata.m 2010-09-15 09:59:03 UTC (rev 7727) @@ -31,10 +31,8 @@ sys = tf (sys); endif - sysdata = __sys_data__ (sys); + [num, den] = __sys_data__ (sys); - num = sysdata.num; - den = sysdata.den; tsam = sys.tsam; if (rtype == "vector") Modified: trunk/octave-forge/main/control/inst/@ss/__sys_data__.m =================================================================== --- trunk/octave-forge/main/control/inst/@ss/__sys_data__.m 2010-09-15 08:01:56 UTC (rev 7726) +++ trunk/octave-forge/main/control/inst/@ss/__sys_data__.m 2010-09-15 09:59:03 UTC (rev 7727) @@ -22,12 +22,12 @@ ## Created: September 2009 ## Version: 0.1 -function data = __sys_data__ (sys) +function [a, b, c, d, stname] = __sys_data__ (sys) - data.a = sys.a; - data.b = sys.b; - data.c = sys.c; - data.d = sys.d; - data.stname = sys.stname; + a = sys.a; + b = sys.b; + c = sys.c; + d = sys.d; + stname = sys.stname; endfunction \ No newline at end of file Modified: trunk/octave-forge/main/control/inst/@tf/__sys_data__.m =================================================================== --- trunk/octave-forge/main/control/inst/@tf/__sys_data__.m 2010-09-15 08:01:56 UTC (rev 7726) +++ trunk/octave-forge/main/control/inst/@tf/__sys_data__.m 2010-09-15 09:59:03 UTC (rev 7727) @@ -22,10 +22,10 @@ ## Created: October 2009 ## Version: 0.1 -function data = __sys_data__ (sys) +function [num, den, tfvar] = __sys_data__ (sys) - data.num = sys.num; - data.den = sys.den; - data.tfvar = sys.tfvar; + num = sys.num; + den = sys.den; + tfvar = sys.tfvar; endfunction \ 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-15 11:20:31
|
Revision: 7729 http://octave.svn.sourceforge.net/octave/?rev=7729&view=rev Author: paramaniac Date: 2010-09-15 11:20:24 +0000 (Wed, 15 Sep 2010) Log Message: ----------- control: fix ubiquitous typo Modified Paths: -------------- trunk/octave-forge/main/control/inst/@lti/__property_names__.m trunk/octave-forge/main/control/inst/__frequency_response__.m trunk/octave-forge/main/control/inst/covar.m trunk/octave-forge/main/control/inst/estim.m trunk/octave-forge/main/control/inst/gram.m trunk/octave-forge/main/control/inst/h2syn.m trunk/octave-forge/main/control/inst/hinfsyn.m trunk/octave-forge/main/control/inst/hsvd.m trunk/octave-forge/main/control/inst/margin.m trunk/octave-forge/main/control/inst/pzmap.m Modified: trunk/octave-forge/main/control/inst/@lti/__property_names__.m =================================================================== --- trunk/octave-forge/main/control/inst/@lti/__property_names__.m 2010-09-15 11:10:55 UTC (rev 7728) +++ trunk/octave-forge/main/control/inst/@lti/__property_names__.m 2010-09-15 11:20:24 UTC (rev 7729) @@ -15,7 +15,7 @@ ## -*- texinfo -*- ## @deftypefn {Function File} {[@var{props}, @var{vals}] =} __property_names__ (@var{sys}) -## Return the list of properties as well as the assignable values for a lti object sys. +## Return the list of properties as well as the assignable values for an LTI object sys. ## @end deftypefn ## Author: Lukas Reichlin <luk...@gm...> Modified: trunk/octave-forge/main/control/inst/__frequency_response__.m =================================================================== --- trunk/octave-forge/main/control/inst/__frequency_response__.m 2010-09-15 11:10:55 UTC (rev 7728) +++ trunk/octave-forge/main/control/inst/__frequency_response__.m 2010-09-15 11:20:24 UTC (rev 7729) @@ -27,7 +27,7 @@ ## check arguments if(! isa (sys, "lti")) - error ("frequency_response: first argument sys must be a LTI system"); + error ("frequency_response: first argument sys must be an LTI system"); endif if (! isempty (w) && ! (isreal (w) && isvector (w))) Modified: trunk/octave-forge/main/control/inst/covar.m =================================================================== --- trunk/octave-forge/main/control/inst/covar.m 2010-09-15 11:10:55 UTC (rev 7728) +++ trunk/octave-forge/main/control/inst/covar.m 2010-09-15 11:20:24 UTC (rev 7729) @@ -49,7 +49,7 @@ endif if (! isa (sys, "lti")) - error ("covar: first argument must be a lti model"); + error ("covar: first argument must be an LTI model"); endif if (! isstable (sys)) Modified: trunk/octave-forge/main/control/inst/estim.m =================================================================== --- trunk/octave-forge/main/control/inst/estim.m 2010-09-15 11:10:55 UTC (rev 7728) +++ trunk/octave-forge/main/control/inst/estim.m 2010-09-15 11:20:24 UTC (rev 7729) @@ -52,7 +52,7 @@ endif if (! isa (sys, "lti")) - error ("estim: first argument must be a LTI system"); + error ("estim: first argument must be an LTI system"); endif [a, b, c, d, tsam] = ssdata (sys); Modified: trunk/octave-forge/main/control/inst/gram.m =================================================================== --- trunk/octave-forge/main/control/inst/gram.m 2010-09-15 11:10:55 UTC (rev 7728) +++ trunk/octave-forge/main/control/inst/gram.m 2010-09-15 11:20:24 UTC (rev 7729) @@ -46,7 +46,7 @@ argin2 = lower (argin2); if (! isa (sys, "lti")) - error ("gram: first argument must be a LTI model"); + error ("gram: first argument must be an LTI model"); endif [a, b, c] = ssdata (sys); Modified: trunk/octave-forge/main/control/inst/h2syn.m =================================================================== --- trunk/octave-forge/main/control/inst/h2syn.m 2010-09-15 11:10:55 UTC (rev 7728) +++ trunk/octave-forge/main/control/inst/h2syn.m 2010-09-15 11:20:24 UTC (rev 7729) @@ -81,7 +81,7 @@ endif if (! isa (P, "lti")) - error ("h2syn: first argument must be a LTI system"); + error ("h2syn: first argument must be an LTI system"); endif if (! isscalar (nmeas) || ! isnumeric (nmeas) || isempty (nmeas)) Modified: trunk/octave-forge/main/control/inst/hinfsyn.m =================================================================== --- trunk/octave-forge/main/control/inst/hinfsyn.m 2010-09-15 11:10:55 UTC (rev 7728) +++ trunk/octave-forge/main/control/inst/hinfsyn.m 2010-09-15 11:20:24 UTC (rev 7729) @@ -87,7 +87,7 @@ endif if (! isa (P, "lti")) - error ("hinfsyn: first argument must be a LTI system"); + error ("hinfsyn: first argument must be an LTI system"); endif if (! isscalar (nmeas) || ! isnumeric (nmeas) || isempty (nmeas)) Modified: trunk/octave-forge/main/control/inst/hsvd.m =================================================================== --- trunk/octave-forge/main/control/inst/hsvd.m 2010-09-15 11:10:55 UTC (rev 7728) +++ trunk/octave-forge/main/control/inst/hsvd.m 2010-09-15 11:20:24 UTC (rev 7729) @@ -18,7 +18,7 @@ ## -*- texinfo -*- ## @deftypefn{Function File} {@var{hsv} =} hsvd (@var{sys}) ## @deftypefnx{Function File} {@var{hsv} =} hsvd (@var{sys}, @var{"offset"}, @var{alpha}) -## Hankel singular values of the stable part of a LTI model. If no output arguments are +## Hankel singular values of the stable part of an LTI model. If no output arguments are ## given, the Hankel singular values are displayed in a plot. ## Uses SLICOT AB13AD by courtesy of NICONET e.V. ## <http://www.slicot.org> @@ -35,7 +35,7 @@ endif if (! isa (sys, "lti")) - error ("hsvd: first argument must be a LTI system"); + error ("hsvd: first argument must be an LTI system"); endif if (! strcmp (tolower (prop(1)), "o")) Modified: trunk/octave-forge/main/control/inst/margin.m =================================================================== --- trunk/octave-forge/main/control/inst/margin.m 2010-09-15 11:10:55 UTC (rev 7728) +++ trunk/octave-forge/main/control/inst/margin.m 2010-09-15 11:20:24 UTC (rev 7729) @@ -131,7 +131,7 @@ endif if (! isa (sys, "lti")) - error ("margin: argument sys must be a LTI system"); + error ("margin: argument sys must be an LTI system"); endif if (! issiso (sys)) Modified: trunk/octave-forge/main/control/inst/pzmap.m =================================================================== --- trunk/octave-forge/main/control/inst/pzmap.m 2010-09-15 11:10:55 UTC (rev 7728) +++ trunk/octave-forge/main/control/inst/pzmap.m 2010-09-15 11:20:24 UTC (rev 7729) @@ -18,7 +18,7 @@ ## -*- texinfo -*- ## @deftypefn {Function File} pzmap (@var{sys}) ## @deftypefnx {Function File} {[@var{p}, @var{z}] =} pzmap (@var{sys}) -## Plot the poles and zeros of a LTI system in the complex plane. +## Plot the poles and zeros of an LTI system in the complex plane. ## @end deftypefn ## Author: Lukas Reichlin <luk...@gm...> @@ -35,7 +35,7 @@ endif if (! isa (sys, "lti")) - error ("pzmap: argument must be a LTI system"); + error ("pzmap: argument must be an LTI system"); endif pol = pole (sys); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <par...@us...> - 2010-09-15 13:07:19
|
Revision: 7730 http://octave.svn.sourceforge.net/octave/?rev=7730&view=rev Author: paramaniac Date: 2010-09-15 13:07:07 +0000 (Wed, 15 Sep 2010) Log Message: ----------- control: have fun with cellfun Modified Paths: -------------- trunk/octave-forge/main/control/inst/ctrb.m trunk/octave-forge/main/control/inst/obsv.m Modified: trunk/octave-forge/main/control/inst/ctrb.m =================================================================== --- trunk/octave-forge/main/control/inst/ctrb.m 2010-09-15 11:20:24 UTC (rev 7729) +++ trunk/octave-forge/main/control/inst/ctrb.m 2010-09-15 13:07:07 UTC (rev 7730) @@ -1,5 +1,5 @@ -## Copyright (C) 1997, 2000, 2002, 2004, 2005, 2006, 2007 Kai P. Mueller -## Copyright (C) 2009 Lukas F. Reichlin +## Copyright (C) 2009 - 2010 Lukas F. Reichlin +## Copyright (C) 2009 Luca Favatella <sla...@gm...> ## ## This file is part of LTI Syncope. ## @@ -22,35 +22,32 @@ ## Controllability matrix. ## @end deftypefn -## Author: Kai P. Mueller <mu...@if...> -## Created: November 4, 1997 -## based on is_controllable.m of Scottedward Hodel +## Author: Lukas Reichlin <luk...@gm...> +## Created: October 2009 +## Version: 0.2 function co = ctrb (a, b) - if (nargin == 1) # ctrb (sys) + 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)) + elseif (nargin == 2) # ctrb (a, b) + if (! isreal (a) || ! isreal (b) + || rows (a) != rows (b) || ! issquare (a)) error ("ctrb: invalid arguments (a, b)"); endif else print_usage (); endif - [arows, acols] = size (a); - [brows, bcols] = size (b); + n = rows (a); # number of states + k = num2cell (0:n-1); # exponents for a - co = zeros (arows, acols*bcols); + tmp = cellfun (@(x) a^x*b, k, "uniformoutput", false); - for k = 1 : arows - co(:, ((k-1)*bcols + 1) : (k*bcols)) = b; - b = a * b; - endfor + co = horzcat (tmp{:}); endfunction Modified: trunk/octave-forge/main/control/inst/obsv.m =================================================================== --- trunk/octave-forge/main/control/inst/obsv.m 2010-09-15 11:20:24 UTC (rev 7729) +++ trunk/octave-forge/main/control/inst/obsv.m 2010-09-15 13:07:07 UTC (rev 7730) @@ -1,5 +1,4 @@ -## Copyright (C) 1997, 2000, 2002, 2004, 2005, 2006, 2007 Kai P. Mueller -## Copyright (C) 2009 Lukas F. Reichlin +## Copyright (C) 2009 - 2010 Lukas F. Reichlin ## Copyright (C) 2009 Luca Favatella <sla...@gm...> ## ## This file is part of LTI Syncope. @@ -23,27 +22,20 @@ ## Observability matrix. ## @end deftypefn -## Author: Kai P. Mueller <mu...@if...> -## Created: November 4, 1997 +## Author: Lukas Reichlin <luk...@gm...> +## Created: October 2009 +## Version: 0.2 function ob = obsv (a, c) - 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 (a, c)"); - endif + if (nargin == 1) # obsv (sys) + ob = ctrb (a.').'; # transpose is overloaded for lti models + elseif (nargin == 2) # obsv (a, c) + ob = ctrb (a.', c.').'; # size checked inside else print_usage (); endif - ob = ctrb (a.', c.').'; - endfunction This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <par...@us...> - 2010-09-15 14:06:39
|
Revision: 7731 http://octave.svn.sourceforge.net/octave/?rev=7731&view=rev Author: paramaniac Date: 2010-09-15 14:06:32 +0000 (Wed, 15 Sep 2010) Log Message: ----------- control: use @lti/transpose for dual system Modified Paths: -------------- trunk/octave-forge/main/control/inst/isdetectable.m trunk/octave-forge/main/control/inst/isobsv.m Modified: trunk/octave-forge/main/control/inst/isdetectable.m =================================================================== --- trunk/octave-forge/main/control/inst/isdetectable.m 2010-09-15 13:07:07 UTC (rev 7730) +++ trunk/octave-forge/main/control/inst/isdetectable.m 2010-09-15 14:06:32 UTC (rev 7731) @@ -56,24 +56,22 @@ ## Author: Lukas Reichlin <luk...@gm...> ## Created: October 2009 -## Version: 0.2.1 +## Version: 0.3 function bool = isdetectable (a, c = [], tol = [], dflg = 0) - if (nargin < 1 || nargin > 4) + if (nargin == 0) print_usage (); elseif (isa (a, "lti")) # isdetectable (sys), isdetectable (sys, tol) if (nargin > 2) print_usage (); endif - tol = c; - dflg = ! isct (a); - [a, b, c] = ssdata (a); - elseif (nargin == 1) # isdetectable (a, c, ...) + bool = isstabilizable (a.', c); # transpose is overloaded + elseif (nargin < 2 || nargin > 4) print_usage (); + else # isdetectable (a, c, ...) + bool = isstabilizable (a.', c.', tol, dflg); # arguments checked inside endif - 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-15 13:07:07 UTC (rev 7730) +++ trunk/octave-forge/main/control/inst/isobsv.m 2010-09-15 14:06:32 UTC (rev 7731) @@ -51,23 +51,22 @@ ## Author: Lukas Reichlin <luk...@gm...> ## Created: October 2009 -## Version: 0.2.1 +## Version: 0.3 function [bool, u] = isobsv (a, c = [], tol = []) - if (nargin < 1 || nargin > 3) + if (nargin == 0) 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) + [bool, u] = isctrb (a.', c); # transpose is overloaded + elseif (nargin < 2 || nargin > 3) print_usage (); + else # isobsv (a, c), isobsv (a, c, tol) + [bool, u] = isctrb (a.', c.', tol); endif - [bool, u] = isctrb (a.', c.', tol); - endfunction This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <par...@us...> - 2010-09-15 20:07:24
|
Revision: 7733 http://octave.svn.sourceforge.net/octave/?rev=7733&view=rev Author: paramaniac Date: 2010-09-15 20:07:18 +0000 (Wed, 15 Sep 2010) Log Message: ----------- control: preliminary work for descriptor state-space models Modified Paths: -------------- trunk/octave-forge/main/control/inst/@lti/dssdata.m trunk/octave-forge/main/control/inst/@ss/__freqresp__.m Modified: trunk/octave-forge/main/control/inst/@lti/dssdata.m =================================================================== --- trunk/octave-forge/main/control/inst/@lti/dssdata.m 2010-09-15 19:55:22 UTC (rev 7732) +++ trunk/octave-forge/main/control/inst/@lti/dssdata.m 2010-09-15 20:07:18 UTC (rev 7733) @@ -37,7 +37,7 @@ if (isempty (flg)) # dssdata (sys, []) e = []; # don't return eye for ss models else # dssdata (sys) - e = eye (size (a)); # descriptor model + e = eye (size (a)); # return eye for ss models endif tsam = sys.tsam; Modified: trunk/octave-forge/main/control/inst/@ss/__freqresp__.m =================================================================== --- trunk/octave-forge/main/control/inst/@ss/__freqresp__.m 2010-09-15 19:55:22 UTC (rev 7732) +++ trunk/octave-forge/main/control/inst/@ss/__freqresp__.m 2010-09-15 20:07:18 UTC (rev 7733) @@ -1,4 +1,4 @@ -## Copyright (C) 2009 Lukas F. Reichlin +## Copyright (C) 2009 - 2010 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## @@ -20,13 +20,13 @@ ## Author: Lukas Reichlin <luk...@gm...> ## Created: October 2009 -## Version: 0.1 +## Version: 0.2 function H = __freqresp__ (sys, w, resptype = 0) [p, m] = size (sys); - [A, B, C, D, Ts] = ssdata (sys); - I = eye (size (A)); + [A, B, C, D, E, Ts] = dssdata (sys); + J = eye (m); if (resptype != 0 && m != p) @@ -45,22 +45,22 @@ switch (resptype) case 0 # default system for k = 1 : l_s - H(:, :, k) = C * inv (s(k)*I - A) * B + D; + H(:, :, k) = C * inv (s(k)*E - A) * B + D; endfor case 1 # inversed system for k = 1 : l_s - H(:, :, k) = inv (C * inv (s(k)*I - A) * B + D); + H(:, :, k) = inv (C * inv (s(k)*E - A) * B + D); endfor case 2 # inversed sensitivity for k = 1 : l_s - H(:, :, k) = J + C * inv (s(k)*I - A) * B + D; + H(:, :, k) = J + C * inv (s(k)*E - A) * B + D; endfor case 3 # inversed complementary sensitivity for k = 1 : l_s - H(:, :, k) = J + inv (C * inv (s(k)*I - A) * B + D); + H(:, :, k) = J + inv (C * inv (s(k)*E - A) * B + D); endfor otherwise This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <par...@us...> - 2010-09-15 22:34:59
|
Revision: 7734 http://octave.svn.sourceforge.net/octave/?rev=7734&view=rev Author: paramaniac Date: 2010-09-15 22:34:50 +0000 (Wed, 15 Sep 2010) Log Message: ----------- control: add descriptor state-space models (experimental) Modified Paths: -------------- trunk/octave-forge/main/control/inst/@lti/set.m trunk/octave-forge/main/control/inst/@ss/__get__.m trunk/octave-forge/main/control/inst/@ss/__pole__.m trunk/octave-forge/main/control/inst/@ss/__property_names__.m trunk/octave-forge/main/control/inst/@ss/__set__.m trunk/octave-forge/main/control/inst/@ss/__transpose__.m trunk/octave-forge/main/control/inst/@ss/display.m trunk/octave-forge/main/control/inst/@ss/ss.m trunk/octave-forge/main/control/inst/@tf/__set__.m trunk/octave-forge/main/control/inst/__ss_dim__.m Added Paths: ----------- trunk/octave-forge/main/control/inst/dss.m Modified: trunk/octave-forge/main/control/inst/@lti/set.m =================================================================== --- trunk/octave-forge/main/control/inst/@lti/set.m 2010-09-15 20:07:18 UTC (rev 7733) +++ trunk/octave-forge/main/control/inst/@lti/set.m 2010-09-15 22:34:50 UTC (rev 7734) @@ -43,7 +43,7 @@ elseif (nargout == 0) # set (sys, "prop1", val1, ...) - warning ("lti: get: use sys = get (sys, ""property1"", ...) to save changes"); + warning ("lti: set: use sys = get (sys, ""property1"", ...) to save changes"); warning (" octave does not support pass by reference"); else # sys = set (sys, "prop1", val1, ...) Modified: trunk/octave-forge/main/control/inst/@ss/__get__.m =================================================================== --- trunk/octave-forge/main/control/inst/@ss/__get__.m 2010-09-15 20:07:18 UTC (rev 7733) +++ trunk/octave-forge/main/control/inst/@ss/__get__.m 2010-09-15 22:34:50 UTC (rev 7734) @@ -37,6 +37,9 @@ case "d" val = sys.d; + case "e" + val = sys.e; + case {"stname", "statename"} val = sys.stname; Modified: trunk/octave-forge/main/control/inst/@ss/__pole__.m =================================================================== --- trunk/octave-forge/main/control/inst/@ss/__pole__.m 2010-09-15 20:07:18 UTC (rev 7733) +++ trunk/octave-forge/main/control/inst/@ss/__pole__.m 2010-09-15 22:34:50 UTC (rev 7734) @@ -1,4 +1,4 @@ -## Copyright (C) 2009 Lukas F. Reichlin +## Copyright (C) 2009 - 2010 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## @@ -20,10 +20,14 @@ ## Author: Lukas Reichlin <luk...@gm...> ## Created: October 2009 -## Version: 0.1 +## Version: 0.2 function pol = __pole__ (sys) - pol = eig (sys.a); + if (isempty (sys.e)) + pol = eig (sys.a); + else + pol = eig (sys.a, sys.e); + endif endfunction \ No newline at end of file Modified: trunk/octave-forge/main/control/inst/@ss/__property_names__.m =================================================================== --- trunk/octave-forge/main/control/inst/@ss/__property_names__.m 2010-09-15 20:07:18 UTC (rev 7733) +++ trunk/octave-forge/main/control/inst/@ss/__property_names__.m 2010-09-15 22:34:50 UTC (rev 7734) @@ -30,6 +30,7 @@ "b"; "c"; "d"; + "e"; "stname"}; ## cell vector of ss-specific assignable values @@ -37,6 +38,7 @@ "n-by-m matrix (m = number of inputs)"; "p-by-n matrix (p = number of outputs)"; "p-by-m matrix"; + "n-by-n matrix"; "n-by-1 cell vector of strings"}; if (nargin == 1) Modified: trunk/octave-forge/main/control/inst/@ss/__set__.m =================================================================== --- trunk/octave-forge/main/control/inst/@ss/__set__.m 2010-09-15 20:07:18 UTC (rev 7733) +++ trunk/octave-forge/main/control/inst/@ss/__set__.m 2010-09-15 22:34:50 UTC (rev 7734) @@ -1,4 +1,4 @@ -## Copyright (C) 2009 Lukas F. Reichlin +## Copyright (C) 2009 - 2010 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## @@ -20,27 +20,35 @@ ## Author: Lukas Reichlin <luk...@gm...> ## Created: October 2009 -## Version: 0.1 +## Version: 0.2 function sys = __set__ (sys, prop, val) switch (prop) # {<internal name>, <user name>} case "a" - [m, n, p] = __ss_dim__ (val, sys.b, sys.c, sys.d); + __ss_dim__ (val, sys.b, sys.c, sys.d); sys.a = val; case "b" - [m, n, p] = __ss_dim__ (sys.a, val, sys.c, sys.d); + __ss_dim__ (sys.a, val, sys.c, sys.d); sys.b = val; case "c" - [m, n, p] = __ss_dim__ (sys.a, sys.b, val, sys.d); + __ss_dim__ (sys.a, sys.b, val, sys.d); sys.c = val; case "d" - [m, n, p] = __ss_dim__ (sys.a, sys.b, sys.c, val); + __ss_dim__ (sys.a, sys.b, sys.c, val); sys.d = val; + case "e" + if (isempty (e)) + sys.e = []; # avoid [](nx0) or [](0xn) + else + __ss_dim__ (sys.a, sys.b, sys.c, sys.d, val); + sys.e = val; + endif + case {"stname", "statename"} n = rows (sys.a); sys.stname = __check_name_numel__ (val, n); Modified: trunk/octave-forge/main/control/inst/@ss/__transpose__.m =================================================================== --- trunk/octave-forge/main/control/inst/@ss/__transpose__.m 2010-09-15 20:07:18 UTC (rev 7733) +++ trunk/octave-forge/main/control/inst/@ss/__transpose__.m 2010-09-15 22:34:50 UTC (rev 7734) @@ -20,7 +20,7 @@ ## Author: Lukas Reichlin <luk...@gm...> ## Created: February 2010 -## Version: 0.1 +## Version: 0.2 function sys = __transpose__ (sys) @@ -28,6 +28,7 @@ b = sys.b; c = sys.c; d = sys.d; + e = sys.e; sys.stname = repmat ({""}, rows (a), 1); @@ -35,5 +36,6 @@ sys.b = c.'; sys.c = b.'; sys.d = d.'; + sys.e = e.'; endfunction \ No newline at end of file Modified: trunk/octave-forge/main/control/inst/@ss/display.m =================================================================== --- trunk/octave-forge/main/control/inst/@ss/display.m 2010-09-15 20:07:18 UTC (rev 7733) +++ trunk/octave-forge/main/control/inst/@ss/display.m 2010-09-15 22:34:50 UTC (rev 7734) @@ -51,6 +51,10 @@ disp (""); + if (! isempty (sys.e)) + __disp_mat__ (sys.e, [inputname(1), ".e"], stname, stname); + endif + if (! isempty (sys.a)) __disp_mat__ (sys.a, [inputname(1), ".a"], stname, stname); __disp_mat__ (sys.b, [inputname(1), ".b"], stname, inname); Modified: trunk/octave-forge/main/control/inst/@ss/ss.m =================================================================== --- trunk/octave-forge/main/control/inst/@ss/ss.m 2010-09-15 20:07:18 UTC (rev 7733) +++ trunk/octave-forge/main/control/inst/@ss/ss.m 2010-09-15 22:34:50 UTC (rev 7734) @@ -58,6 +58,7 @@ superiorto ("zpk", "tf", "double"); argc = 0; + e = []; switch (nargin) case 0 # ss () @@ -111,6 +112,7 @@ if (isempty (a)) # static system tsam = -1; + a = []; # avoid [](nx0) or [](0xn) endif [m, n, p] = __ss_dim__ (a, b, c, d); @@ -119,6 +121,7 @@ ssdata = struct ("a", a, "b", b, "c", c, "d", d, + "e", e, "stname", {stname}); ltisys = lti (p, m, tsam); Modified: trunk/octave-forge/main/control/inst/@tf/__set__.m =================================================================== --- trunk/octave-forge/main/control/inst/@tf/__set__.m 2010-09-15 20:07:18 UTC (rev 7733) +++ trunk/octave-forge/main/control/inst/@tf/__set__.m 2010-09-15 22:34:50 UTC (rev 7734) @@ -27,12 +27,12 @@ switch (prop) # {<internal name>, <user name>} case "num" num = __vec2tfpoly__ (val); - [p, m] = __tf_dim__ (num, sys.den); + __tf_dim__ (num, sys.den); sys.num = num; case "den" den = __vec2tfpoly__ (val); - [p, m] = __tf_dim__ (sys.num, den); + __tf_dim__ (sys.num, den); sys.den = den; case {"tfvar", "variable"} Modified: trunk/octave-forge/main/control/inst/__ss_dim__.m =================================================================== --- trunk/octave-forge/main/control/inst/__ss_dim__.m 2010-09-15 20:07:18 UTC (rev 7733) +++ trunk/octave-forge/main/control/inst/__ss_dim__.m 2010-09-15 22:34:50 UTC (rev 7734) @@ -1,4 +1,4 @@ -## Copyright (C) 2009 Lukas F. Reichlin +## Copyright (C) 2009 - 2010 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## @@ -23,8 +23,16 @@ ## Created: September 2009 ## Version: 0.2 -function [m, n, p] = __ss_dim__ (a, b, c, d) +function [m, n, p] = __ss_dim__ (a, b, c, d, e = []) + if (! all ([isreal(a), isreal(b), isreal(c), isreal(d), isreal(e)])) + error ("ss: system matrices must be real"); + endif + + if (! all ([ndims(a), ndims(b), ndims(c), ndims(d), ndims(e)] == 2)) + error ("ss: system matrices must be two-dimensional arrays"); + endif + [arows, acols] = size (a); [brows, bcols] = size (b); [crows, ccols] = size (c); @@ -34,7 +42,7 @@ n = arows; # = acols p = crows; # = drows - if (! issquare (a) && ! isempty (a)) + if (arows != acols) error ("ss: system matrix a(%dx%d) is not square", arows, acols); endif @@ -58,8 +66,9 @@ crows, ccols, drows, dcols); endif - if (! isreal (a) || ! isreal (b) || ! isreal (c) || ! isreal (d)) - error ("ss: system matrices are not real"); + if (! isempty (e) && any (size (e) != n)) + error ("ss: system matrices a(%dx%d) and e(%dx%d) are incompatible", + arows, acols, rows (e), columns (e)); endif endfunction Added: trunk/octave-forge/main/control/inst/dss.m =================================================================== --- trunk/octave-forge/main/control/inst/dss.m (rev 0) +++ trunk/octave-forge/main/control/inst/dss.m 2010-09-15 22:34:50 UTC (rev 7734) @@ -0,0 +1,68 @@ +## Copyright (C) 2010 Lukas F. Reichlin +## +## This file is part of LTI Syncope. +## +## 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. +## +## 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. If not, see <http://www.gnu.org/licenses/>. + +## -*- texinfo -*- +## @deftypefn {Function File} {@var{sys} =} dss (@var{sys}) +## @deftypefnx {Function File} {@var{sys} =} dss (@var{d}) +## @deftypefnx {Function File} {@var{sys} =} dss (@var{a}, @var{b}, @var{c}, @var{d}, @var{e}) +## @deftypefnx {Function File} {@var{sys} =} dss (@var{a}, @var{b}, @var{c}, @var{d}, @var{e}, @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 e +## Descriptor 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 +## Descriptor state-space model. +## @end table +## +## @seealso{ss} +## @end deftypefn + +## Author: Lukas Reichlin <luk...@gm...> +## Created: September 2010 +## Version: 0.1 + +function sys = dss (varargin) + + switch (nargin) + case {0, 2, 3, 4} + print_usage (); + + case 1 # static gain + sys = ss (varargin{1}); + + otherwise # general case + sys = ss (varargin{[1:4, 6:end]}, "e", varargin{5}); + endswitch + +endfunction \ 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-15 23:43:09
|
Revision: 7735 http://octave.svn.sourceforge.net/octave/?rev=7735&view=rev Author: paramaniac Date: 2010-09-15 23:43:02 +0000 (Wed, 15 Sep 2010) Log Message: ----------- control: extend support for descriptor models Modified Paths: -------------- trunk/octave-forge/main/control/inst/@lti/dssdata.m trunk/octave-forge/main/control/inst/@lti/ssdata.m trunk/octave-forge/main/control/inst/@ss/__minreal__.m trunk/octave-forge/main/control/inst/@ss/__sys_data__.m trunk/octave-forge/main/control/inst/@ss/__sys_inverse__.m trunk/octave-forge/main/control/inst/@ss/__zero__.m trunk/octave-forge/main/control/inst/ltimodels.m Modified: trunk/octave-forge/main/control/inst/@lti/dssdata.m =================================================================== --- trunk/octave-forge/main/control/inst/@lti/dssdata.m 2010-09-15 22:34:50 UTC (rev 7734) +++ trunk/octave-forge/main/control/inst/@lti/dssdata.m 2010-09-15 23:43:02 UTC (rev 7735) @@ -32,7 +32,7 @@ sys = ss (sys); endif - [a, b, c, d] = __sys_data__ (sys); + [a, b, c, d, e] = __sys_data__ (sys); if (isempty (flg)) # dssdata (sys, []) e = []; # don't return eye for ss models Modified: trunk/octave-forge/main/control/inst/@lti/ssdata.m =================================================================== --- trunk/octave-forge/main/control/inst/@lti/ssdata.m 2010-09-15 22:34:50 UTC (rev 7734) +++ trunk/octave-forge/main/control/inst/@lti/ssdata.m 2010-09-15 23:43:02 UTC (rev 7735) @@ -1,4 +1,4 @@ -## Copyright (C) 2009 Lukas F. Reichlin +## Copyright (C) 2009 - 2010 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## @@ -22,7 +22,7 @@ ## Author: Lukas Reichlin <luk...@gm...> ## Created: September 2009 -## Version: 0.1 +## Version: 0.2 function [a, b, c, d, tsam] = ssdata (sys) @@ -30,8 +30,17 @@ sys = ss (sys); endif - [a, b, c, d] = __sys_data__ (sys); + [a, b, c, d, e] = __sys_data__ (sys); + if (! isempty (e)) + if (rcond (e) < eps) # check for singularity + error ("ss: ssdata: descriptor matrice ""e"" singular"); + endif + + a = e \ a; + b = e \ b; + endif + tsam = sys.tsam; endfunction \ No newline at end of file Modified: trunk/octave-forge/main/control/inst/@ss/__minreal__.m =================================================================== --- trunk/octave-forge/main/control/inst/@ss/__minreal__.m 2010-09-15 22:34:50 UTC (rev 7734) +++ trunk/octave-forge/main/control/inst/@ss/__minreal__.m 2010-09-15 23:43:02 UTC (rev 7735) @@ -25,6 +25,10 @@ function retsys = __minreal__ (sys, tol) + if (! isempty (sys.e)) + error ("ss: zero: dss models not supported yet"); + endif + if (tol == "def") tol = 0; elseif (tol > 1) Modified: trunk/octave-forge/main/control/inst/@ss/__sys_data__.m =================================================================== --- trunk/octave-forge/main/control/inst/@ss/__sys_data__.m 2010-09-15 22:34:50 UTC (rev 7734) +++ trunk/octave-forge/main/control/inst/@ss/__sys_data__.m 2010-09-15 23:43:02 UTC (rev 7735) @@ -1,4 +1,4 @@ -## Copyright (C) 2009 Lukas F. Reichlin +## Copyright (C) 2009 - 2010 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## @@ -20,14 +20,15 @@ ## Author: Lukas Reichlin <luk...@gm...> ## Created: September 2009 -## Version: 0.1 +## Version: 0.2 -function [a, b, c, d, stname] = __sys_data__ (sys) +function [a, b, c, d, e, stname] = __sys_data__ (sys) a = sys.a; b = sys.b; c = sys.c; d = sys.d; + e = sys.e; stname = sys.stname; endfunction \ No newline at end of file Modified: trunk/octave-forge/main/control/inst/@ss/__sys_inverse__.m =================================================================== --- trunk/octave-forge/main/control/inst/@ss/__sys_inverse__.m 2010-09-15 22:34:50 UTC (rev 7734) +++ trunk/octave-forge/main/control/inst/@ss/__sys_inverse__.m 2010-09-15 23:43:02 UTC (rev 7735) @@ -1,4 +1,4 @@ -## Copyright (C) 2009 Lukas F. Reichlin +## Copyright (C) 2009 - 2010 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## @@ -20,7 +20,7 @@ ## Author: Lukas Reichlin <luk...@gm...> ## Created: October 2009 -## Version: 0.1 +## Version: 0.2 function sys = __sys_inverse__ (sys) @@ -28,21 +28,34 @@ b = sys.b; c = sys.c; d = sys.d; + e = sys.e; - if (rcond (d) < eps) - error ("ss: sys_inverse: inverse is not proper, case not implemented yet"); - else + if (! isempty (e) || rcond (d) < eps) # dss or strictly proper ss + + n = rows (a); + m = columns (b); # p = m (square system) + + if (isempty (e)) # avoid testing twice? + e = eye (n); + endif + + sys.a = [a, b; c, d]; + sys.b = [zeros(n, m); -eye(m)]; + sys.c = [zeros(m, n), eye(m)]; + sys.d = zeros (m); + sys.e = [e, zeros(n, m); zeros(m, n+m)]; + + sys.stname = repmat ({""}, n+m, 1); + + else # proper ss + di = inv (d); - f = a - b * di * c; - g = b * di; - h = -di * c; - j = di; + sys.a = a - b * di * c; + sys.b = -b * di; + sys.c = di * c; + sys.d = di; + endif - sys.a = f; - sys.b = g; - sys.c = h; - sys.d = j; - endfunction \ No newline at end of file Modified: trunk/octave-forge/main/control/inst/@ss/__zero__.m =================================================================== --- trunk/octave-forge/main/control/inst/@ss/__zero__.m 2010-09-15 22:34:50 UTC (rev 7734) +++ trunk/octave-forge/main/control/inst/@ss/__zero__.m 2010-09-15 23:43:02 UTC (rev 7735) @@ -26,6 +26,10 @@ function [zer, gain] = __zero__ (sys) + if (! isempty (sys.e)) + error ("ss: zero: dss models not supported yet"); + endif + [zer, gain] = slab08nd (sys.a, sys.b, sys.c, sys.d); 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-09-15 22:34:50 UTC (rev 7734) +++ trunk/octave-forge/main/control/inst/ltimodels.m 2010-09-15 23:43:02 UTC (rev 7735) @@ -298,7 +298,8 @@ ## inverse of state-space models ## test from SLICOT AB07ND -## note the negative signs in Me for compatibility reasons +## result differs intentionally from a commercial +## implementation of an octave-like language %!shared M, Me %! A = [ 1.0 2.0 0.0 %! 4.0 -1.0 0.0 @@ -333,7 +334,7 @@ %! De = [ 0.2500 0.0000 %! 0.0000 1.0000 ]; %! -%! Me = [Ae, -Be; -Ce, De]; +%! Me = [Ae, Be; Ce, De]; # Me = [Ae, -Be; -Ce, De]; %! %!assert (M, Me, 1e-4); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <par...@us...> - 2010-09-16 15:48:32
|
Revision: 7738 http://octave.svn.sourceforge.net/octave/?rev=7738&view=rev Author: paramaniac Date: 2010-09-16 15:48:20 +0000 (Thu, 16 Sep 2010) Log Message: ----------- control: small stuff Modified Paths: -------------- trunk/octave-forge/main/control/inst/@lti/mtimes.m trunk/octave-forge/main/control/inst/__ss_dim__.m Modified: trunk/octave-forge/main/control/inst/@lti/mtimes.m =================================================================== --- trunk/octave-forge/main/control/inst/@lti/mtimes.m 2010-09-16 01:40:08 UTC (rev 7737) +++ trunk/octave-forge/main/control/inst/@lti/mtimes.m 2010-09-16 15:48:20 UTC (rev 7738) @@ -51,3 +51,20 @@ endfunction +## Alternative code: consistency vs. compatibility +#{ + M11 = zeros (m1, p1); + M12 = zeros (m1, p2); + M21 = eye (m2, p1); + M22 = zeros (m2, p2); + + + M = [M11, M12; + M21, M22]; + + out_idx = p1 + (1 : p2); + in_idx = 1 : m1; + + sys = __sys_group__ (sys1, sys2); +#} +## Don't forget to adapt @tf/__sys_connect__.m draft code \ No newline at end of file Modified: trunk/octave-forge/main/control/inst/__ss_dim__.m =================================================================== --- trunk/octave-forge/main/control/inst/__ss_dim__.m 2010-09-16 01:40:08 UTC (rev 7737) +++ trunk/octave-forge/main/control/inst/__ss_dim__.m 2010-09-16 15:48:20 UTC (rev 7738) @@ -66,7 +66,7 @@ crows, ccols, drows, dcols); endif - if (! isempty (e) && any (size (e) != n)) + if (! isempty (e) && ! size_equal (e, a)) error ("ss: system matrices a(%dx%d) and e(%dx%d) are incompatible", arows, acols, rows (e), columns (e)); endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <par...@us...> - 2010-09-17 12:06:34
|
Revision: 7741 http://octave.svn.sourceforge.net/octave/?rev=7741&view=rev Author: paramaniac Date: 2010-09-17 12:06:28 +0000 (Fri, 17 Sep 2010) Log Message: ----------- control: simplify argument checks Modified Paths: -------------- trunk/octave-forge/main/control/inst/__frequency_response__.m trunk/octave-forge/main/control/inst/__time_response__.m trunk/octave-forge/main/control/inst/care.m trunk/octave-forge/main/control/inst/dare.m trunk/octave-forge/main/control/inst/h2syn.m trunk/octave-forge/main/control/inst/hinfsyn.m Modified: trunk/octave-forge/main/control/inst/__frequency_response__.m =================================================================== --- trunk/octave-forge/main/control/inst/__frequency_response__.m 2010-09-16 22:40:46 UTC (rev 7740) +++ trunk/octave-forge/main/control/inst/__frequency_response__.m 2010-09-17 12:06:28 UTC (rev 7741) @@ -1,4 +1,4 @@ -## Copyright (C) 2009 Lukas F. Reichlin +## Copyright (C) 2009 - 2010 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## @@ -21,7 +21,7 @@ ## Author: Lukas Reichlin <luk...@gm...> ## Created: November 2009 -## Version: 0.1 +## Version: 0.2 function [H, w] = __frequency_response__ (sys, w = [], mimoflag = 0, resptype = 0, wbounds = "std") @@ -30,10 +30,6 @@ error ("frequency_response: first argument sys must be an LTI system"); endif - if (! is_real_vector (w)) - error ("frequency_response: second argument w must be a vector of frequencies"); - endif - if (! mimoflag && ! issiso (sys)) error ("frequency_response: require SISO system"); endif @@ -42,8 +38,9 @@ if (isempty (w)) ## begin plot at 10^dec_min, end plot at 10^dec_max [rad/s] [dec_min, dec_max] = __frequency_range__ (sys, wbounds); - w = logspace (dec_min, dec_max, 500); # [rad/s] + elseif (! is_real_vector (w)) + error ("frequency_response: second argument w must be a vector of frequencies"); endif ## frequency response Modified: trunk/octave-forge/main/control/inst/__time_response__.m =================================================================== --- trunk/octave-forge/main/control/inst/__time_response__.m 2010-09-16 22:40:46 UTC (rev 7740) +++ trunk/octave-forge/main/control/inst/__time_response__.m 2010-09-17 12:06:28 UTC (rev 7741) @@ -28,7 +28,7 @@ sys = ss (sys); # sys must be proper endif - if (! isempty (tfinal) && ! is_real_scalar (tfinal)) # time vector t passed + if (! is_real_scalar (tfinal)) # time vector t passed dt = tfinal(2) - tfinal(1); # assume that t is regularly spaced tfinal = tfinal(end); endif Modified: trunk/octave-forge/main/control/inst/care.m =================================================================== --- trunk/octave-forge/main/control/inst/care.m 2010-09-16 22:40:46 UTC (rev 7740) +++ trunk/octave-forge/main/control/inst/care.m 2010-09-17 12:06:28 UTC (rev 7741) @@ -93,7 +93,7 @@ error ("care: (b, r) not conformable"); endif - if (! isempty (s) && (! is_real_matrix (s) || ! size_equal (s, b))) + if (! is_real_matrix (s) && ! size_equal (s, b)) error ("care: s(%dx%d) must be real and identically dimensioned with b(%dx%d)", rows (s), columns (s), rows (b), columns (b)); endif Modified: trunk/octave-forge/main/control/inst/dare.m =================================================================== --- trunk/octave-forge/main/control/inst/dare.m 2010-09-16 22:40:46 UTC (rev 7740) +++ trunk/octave-forge/main/control/inst/dare.m 2010-09-17 12:06:28 UTC (rev 7741) @@ -93,7 +93,7 @@ error ("dare: b and r must have the same number of columns"); endif - if (! isempty (s) && (! is_real_matrix (s) || ! size_equal (s, b))) + if (! is_real_matrix (s) && ! size_equal (s, b)) error ("dare: s(%dx%d) must be real and identically dimensioned with b(%dx%d)", rows (s), columns (s), rows (b), columns (b)); endif Modified: trunk/octave-forge/main/control/inst/h2syn.m =================================================================== --- trunk/octave-forge/main/control/inst/h2syn.m 2010-09-16 22:40:46 UTC (rev 7740) +++ trunk/octave-forge/main/control/inst/h2syn.m 2010-09-17 12:06:28 UTC (rev 7741) @@ -84,11 +84,11 @@ error ("h2syn: first argument must be an LTI system"); endif - if (! is_real_scalar (nmeas) || isempty (nmeas)) + if (! is_real_scalar (nmeas)) error ("h2syn: second argument invalid"); endif - if (! is_real_scalar (ncon) || isempty (ncon)) + if (! is_real_scalar (ncon)) error ("h2syn: third argument invalid"); endif Modified: trunk/octave-forge/main/control/inst/hinfsyn.m =================================================================== --- trunk/octave-forge/main/control/inst/hinfsyn.m 2010-09-16 22:40:46 UTC (rev 7740) +++ trunk/octave-forge/main/control/inst/hinfsyn.m 2010-09-17 12:06:28 UTC (rev 7741) @@ -90,15 +90,15 @@ error ("hinfsyn: first argument must be an LTI system"); endif - if (! is_real_scalar (nmeas) || isempty (nmeas)) + if (! is_real_scalar (nmeas)) error ("hinfsyn: second argument invalid"); endif - if (! is_real_scalar (ncon) || isempty (ncon)) + if (! is_real_scalar (ncon)) error ("hinfsyn: third argument invalid"); endif - if (! is_real_scalar (gmax) || isempty (gmax) || gmax < 0) + if (! is_real_scalar (gmax) || gmax < 0) error ("hinfsyn: fourth argument invalid"); endif This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |