From: <par...@us...> - 2011-11-26 15:59:03
|
Revision: 9198 http://octave.svn.sourceforge.net/octave/?rev=9198&view=rev Author: paramaniac Date: 2011-11-26 15:58:55 +0000 (Sat, 26 Nov 2011) Log Message: ----------- control: move tests from ltimodels to the files of individual LTI methods Modified Paths: -------------- trunk/octave-forge/main/control/inst/@lti/c2d.m trunk/octave-forge/main/control/inst/@lti/d2c.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/minreal.m trunk/octave-forge/main/control/inst/@lti/mtimes.m trunk/octave-forge/main/control/inst/@lti/norm.m trunk/octave-forge/main/control/inst/@lti/plus.m trunk/octave-forge/main/control/inst/@lti/prescale.m trunk/octave-forge/main/control/inst/@lti/sminreal.m trunk/octave-forge/main/control/inst/@lti/zero.m trunk/octave-forge/main/control/inst/ltimodels.m trunk/octave-forge/main/control/inst/test_control.m Modified: trunk/octave-forge/main/control/inst/@lti/c2d.m =================================================================== --- trunk/octave-forge/main/control/inst/@lti/c2d.m 2011-11-26 12:24:32 UTC (rev 9197) +++ trunk/octave-forge/main/control/inst/@lti/c2d.m 2011-11-26 15:58:55 UTC (rev 9198) @@ -49,7 +49,7 @@ ## Author: Lukas Reichlin <luk...@gm...> ## Created: October 2009 -## Version: 0.2 +## Version: 0.3 function sys = c2d (sys, tsam, method = "std", w0 = 0) @@ -81,3 +81,142 @@ sys.tsam = tsam; endfunction + + +## bilinear transformation +## using oct-file directly +%!shared Mo, Me +%! A = [ 1.0 0.5 +%! 0.5 1.0 ].'; +%! +%! B = [ 0.0 -1.0 +%! 1.0 0.0 ].'; +%! +%! C = [ -1.0 0.0 +%! 0.0 1.0 ].'; +%! +%! D = [ 1.0 0.0 +%! 0.0 -1.0 ].'; +%! +%! [Ao, Bo, Co, Do] = slab04md (A, B, C, D, 1.0, 1.0, false); +%! +%! Ae = [ -1.0000 -4.0000 +%! -4.0000 -1.0000 ]; +%! +%! Be = [ 2.8284 0.0000 +%! 0.0000 -2.8284 ]; +%! +%! Ce = [ 0.0000 2.8284 +%! -2.8284 0.0000 ]; +%! +%! De = [ -1.0000 0.0000 +%! 0.0000 -3.0000 ]; +%! +%! Mo = [Ao, Bo; Co, Do]; +%! Me = [Ae, Be; Ce, De]; +%! +%!assert (Mo, Me, 1e-4); + + +## bilinear transformation +## user function +%!shared Mo, Me +%! A = [ 1.0 0.5 +%! 0.5 1.0 ].'; +%! +%! B = [ 0.0 -1.0 +%! 1.0 0.0 ].'; +%! +%! C = [ -1.0 0.0 +%! 0.0 1.0 ].'; +%! +%! D = [ 1.0 0.0 +%! 0.0 -1.0 ].'; +%! +%! [Ao, Bo, Co, Do] = ssdata (c2d (ss (A, B, C, D), 2, "tustin")); +%! +%! Ae = [ -1.0000 -4.0000 +%! -4.0000 -1.0000 ]; +%! +%! Be = [ 2.8284 0.0000 +%! 0.0000 -2.8284 ]; +%! +%! Ce = [ 0.0000 2.8284 +%! -2.8284 0.0000 ]; +%! +%! De = [ -1.0000 0.0000 +%! 0.0000 -3.0000 ]; +%! +%! Mo = [Ao, Bo; Co, Do]; +%! Me = [Ae, Be; Ce, De]; +%! +%!assert (Mo, Me, 1e-4); + + +## bilinear transformation +## both directions +%!shared Mo, Me +%! A = [ 1.0 0.5 +%! 0.5 1.0 ]; +%! +%! B = [ 0.0 -1.0 +%! 1.0 0.0 ]; +%! +%! C = [ -1.0 0.0 +%! 0.0 1.0 ]; +%! +%! D = [ 1.0 0.0 +%! 0.0 -1.0 ]; +%! +%! [Ao, Bo, Co, Do] = ssdata (d2c (c2d (ss (A, B, C, D), 2, "tustin"), "tustin")); +%! +%! Mo = [Ao, Bo; Co, Do]; +%! Me = [A, B; C, D]; +%! +%!assert (Mo, Me, 1e-4); + + +## zero-order hold +## both directions +%!shared Mo, Me +%! A = [ 1.0 0.5 +%! 0.5 1.0 ]; +%! +%! B = [ 0.0 -1.0 +%! 1.0 0.0 ]; +%! +%! C = [ -1.0 0.0 +%! 0.0 1.0 ]; +%! +%! D = [ 1.0 0.0 +%! 0.0 -1.0 ]; +%! +%! [Ao, Bo, Co, Do] = ssdata (d2c (c2d (ss (A, B, C, D), 2, "zoh"), "zoh")); +%! +%! Mo = [Ao, Bo; Co, Do]; +%! Me = [A, B; C, D]; +%! +%!assert (Mo, Me, 1e-4); + + +## bilinear transformation with pre-warping +## both directions +%!shared Mo, Me +%! A = [ 1.0 0.5 +%! 0.5 1.0 ]; +%! +%! B = [ 0.0 -1.0 +%! 1.0 0.0 ]; +%! +%! C = [ -1.0 0.0 +%! 0.0 1.0 ]; +%! +%! D = [ 1.0 0.0 +%! 0.0 -1.0 ]; +%! +%! [Ao, Bo, Co, Do] = ssdata (d2c (c2d (ss (A, B, C, D), 2, "prewarp", 1000), "prewarp", 1000)); +%! +%! Mo = [Ao, Bo; Co, Do]; +%! Me = [A, B; C, D]; +%! +%!assert (Mo, Me, 1e-4); Modified: trunk/octave-forge/main/control/inst/@lti/d2c.m =================================================================== --- trunk/octave-forge/main/control/inst/@lti/d2c.m 2011-11-26 12:24:32 UTC (rev 9197) +++ trunk/octave-forge/main/control/inst/@lti/d2c.m 2011-11-26 15:58:55 UTC (rev 9198) @@ -47,7 +47,7 @@ ## Author: Lukas Reichlin <luk...@gm...> ## Created: September 2011 -## Version: 0.1 +## Version: 0.2 function sys = d2c (sys, method = "std", w0 = 0) @@ -75,3 +75,72 @@ sys.tsam = 0; endfunction + + +## bilinear transformation +## both directions +%!shared Mo, Me +%! A = [ 1.0 0.5 +%! 0.5 1.0 ]; +%! +%! B = [ 0.0 -1.0 +%! 1.0 0.0 ]; +%! +%! C = [ -1.0 0.0 +%! 0.0 1.0 ]; +%! +%! D = [ 1.0 0.0 +%! 0.0 -1.0 ]; +%! +%! [Ao, Bo, Co, Do] = ssdata (d2c (c2d (ss (A, B, C, D), 2, "tustin"), "tustin")); +%! +%! Mo = [Ao, Bo; Co, Do]; +%! Me = [A, B; C, D]; +%! +%!assert (Mo, Me, 1e-4); + + +## zero-order hold +## both directions +%!shared Mo, Me +%! A = [ 1.0 0.5 +%! 0.5 1.0 ]; +%! +%! B = [ 0.0 -1.0 +%! 1.0 0.0 ]; +%! +%! C = [ -1.0 0.0 +%! 0.0 1.0 ]; +%! +%! D = [ 1.0 0.0 +%! 0.0 -1.0 ]; +%! +%! [Ao, Bo, Co, Do] = ssdata (d2c (c2d (ss (A, B, C, D), 2, "zoh"), "zoh")); +%! +%! Mo = [Ao, Bo; Co, Do]; +%! Me = [A, B; C, D]; +%! +%!assert (Mo, Me, 1e-4); + + +## bilinear transformation with pre-warping +## both directions +%!shared Mo, Me +%! A = [ 1.0 0.5 +%! 0.5 1.0 ]; +%! +%! B = [ 0.0 -1.0 +%! 1.0 0.0 ]; +%! +%! C = [ -1.0 0.0 +%! 0.0 1.0 ]; +%! +%! D = [ 1.0 0.0 +%! 0.0 -1.0 ]; +%! +%! [Ao, Bo, Co, Do] = ssdata (d2c (c2d (ss (A, B, C, D), 2, "prewarp", 1000), "prewarp", 1000)); +%! +%! Mo = [Ao, Bo; Co, Do]; +%! Me = [A, B; C, D]; +%! +%!assert (Mo, Me, 1e-4); Modified: trunk/octave-forge/main/control/inst/@lti/feedback.m =================================================================== --- trunk/octave-forge/main/control/inst/@lti/feedback.m 2011-11-26 12:24:32 UTC (rev 9197) +++ trunk/octave-forge/main/control/inst/@lti/feedback.m 2011-11-26 15:58:55 UTC (rev 9198) @@ -67,7 +67,7 @@ ## Author: Lukas Reichlin <luk...@gm...> ## Created: October 2009 -## Version: 0.4 +## Version: 0.5 function sys = feedback (sys1, sys2, feedin, feedout, fbsign = -1) @@ -182,3 +182,82 @@ endif endfunction + + +## 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); + + +## sensitivity function +## Note the correct physical meaning of the states. +## Test would fail on a commercial octave clone +## because of wrong signs of matrices B and C. +## NOTE: Don't use T = I - S for complementary sensitivity, +## use T = feedback (L) instead! +%!shared S1, S2 +%! P = ss (-2, 3, 4, 5); # meaningless numbers +%! C = ss (-1, 1, 1, 0); # ditto +%! L = P * C; +%! I = eye (size (L)); +%! S1 = feedback (I, L*-I, "+"); # draw a block diagram for better understanding +%! S2 = inv (I + L); +%!assert (S1.a, S2.a, 1e-4); +%!assert (S1.b, S2.b, 1e-4); +%!assert (S1.c, S2.c, 1e-4); +%!assert (S1.d, S2.d, 1e-4); Modified: trunk/octave-forge/main/control/inst/@lti/horzcat.m =================================================================== --- trunk/octave-forge/main/control/inst/@lti/horzcat.m 2011-11-26 12:24:32 UTC (rev 9197) +++ trunk/octave-forge/main/control/inst/@lti/horzcat.m 2011-11-26 15:58:55 UTC (rev 9198) @@ -1,4 +1,4 @@ -## Copyright (C) 2009 Lukas F. Reichlin +## Copyright (C) 2009, 2011 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## @@ -21,7 +21,7 @@ ## Author: Lukas Reichlin <luk...@gm...> ## Created: September 2009 -## Version: 0.1 +## Version: 0.2 function sys = horzcat (sys, varargin) @@ -47,3 +47,63 @@ endfor endfunction + + +## 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); Modified: trunk/octave-forge/main/control/inst/@lti/inv.m =================================================================== --- trunk/octave-forge/main/control/inst/@lti/inv.m 2011-11-26 12:24:32 UTC (rev 9197) +++ trunk/octave-forge/main/control/inst/@lti/inv.m 2011-11-26 15:58:55 UTC (rev 9198) @@ -1,4 +1,4 @@ -## Copyright (C) 2009 Lukas F. Reichlin +## Copyright (C) 2009, 2011 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 retsys = inv (sys) @@ -38,4 +38,47 @@ ## TODO: handle i/o names -endfunction \ No newline at end of file +endfunction + + +## inverse of state-space models +## test from SLICOT AB07ND +## 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 +%! 0.0 0.0 1.0 ]; +%! +%! B = [ 1.0 0.0 +%! 0.0 1.0 +%! 1.0 0.0 ]; +%! +%! C = [ 0.0 1.0 -1.0 +%! 0.0 0.0 1.0 ]; +%! +%! D = [ 4.0 0.0 +%! 0.0 1.0 ]; +%! +%! sys = ss (A, B, C, D); +%! sysinv = inv (sys); +%! [Ai, Bi, Ci, Di] = ssdata (sysinv); +%! M = [Ai, Bi; Ci, Di]; +%! +%! Ae = [ 1.0000 1.7500 0.2500 +%! 4.0000 -1.0000 -1.0000 +%! 0.0000 -0.2500 1.2500 ]; +%! +%! Be = [-0.2500 0.0000 +%! 0.0000 -1.0000 +%! -0.2500 0.0000 ]; +%! +%! Ce = [ 0.0000 0.2500 -0.2500 +%! 0.0000 0.0000 1.0000 ]; +%! +%! De = [ 0.2500 0.0000 +%! 0.0000 1.0000 ]; +%! +%! Me = [Ae, Be; Ce, De]; # Me = [Ae, -Be; -Ce, De]; +%! +%!assert (M, Me, 1e-4); Modified: trunk/octave-forge/main/control/inst/@lti/minreal.m =================================================================== --- trunk/octave-forge/main/control/inst/@lti/minreal.m 2011-11-26 12:24:32 UTC (rev 9197) +++ trunk/octave-forge/main/control/inst/@lti/minreal.m 2011-11-26 15:58:55 UTC (rev 9198) @@ -1,4 +1,4 @@ -## Copyright (C) 2009, 2010 Lukas F. Reichlin +## Copyright (C) 2009, 2010, 2011 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## @@ -23,7 +23,7 @@ ## Author: Lukas Reichlin <luk...@gm...> ## Created: October 2009 -## Version: 0.2 +## Version: 0.3 function sys = minreal (sys, tol = "def") @@ -37,4 +37,149 @@ sys = __minreal__ (sys, tol); -endfunction \ No newline at end of file +endfunction + + +## ss: minreal (SLICOT TB01PD) +%!shared C, D +%! +%! A = ss (-2, 3, 4, 5); +%! B = A / A; +%! C = minreal (B, 1e-15); +%! D = ss (1); +%! +%!assert (C.a, D.a); +%!assert (C.b, D.b); +%!assert (C.c, D.c); +%!assert (C.d, D.d); + +%!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, "scaled", true); +%! 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); + + +## dss: minreal (SLICOT TG01JD) +## FIXME: Test fails with larger ldwork in sltg01jd.cc +#%!shared Ar, Br, Cr, Dr, Er, Ae, Be, Ce, De, Ee +#%! A = [ -2 -3 0 0 0 0 0 0 0 +#%! 1 0 0 0 0 0 0 0 0 +#%! 0 0 -2 -3 0 0 0 0 0 +#%! 0 0 1 0 0 0 0 0 0 +#%! 0 0 0 0 1 0 0 0 0 +#%! 0 0 0 0 0 1 0 0 0 +#%! 0 0 0 0 0 0 1 0 0 +#%! 0 0 0 0 0 0 0 1 0 +#%! 0 0 0 0 0 0 0 0 1 ]; +#%! +#%! E = [ 1 0 0 0 0 0 0 0 0 +#%! 0 1 0 0 0 0 0 0 0 +#%! 0 0 1 0 0 0 0 0 0 +#%! 0 0 0 1 0 0 0 0 0 +#%! 0 0 0 0 0 0 0 0 0 +#%! 0 0 0 0 1 0 0 0 0 +#%! 0 0 0 0 0 0 0 0 0 +#%! 0 0 0 0 0 0 1 0 0 +#%! 0 0 0 0 0 0 0 1 0 ]; +#%! +#%! B = [ 1 0 +#%! 0 0 +#%! 0 1 +#%! 0 0 +#%! -1 0 +#%! 0 0 +#%! 0 -1 +#%! 0 0 +#%! 0 0 ]; +#%! +#%! C = [ 1 0 1 -3 0 1 0 2 0 +#%! 0 1 1 3 0 1 0 0 1 ]; +#%! +#%! D = zeros (2, 2); +#%! +#%! sys = dss (A, B, C, D, E, "scaled", true); +#%! sysmin = minreal (sys, 0.0); +#%! [Ar, Br, Cr, Dr, Er] = dssdata (sysmin); +#%! +#%! Ae = [ 1.0000 -0.0393 -0.0980 -0.1066 0.0781 -0.2330 0.0777 +#%! 0.0000 1.0312 0.2717 0.2609 -0.1533 0.6758 -0.3553 +#%! 0.0000 0.0000 1.3887 0.6699 -0.4281 1.6389 -0.7615 +#%! 0.0000 0.0000 0.0000 -1.2147 0.2423 -0.9792 0.4788 +#%! 0.0000 0.0000 0.0000 0.0000 -1.0545 0.5035 -0.2788 +#%! 0.0000 0.0000 0.0000 0.0000 0.0000 1.6355 -0.4323 +#%! 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 1.0000 ]; +#%! +#%! Ee = [ 0.4100 0.2590 0.5080 -0.3109 0.0705 0.1429 -0.1477 +#%! -0.7629 -0.3464 0.0992 -0.3007 0.0619 0.2483 -0.0152 +#%! 0.1120 -0.2124 -0.4184 -0.1288 0.0569 -0.4213 -0.6182 +#%! 0.0000 0.1122 -0.0039 0.2771 -0.0758 0.0975 0.3923 +#%! 0.0000 0.0000 0.3708 -0.4290 0.1006 0.1402 -0.2699 +#%! 0.0000 0.0000 0.0000 0.0000 0.9458 -0.2211 0.2378 +#%! 0.0000 0.0000 0.0000 0.5711 0.2648 0.5948 -0.5000 ]; +#%! +#%! Be = [ -0.5597 0.2363 +#%! -0.4843 -0.0498 +#%! -0.4727 -0.1491 +#%! 0.1802 1.1574 +#%! 0.5995 0.1556 +#%! -0.1729 -0.3999 +#%! 0.0000 0.2500 ]; +#%! +#%! Ce = [ 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 4.0000 +#%! 0.0000 0.0000 0.0000 0.0000 0.0000 3.1524 -1.7500 ]; +#%! +#%! De = zeros (2, 2); +#%! +#%!assert (Ar, Ae, 1e-4); +#%!assert (Br, Be, 1e-4); +#%!assert (Cr, Ce, 1e-4); +#%!assert (Dr, De, 1e-4); +#%!assert (Er, Ee, 1e-4); + + +## 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); Modified: trunk/octave-forge/main/control/inst/@lti/mtimes.m =================================================================== --- trunk/octave-forge/main/control/inst/@lti/mtimes.m 2011-11-26 12:24:32 UTC (rev 9197) +++ trunk/octave-forge/main/control/inst/@lti/mtimes.m 2011-11-26 15:58:55 UTC (rev 9198) @@ -1,4 +1,4 @@ -## Copyright (C) 2009 Lukas F. Reichlin +## Copyright (C) 2009, 2011 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## @@ -21,7 +21,7 @@ ## Author: Lukas Reichlin <luk...@gm...> ## Created: September 2009 -## Version: 0.1 +## Version: 0.2 function sys = mtimes (sys2, sys1) @@ -72,3 +72,83 @@ sys = __sys_group__ (sys1, sys2); #} ## Don't forget to adapt @tf/__sys_connect__.m draft code + + +## 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) + + +## 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 +#%! 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 = 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); Modified: trunk/octave-forge/main/control/inst/@lti/norm.m =================================================================== --- trunk/octave-forge/main/control/inst/@lti/norm.m 2011-11-26 12:24:32 UTC (rev 9197) +++ trunk/octave-forge/main/control/inst/@lti/norm.m 2011-11-26 15:58:55 UTC (rev 9198) @@ -28,7 +28,7 @@ ## Author: Lukas Reichlin <luk...@gm...> ## Created: November 2009 -## Version: 0.4.1 +## Version: 0.5 function [gain, varargout] = norm (sys, ntype = "2", tol = 0.01) @@ -116,3 +116,29 @@ endif endfunction + + +## norm ct +%!shared H2, Hinf +%! sys = ss (-1, 1, 1, 0); +%! H2 = norm (sys, 2); +%! Hinf = norm (sys, inf); +%!assert (H2, 0.7071, 1.5e-5); +%!assert (Hinf, 1, 5e-4); + + +## norm dt +%!shared H2, Hinf +%! a = [ 2.417 -1.002 0.5488 +%! 2 0 0 +%! 0 0.5 0 ]; +%! b = [ 1 +%! 0 +%! 0 ]; +%! c = [-0.424 0.436 -0.4552 ]; +%! d = [ 1 ]; +%! sys = ss (a, b, c, d, 0.1); +%! H2 = norm (sys, 2); +%! Hinf = norm (sys, inf); +%!assert (H2, 1.2527, 1.5e-5); +%!assert (Hinf, 2.7, 0.1); Modified: trunk/octave-forge/main/control/inst/@lti/plus.m =================================================================== --- trunk/octave-forge/main/control/inst/@lti/plus.m 2011-11-26 12:24:32 UTC (rev 9197) +++ trunk/octave-forge/main/control/inst/@lti/plus.m 2011-11-26 15:58:55 UTC (rev 9198) @@ -1,4 +1,4 @@ -## Copyright (C) 2009 Lukas F. Reichlin +## Copyright (C) 2009, 2011 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 sys = plus (sys1, sys2) @@ -46,3 +46,63 @@ sys = out_scl * sys * in_scl; endfunction + + +## 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); Modified: trunk/octave-forge/main/control/inst/@lti/prescale.m =================================================================== --- trunk/octave-forge/main/control/inst/@lti/prescale.m 2011-11-26 12:24:32 UTC (rev 9197) +++ trunk/octave-forge/main/control/inst/@lti/prescale.m 2011-11-26 15:58:55 UTC (rev 9198) @@ -59,7 +59,7 @@ ## Author: Lukas Reichlin <luk...@gm...> ## Created: June 2011 -## Version: 0.1 +## Version: 0.2 function [retsys, varargout] = prescale (sys) @@ -79,3 +79,219 @@ endif endfunction + + +## Scaling of state-space models, direct access to TB01ID +%!shared Ao, Bo, Co, SCALEo, MAXREDo, Ae, Be, Ce, SCALEe, MAXREDe +%! A = [ 0.0 1.0000e+000 0.0 0.0 0.0 +%! -1.5800e+006 -1.2570e+003 0.0 0.0 0.0 +%! 3.5410e+014 0.0 -1.4340e+003 0.0 -5.3300e+011 +%! 0.0 0.0 0.0 0.0 1.0000e+000 +%! 0.0 0.0 0.0 -1.8630e+004 -1.4820e+000 ]; +%! +%! B = [ 0.0 0.0 +%! 1.1030e+002 0.0 +%! 0.0 0.0 +%! 0.0 0.0 +%! 0.0 8.3330e-003 ]; +%! +%! C = [ 1.0000e+000 0.0 0.0 0.0 0.0 +%! 0.0 0.0 1.0000e+000 0.0 0.0 +%! 0.0 0.0 0.0 1.0000e+000 0.0 +%! 6.6640e-001 0.0 -6.2000e-013 0.0 0.0 +%! 0.0 0.0 -1.0000e-003 1.8960e+006 1.5080e+002 ]; +%! +%! MAXRED = 0.0; +%! +%! [Ao, Bo, Co, MAXREDo, SCALEo] = sltb01id (A, B, C, MAXRED); +%! +%! Ae = [ 0.0000000D+00 0.1000000D+05 0.0000000D+00 0.0000000D+00 0.0000000D+00 +%! -0.1580000D+03 -0.1257000D+04 0.0000000D+00 0.0000000D+00 0.0000000D+00 +%! 0.3541000D+05 0.0000000D+00 -0.1434000D+04 0.0000000D+00 -0.5330000D+03 +%! 0.0000000D+00 0.0000000D+00 0.0000000D+00 0.0000000D+00 0.1000000D+03 +%! 0.0000000D+00 0.0000000D+00 0.0000000D+00 -0.1863000D+03 -0.1482000D+01 ]; +%! +%! Be = [ 0.0000000D+00 0.0000000D+00 +%! 0.1103000D+04 0.0000000D+00 +%! 0.0000000D+00 0.0000000D+00 +%! 0.0000000D+00 0.0000000D+00 +%! 0.0000000D+00 0.8333000D+02 ]; +%! +%! Ce = [ 0.1000000D-04 0.0000000D+00 0.0000000D+00 0.0000000D+00 0.0000000D+00 +%! 0.0000000D+00 0.0000000D+00 0.1000000D+06 0.0000000D+00 0.0000000D+00 +%! 0.0000000D+00 0.0000000D+00 0.0000000D+00 0.1000000D-05 0.0000000D+00 +%! 0.6664000D-05 0.0000000D+00 -0.6200000D-07 0.0000000D+00 0.0000000D+00 +%! 0.0000000D+00 0.0000000D+00 -0.1000000D+03 0.1896000D+01 0.1508000D-01 ]; +%! +%! SCALEe = [0.1000000D-04 0.1000000D+00 0.1000000D+06 0.1000000D-05 0.1000000D-03 ]; +%! +%! MAXREDe = 0.3488E+10; +%! +%!assert (Ao, Ae, 1e-4); +%!assert (Bo, Be, 1e-4); +%!assert (Co, Ce, 1e-4); +%!assert (MAXREDo, MAXREDe, 1e6); +%!assert (SCALEo, SCALEe.', 1e-4); + + +## Scaling of descriptor state-space models, direct access to TG01AD +%!shared Ao, Eo, Bo, Co, LSCALEo, RSCALEo, Ae, Ee, Be, Ce, LSCALEe, RSCALEe +%! A = [ -1 0 0 0.003 +%! 0 0 0.1000 0.02 +%! 100 10 0 0.4 +%! 0 0 0 0.0]; +%! +%! E = [ 1 0.2 0 0.0 +%! 0 1 0 0.01 +%! 300 90 6 0.3 +%! 0 0 20 0.0]; +%! +%! B = [ 10 0 +%! 0 0 +%! 0 1000 +%! 10000 10000]; +%! +%! C = [ -0.1 0.0 0.001 0.0 +%! 0.0 0.01 -0.001 0.0001]; +%! +%! TRESH = 0.0; +%! +%! [Ao, Eo, Bo, Co, LSCALEo, RSCALEo] = sltg01ad (A, E, B, C, TRESH); +%! +%! Ae = [ -1.0000 0.0000 0.0000 0.3000 +%! 0.0000 0.0000 1.0000 2.0000 +%! 1.0000 0.1000 0.0000 0.4000 +%! 0.0000 0.0000 0.0000 0.0000]; +%! +%! Ee = [ 1.0000 0.2000 0.0000 0.0000 +%! 0.0000 1.0000 0.0000 1.0000 +%! 3.0000 0.9000 0.6000 0.3000 +%! 0.0000 0.0000 0.2000 0.0000 ]; +%! +%! Be = [100.0000 0.0000 +%! 0.0000 0.0000 +%! 0.0000 100.0000 +%! 100.0000 100.0000 ]; +%! +%! Ce = [ -0.0100 0.0000 0.0010 0.0000 +%! 0.0000 0.0010 -0.0010 0.0010]; +%! +%! LSCALEe = [ 10.0000 10.0000 0.1000 0.0100 ]; +%! +%! RSCALEe = [ 0.1000 0.1000 1.0000 10.0000 ]; +%! +%!assert (Ao, Ae, 1e-4); +%!assert (Eo, Ee, 1e-4); +%!assert (Bo, Be, 1e-4); +%!assert (Co, Ce, 1e-4); +%!assert (LSCALEo, LSCALEe.', 1e-4); +%!assert (RSCALEo, RSCALEe.', 1e-4); + + +## Scaling of state-space models, user function +%!shared Ao, Bo, Co, INFOo, Ae, Be, Ce, SCALEe +%! A = [ 0.0 1.0000e+000 0.0 0.0 0.0 +%! -1.5800e+006 -1.2570e+003 0.0 0.0 0.0 +%! 3.5410e+014 0.0 -1.4340e+003 0.0 -5.3300e+011 +%! 0.0 0.0 0.0 0.0 1.0000e+000 +%! 0.0 0.0 0.0 -1.8630e+004 -1.4820e+000 ]; +%! +%! B = [ 0.0 0.0 +%! 1.1030e+002 0.0 +%! 0.0 0.0 +%! 0.0 0.0 +%! 0.0 8.3330e-003 ]; +%! +%! C = [ 1.0000e+000 0.0 0.0 0.0 0.0 +%! 0.0 0.0 1.0000e+000 0.0 0.0 +%! 0.0 0.0 0.0 1.0000e+000 0.0 +%! 6.6640e-001 0.0 -6.2000e-013 0.0 0.0 +%! 0.0 0.0 -1.0000e-003 1.8960e+006 1.5080e+002 ]; +%! +%! SYS = ss (A, B, C); +%! +%! [SYSo, INFOo] = prescale (SYS); +%! +%! [Ao, Bo, Co] = ssdata (SYSo); +%! +%! Ae = [ 0.0000000D+00 0.1000000D+05 0.0000000D+00 0.0000000D+00 0.0000000D+00 +%! -0.1580000D+03 -0.1257000D+04 0.0000000D+00 0.0000000D+00 0.0000000D+00 +%! 0.3541000D+05 0.0000000D+00 -0.1434000D+04 0.0000000D+00 -0.5330000D+03 +%! 0.0000000D+00 0.0000000D+00 0.0000000D+00 0.0000000D+00 0.1000000D+03 +%! 0.0000000D+00 0.0000000D+00 0.0000000D+00 -0.1863000D+03 -0.1482000D+01 ]; +%! +%! Be = [ 0.0000000D+00 0.0000000D+00 +%! 0.1103000D+04 0.0000000D+00 +%! 0.0000000D+00 0.0000000D+00 +%! 0.0000000D+00 0.0000000D+00 +%! 0.0000000D+00 0.8333000D+02 ]; +%! +%! Ce = [ 0.1000000D-04 0.0000000D+00 0.0000000D+00 0.0000000D+00 0.0000000D+00 +%! 0.0000000D+00 0.0000000D+00 0.1000000D+06 0.0000000D+00 0.0000000D+00 +%! 0.0000000D+00 0.0000000D+00 0.0000000D+00 0.1000000D-05 0.0000000D+00 +%! 0.6664000D-05 0.0000000D+00 -0.6200000D-07 0.0000000D+00 0.0000000D+00 +%! 0.0000000D+00 0.0000000D+00 -0.1000000D+03 0.1896000D+01 0.1508000D-01 ]; +%! +%! SCALEe = [0.1000000D-04 0.1000000D+00 0.1000000D+06 0.1000000D-05 0.1000000D-03 ]; +%! +%!assert (Ao, Ae, 1e-4); +%!assert (Bo, Be, 1e-4); +%!assert (Co, Ce, 1e-4); +%!assert (INFOo.SL.^-1, SCALEe.', 1e-4); +%!assert (INFOo.SR, SCALEe.', 1e-4); + + +## Scaling of descriptor state-space models, user function +%!shared Ao, Eo, Bo, Co, INFOo, Ae, Ee, Be, Ce, LSCALEe, RSCALEe +%! A = [ -1 0 0 0.003 +%! 0 0 0.1000 0.02 +%! 100 10 0 0.4 +%! 0 0 0 0.0]; +%! +%! E = [ 1 0.2 0 0.0 +%! 0 1 0 0.01 +%! 300 90 6 0.3 +%! 0 0 20 0.0]; +%! +%! B = [ 10 0 +%! 0 0 +%! 0 1000 +%! 10000 10000]; +%! +%! C = [ -0.1 0.0 0.001 0.0 +%! 0.0 0.01 -0.001 0.0001]; +%! +%! SYS = dss (A, B, C, [], E); +%! +%! [SYSo, INFOo] = prescale (SYS); +%! +%! [Ao, Bo, Co, ~, Eo] = dssdata (SYSo); +%! +%! Ae = [ -1.0000 0.0000 0.0000 0.3000 +%! 0.0000 0.0000 1.0000 2.0000 +%! 1.0000 0.1000 0.0000 0.4000 +%! 0.0000 0.0000 0.0000 0.0000]; +%! +%! Ee = [ 1.0000 0.2000 0.0000 0.0000 +%! 0.0000 1.0000 0.0000 1.0000 +%! 3.0000 0.9000 0.6000 0.3000 +%! 0.0000 0.0000 0.2000 0.0000 ]; +%! +%! Be = [100.0000 0.0000 +%! 0.0000 0.0000 +%! 0.0000 100.0000 +%! 100.0000 100.0000 ]; +%! +%! Ce = [ -0.0100 0.0000 0.0010 0.0000 +%! 0.0000 0.0010 -0.0010 0.0010]; +%! +%! LSCALEe = [ 10.0000 10.0000 0.1000 0.0100 ]; +%! +%! RSCALEe = [ 0.1000 0.1000 1.0000 10.0000 ]; +%! +%!assert (Ao, Ae, 1e-4); +%!assert (Eo, Ee, 1e-4); +%!assert (Bo, Be, 1e-4); +%!assert (Co, Ce, 1e-4); +%!assert (INFOo.SL, LSCALEe.', 1e-4); +%!assert (INFOo.SR, RSCALEe.', 1e-4); Modified: trunk/octave-forge/main/control/inst/@lti/sminreal.m =================================================================== --- trunk/octave-forge/main/control/inst/@lti/sminreal.m 2011-11-26 12:24:32 UTC (rev 9197) +++ trunk/octave-forge/main/control/inst/@lti/sminreal.m 2011-11-26 15:58:55 UTC (rev 9198) @@ -1,4 +1,4 @@ -## Copyright (C) 2009, 2010 Lukas F. Reichlin +## Copyright (C) 2009, 2010, 2011 Lukas F. Reichlin ## ## This file is part of LTI Syncope. ## @@ -43,7 +43,7 @@ ## Author: Lukas Reichlin <luk...@gm...> ## Created: October 2009 -## Version: 0.3 +## Version: 0.4 function sys = sminreal (sys, tol = 0) @@ -110,3 +110,33 @@ endwhile endfunction + + +## 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); Modified: trunk/octave-forge/main/control/inst/@lti/zero.m =================================================================== --- trunk/octave-forge/main/control/inst/@lti/zero.m 2011-11-26 12:24:32 UTC (rev 9197) +++ trunk/octave-forge/main/control/inst/@lti/zero.m 2011-11-26 15:58:55 UTC (rev 9198) @@ -37,7 +37,7 @@ ## Author: Lukas Reichlin <luk...@gm...> ## Created: October 2009 -## Version: 0.1.1 +## Version: 0.2 function [zer, gain] = zero (sys) @@ -48,3 +48,118 @@ [zer, gain] = __zero__ (sys, nargout); endfunction + + +## 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 +%! 1 -0.0057 -1.4 0 +%! 1 0 0 0 ]; +%! +%! B = [ -19.1 -3.1 +%! -0.0119 -0.0096 +%! -0.14 -0.72 +%! 0 0 ]; +%! +%! C = [ 0 0 -1 1 +%! 0 0 0.733 0 ]; +%! +%! D = [ 0 0 +%! 0.0768 0.1134 ]; +%! +%! sys = ss (A, B, C, D, "scaled", true); +%! z = sort (zero (sys)); +%! +%! z_exp = sort ([-13.2759; 12.5774; -0.0155]); +%! +%!assert (z, z_exp, 1e-4); + + +## transmission zeros of descriptor state-space models +%!shared z, z_exp +%! A = [ 1 0 0 0 0 0 0 0 0 +%! 0 1 0 0 0 0 0 0 0 +%! 0 0 1 0 0 0 0 0 0 +%! 0 0 0 1 0 0 0 0 0 +%! 0 0 0 0 1 0 0 0 0 +%! 0 0 0 0 0 1 0 0 0 +%! 0 0 0 0 0 0 1 0 0 +%! 0 0 0 0 0 0 0 1 0 +%! 0 0 0 0 0 0 0 0 1 ]; +%! +%! E = [ 0 0 0 0 0 0 0 0 0 +%! 1 0 0 0 0 0 0 0 0 +%! 0 1 0 0 0 0 0 0 0 +%! 0 0 0 0 0 0 0 0 0 +%! 0 0 0 1 0 0 0 0 0 +%! 0 0 0 0 1 0 0 0 0 +%! 0 0 0 0 0 0 0 0 0 +%! 0 0 0 0 0 0 1 0 0 +%! 0 0 0 0 0 0 0 1 0 ]; +%! +%! B = [ -1 0 0 +%! 0 0 0 +%! 0 0 0 +%! 0 -1 0 +%! 0 0 0 +%! 0 0 0 +%! 0 0 -1 +%! 0 0 0 +%! 0 0 0 ]; +%! +%! C = [ 0 1 1 0 3 4 0 0 2 +%! 0 1 0 0 4 0 0 2 0 +%! 0 0 1 0 -1 4 0 -2 2 ]; +%! +%! D = [ 1 2 -2 +%! 0 -1 -2 +%! 0 0 0 ]; +%! +%! sys = dss (A, B, C, D, E, "scaled", true); +%! z = zero (sys); +%! +%! z_exp = 1; +%! +%!assert (z, z_exp, 1e-4); + + +## Gain of descriptor state-space models +%!shared p, pi, z, zi, k, ki, p_tf, pi_tf, z_tf, zi_tf, k_tf, ki_tf +%! P = ss (-2, 3, 4, 5); +%! Pi = inv (P); +%! +%! p = pole (P); +%! [z, k] = zero (P); +%! +%! pi = pole (Pi); +%! [zi, ki] = zero (Pi); +%! +%! P_tf = tf (P); +%! Pi_tf = tf (Pi); +%! +%! p_tf = pole (P_tf); +%! [z_tf, k_tf] = zero (P_tf); +%! +%! pi_tf = pole (Pi_tf); +%! [zi_tf, ki_tf] = zero (Pi_tf); +%! +%!assert (p, zi, 1e-4); +%!assert (z, pi, 1e-4); +%!assert (k, inv (ki), 1e-4); +%!assert (p_tf, zi_tf, 1e-4); +%!assert (z_tf, pi_tf, 1e-4); +%!assert (k_tf, inv (ki_tf), 1e-4); Modified: trunk/octave-forge/main/control/inst/ltimodels.m =================================================================== --- trunk/octave-forge/main/control/inst/ltimodels.m 2011-11-26 12:24:32 UTC (rev 9197) +++ trunk/octave-forge/main/control/inst/ltimodels.m 2011-11-26 15:58:55 UTC (rev 9198) @@ -1,5 +1,5 @@ -## Copyright (C) 2009 Luca Favatella -## Copyright (C) 2009, 2010 Lukas Reichlin +## Copyright (C) 2009 Luca Favatella +## Copyright (C) 2009, 2010, 2011 Lukas Reichlin ## ## This file is part of LTI Syncope. ## @@ -110,380 +110,13 @@ ## 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); -%! H2 = norm (sys, 2); -%! Hinf = norm (sys, inf); -%!assert (H2, 0.7071, 1.5e-5); -%!assert (Hinf, 1, 5e-4); - -## norm dt -%!shared H2, Hinf -%! a = [ 2.417 -1.002 0.5488 -%! 2 0 0 -%! 0 0.5 0 ]; -%! b = [ 1 -%! 0 -%! 0 ]; -%! c = [-0.424 0.436 -0.4552 ]; -%! d = [ 1 ]; -%! sys = ss (a, b, c, d, 0.1); -%! H2 = norm (sys, 2); -%! Hinf = norm (sys, inf); -%!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 -%! 1 -0.0057 -1.4 0 -%! 1 0 0 0 ]; -%! -%! B = [ -19.1 -3.1 -%! -0.0119 -0.0096 -%! -0.14 -0.72 -%! 0 0 ]; -%! -%! C = [ 0 0 -1 1 -%! 0 0 0.733 0 ]; -%! -%! D = [ 0 0 -%! 0.0768 0.1134 ]; -%! -%! sys = ss (A, B, C, D, "scaled", true); -%! z = sort (zero (sys)); -%! -%! z_exp = sort ([-13.2759; 12.5774; -0.0155]); -%! -%!assert (z, z_exp, 1e-4); - - -## transmission zeros of descriptor state-space models -%!shared z, z_exp -%! A = [ 1 0 0 0 0 0 0 0 0 -%! 0 1 0 0 0 0 0 0 0 -%! 0 0 1 0 0 0 0 0 0 -%! 0 0 0 1 0 0 0 0 0 -%! 0 0 0 0 1 0 0 0 0 -%! 0 0 0 0 0 1 0 0 0 -%! 0 0 0 0 0 0 1 0 0 -%! 0 0 0 0 0 0 0 1 0 -%! 0 0 0 0 0 0 0 0 1 ]; -%! -%! E = [ 0 0 0 0 0 0 0 0 0 -%! 1 0 0 0 0 0 0 0 0 -%! 0 1 0 0 0 0 0 0 0 -%! 0 0 0 0 0 0 0 0 0 -%! 0 0 0 1 0 0 0 0 0 -%! 0 0 0 0 1 0 0 0 0 -%! 0 0 0 0 0 0 0 0 0 -%! 0 0 0 0 0 0 1 0 0 -%! 0 0 0 0 0 0 0 1 0 ]; -%! -%! B = [ -1 0 0 -%! 0 0 0 -%! 0 0 0 -%! 0 -1 0 -%! 0 0 0 -%! 0 0 0 -%! 0 0 -1 -%! 0 0 0 -%! 0 0 0 ]; -%! -%! C = [ 0 1 1 0 3 4 0 0 2 -%! 0 1 0 0 4 0 0 2 0 -%! 0 0 1 0 -1 4 0 -2 2 ]; -%! -%! D = [ 1 2 -2 -%! 0 -1 -2 -%! 0 0 0 ]; -%! -%! sys = dss (A, B, C, D, E, "scaled", true); -%! z = zero (sys); -%! -%! z_exp = 1; -%! -%!assert (z, z_exp, 1e-4); - - -## ss: minreal (SLICOT TB01PD) -%!shared C, D -%! -%! A = ss (-2, 3, 4, 5); -%! B = A / A; -%! C = minreal (B, 1e-15); -%! D = ss (1); -%! -%!assert (C.a, D.a); -%!assert (C.b, D.b); -%!assert (C.c, D.c); -%!assert (C.d, D.d); - -%!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, "scaled", true); -%! 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); - - -## dss: minreal (SLICOT TG01JD) -## FIXME: Test fails with larger ldwork in sltg01jd.cc -#%!shared Ar, Br, Cr, Dr, Er, Ae, Be, Ce, De, Ee -#%! A = [ -2 -3 0 0 0 0 0 0 0 -#%! 1 0 0 0 0 0 0 0 0 -#%! 0 0 -2 -3 0 0 0 0 0 -#%! 0 0 1 0 0 0 0 0 0 -#%! 0 0 0 0 1 0 0 0 0 -#%! 0 0 0 0 0 1 0 0 0 -#%! 0 0 0 0 0 0 1 0 0 -#%! 0 0 0 0 0 0 0 1 0 -#%! 0 0 0 0 0 0 0 0 1 ]; -#%! -#%! E = [ 1 0 0 0 0 0 0 0 0 -#%! 0 1 0 0 0 0 0 0 0 -#%! 0 0 1 0 0 0 0 0 0 -#%! 0 0 0 1 0 0 0 0 0 -#%! 0 0 0 0 0 0 0 0 0 -#%! 0 0 0 0 1 0 0 0 0 -#%! 0 0 0 0 0 0 0 0 0 -#%! 0 0 0 0 0 0 1 0 0 -#%! 0 0 0 0 0 0 0 1 0 ]; -#%! -#%! B = [ 1 0 -#%! 0 0 -#%! 0 1 -#%! 0 0 -#%! -1 0 -#%! 0 0 -#%! 0 -1 -#%! 0 0 -#%! 0 0 ]; -#%! -#%! C = [ 1 0 1 -3 0 1 0 2 0 -#%! 0 1 1 3 0 1 0 0 1 ]; -#%! -#%! D = zeros (2, 2); -#%! -#%! sys = dss (A, B, C, D, E, "scaled", true); -#%! sysmin = minreal (sys, 0.0); -#%! [Ar, Br, Cr, Dr, Er] = dssdata (sysmin); -#%! -#%! Ae = [ 1.0000 -0.0393 -0.0980 -0.1066 0.0781 -0.2330 0.0777 -#%! 0.0000 1.0312 0.2717 0.2609 -0.1533 0.6758 -0.3553 -#%! 0.0000 0.0000 1.3887 0.6699 -0.4281 1.6389 -0.7615 -#%! 0.0000 0.0000 0.0000 -1.2147 0.2423 -0.9792 0.4788 -#%! 0.0000 0.0000 0.0000 0.0000 -1.0545 0.5035 -0.2788 -#%! 0.0000 0.0000 0.0000 0.0000 0.0000 1.6355 -0.4323 -#%! 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 1.0000 ]; -#%! -#%! Ee = [ 0.4100 0.2590 0.5080 -0.3109 0.0705 0.1429 -0.1477 -#%! -0.7629 -0.3464 0.0992 -0.3007 0.0619 0.2483 -0.0152 -#%! 0.1120 -0.2124 -0.4184 -0.1288 0.0569 -0.4213 -0.6182 -#%! 0.0000 0.1122 -0.0039 0.2771 -0.0758 0.0975 0.3923 -#%! 0.0000 0.0000 0.3708 -0.4290 0.1006 0.1402 -0.2699 -#%! 0.0000 0.0000 0.0000 0.0000 0.9458 -0.2211 0.2378 -#%! 0.0000 0.0000 0.0000 0.5711 0.2648 0.5948 -0.5000 ]; -#%! -#%! Be = [ -0.5597 0.2363 -#%! -0.4843 -0.0498 -#%! -0.4727 -0.1491 -#%! 0.1802 1.1574 -#%! 0.5995 0.1556 -#%! -0.1729 -0.3999 -#%! 0.0000 0.2500 ]; -#%! -#%! Ce = [ 0.0000 0.0000 0.0000 0.0000 0.0000 0.0000 4.0000 -#%! 0.0000 0.0000 0.0000 0.0000 0.0000 3.1524 -1.7500 ]; -#%! -#%! De = zeros (2, 2); -#%! -#%!assert (Ar, Ae, 1e-4); -#%!assert (Br, Be, 1e-4); -#%!assert (Cr, Ce, 1e-4); -#%!assert (Dr, De, 1e-4); -#%!assert (Er, Ee, 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]); -%! 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 -## 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 -%! 0.0 0.0 1.0 ]; -%! -%! B = [ 1.0 0.0 -%! 0.0 1.0 -%! 1.0 0.0 ]; -%! -%! C = [ 0.0 1.0 -1.0 -%! 0.0 0.0 1.0 ]; -%! -%! D = [ 4.0 0.0 -%! 0.0 1.0 ]; -%! -%! sys = ss (A, B, C, D); -%! sysinv = inv (sys); -%! [Ai, Bi, Ci, Di] = ssdata (sysinv); -%! M = [Ai, Bi; Ci, Di]; -%! -%! Ae = [ 1.0000 1.7500 0.2500 -%! 4.0000 -1.0000 -1.0000 -%! 0.0000 -0.2500 1.2500 ]; -%! -%! Be = [-0.2500 0.0000 -%! 0.0000 -1.0000 -%! -0.2500 0.0000 ]; -%! -%! Ce = [ 0.0000 0.2500 -0.2500 -%! 0.0000 0.0000 1.0000 ]; -%! -%! De = [ 0.2500 0.0000 -%! 0.0000 1.0000 ]; -%! -%! Me = [Ae, Be; Ce, De]; # Me = [Ae, -Be; -Ce, De]; -%! -%!assert (M, Me, 1e-4); - - -## sensitivity function -## Note the correct physical meaning of the states. -## Test would fail on a commercial octave clone -## because of wrong signs of matrices B and C. -## NOTE: Don't use T = I - S for complementary sensitivity, -## use T = feedback (L) instead! -%!shared S1, S2 -%! P = ss (-2, 3, 4, 5); # meaningless numbers -%! C = ss (-1, 1, 1, 0); # ditto -%! L = P * C; -%! I = eye (size (L)); -%! S1 = feedback (I, L*-I, "+"); # draw a block diagram for better understanding -%! S2 = inv (I + L); -%!assert (S1.a, S2.a, 1e-4); -%!assert (S1.b, S2.b, 1e-4); -%!assert (S1.c, S2.c, 1e-4); -%!assert (S1.d, S2.d, 1e-4); - - ## staircase (SLICOT AB01OD) %!shared Ac, Bc, Ace, Bce %! A = [ 17.0 24.0 1.0 8.0 15.0 @@ -699,491 +332,6 @@ %!assert (nobsv, nobsv_e); -## 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 -#%! 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 = 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); - - -## Gain of descriptor state-space models -%!shared p, pi, z, zi, k, ki, p_tf, pi_tf, z_tf, zi_tf, k_tf, ki_tf -%! P = ss (-2, 3, 4, 5); -%! Pi = inv (P); -%! -%! p = pole (P); -%! [z, k] = zero (P); -%! -%! pi = pole (Pi); -%! [zi, ki] = zero (Pi); -%! -%! P_tf = tf (P); -%! Pi_tf = tf (Pi); -%! -%! p_tf = pole (P_tf); -%! [z_tf, k_tf] = zero (P_tf); -%! -%! pi_tf = pole (Pi_tf); -%! [zi_tf, ki_tf] = zero (Pi_tf); -%! -%!assert (p, zi, 1e-4); -%!assert (z, pi, 1e-4); -%!assert (k, inv (ki), 1e-4); -%!assert (p_tf, zi_tf, 1e-4); -%!assert (z_tf, pi_tf, 1e-4); -%!assert (k_tf, inv (ki_tf), 1e-4); - - -## Scaling of state-space models, direct access to TB01ID -%!shared Ao, Bo, Co, SCALEo, MAXREDo, Ae, Be, Ce, SCALEe, MAXREDe -%! A = [ 0.0 1.0000e+000 0.0 0.0 0.0 -%! -1.5800e+006 -1.2570e+003 0.0 0.0 0.0 -%! 3.5410e+014 0.0 -1.4340e+003 0.0 -5.3300e+011 -%! 0.0 0.0 0.0 0.0 1.0000e+000 -%! 0.0 0.0 0.0 -1.8630e+004 -1.4820e+000 ]; -%! -%! B = [ 0.0 0.0 -%! 1.1030e+002 0.0 -%! 0.0 0.0 -%! 0.0 0.0 -%! 0.0 8.3330e-003 ]; -%! -%! C = [ 1.0000e+000 0.0 0.0 0.0 0.0 -%! 0.0 0.0 1.0000e+000 0.0 0.0 -%! 0.0 0.0 0.0 1.0000e+000 0.0 -%! 6.6640e-001 0.0 -6.2000e-013 0.0 0.0 -%! 0.0 0.0 -1.0000e-003 1.8960e+006 1.5080e+002 ]; -%! -%! MAXRED = 0.0; -%! -%! [Ao, Bo, Co, MAXREDo, SCALEo] = sltb01id (A, B, C, MAXRED); -%! -%! Ae = [ 0.0000000D+00 0.1000000D+05 0.0000000D+00 0.0000000D+00 0.0000000D+00 -%! -0.1580000D+03 -0.1257000D+04 0.0000000D+00 0.0000000D+00 0.0000000D+00 -%! 0.3541000D+05 0.0000000D+00 -0.1434000D+04 0.0000000D+00 -0.5330000D+03 -%! 0.0000000D+00 0.0000000D+00 0.0000000D+00 0.0000000D+00 0.1000000D+03 -%! 0.0000000D+00 0.0000000D+00 0.0000000D+00 -0.1863000D+03 -0.1482000D+01 ]; -%! -%! Be = [ 0.0000000D+00 0.0000000D+00 -%! 0.1103000D+04 0.0000000D+00 -%! 0.0000000D+00 0.0000000D+00 -%! 0.0000000D+00 0.0000000D+00 -%! 0.0000000D+00 0.8333000D+02 ]; -%! -%! Ce = [ 0.1000000D-04 0.0000000D+00 0.0000000D+00 0.0000000D+00 0.0000000D+00 -%! 0.0000000D+00 0.0000000D+00 0.1000000D+06 0.0000000D+00 0.0000000D+00 -%! 0.0000000D+00 0.0000000D+00 0.0000000D+00 0.1000000D-05 0.0000000D+00 -%! 0.6664000D-05 0.0000000D+00 -0.6200000D-07 0.0000000D+00 0.0000000D+00 -%! 0.0000000D+00 0.0000000D+00 -0.1000000D+03 0.1896000D+01 0.1508000D-01 ]; -%! -%! SCALEe = [0.1000000D-04 0.1000000D+00 0.1000000D+06 0.1000000D-05 0.1000000D-03 ]; -%! -%! MAXREDe = 0.3488E+10; -%! -%!assert (Ao, Ae, 1e-4); -%!assert (Bo, Be, 1e-4); -%!assert (Co, Ce, 1e-4); -%!assert (MAXREDo, MAXREDe, 1e6); -%!assert (SCALEo, SCALEe.', 1e-4); - - -## Scaling of descriptor state-space models, direct access to TG01AD -%!shared Ao, Eo, Bo, Co, LSCALEo, RSCALEo, Ae, Ee, Be, Ce, LSCALEe, RSCALEe -%! A = [ -1 0 0 0.003 -%! 0 ... [truncated message content] |