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. |