From: <par...@us...> - 2010-09-13 16:31:29
|
Revision: 7708 http://octave.svn.sourceforge.net/octave/?rev=7708&view=rev Author: paramaniac Date: 2010-09-13 16:31:22 +0000 (Mon, 13 Sep 2010) Log Message: ----------- control: fix segmentation fault in minreal for state-space models Modified Paths: -------------- trunk/octave-forge/main/control/inst/@ss/__minreal__.m trunk/octave-forge/main/control/inst/ltimodels.m trunk/octave-forge/main/control/src/sltb01pd.cc Removed 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-13 11:08:39 UTC (rev 7707) +++ trunk/octave-forge/main/control/inst/@ss/__minreal__.m 2010-09-13 16:31:22 UTC (rev 7708) @@ -22,7 +22,7 @@ ## Author: Lukas Reichlin <luk...@gm...> ## Created: October 2009 ## Version: 0.2 -%{ + function retsys = __minreal__ (sys, tol) if (tol == "def") @@ -37,62 +37,3 @@ 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-13 11:08:39 UTC (rev 7707) +++ trunk/octave-forge/main/control/inst/ltimodels.m 2010-09-13 16:31:22 UTC (rev 7708) @@ -23,9 +23,9 @@ ## Test suite and help for LTI models. ## @end deftypefn -## Author: Luca Favatella <sla...@gm...> +## Author: Lukas Reichlin <luk...@gm...> ## Created: November 2009 -## Version: 0.1 +## Version: 0.2 function ltimodels (systype = "general") @@ -197,7 +197,7 @@ %!assert (z, z_exp, 1e-4); -## ss: minreal +## ss: minreal (SLICOT TB01PD) %!shared C, D %! %! A = ss (-2, 3, 4, 5); @@ -210,45 +210,43 @@ %!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); +%! 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); -## 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); - ## ss: sminreal %!shared B, C %! Deleted: trunk/octave-forge/main/control/inst/test_minreal.m =================================================================== --- trunk/octave-forge/main/control/inst/test_minreal.m 2010-09-13 11:08:39 UTC (rev 7707) +++ trunk/octave-forge/main/control/inst/test_minreal.m 2010-09-13 16:31:22 UTC (rev 7708) @@ -1,58 +0,0 @@ -## ============================================================================== -## 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 Modified: trunk/octave-forge/main/control/src/sltb01pd.cc =================================================================== --- trunk/octave-forge/main/control/src/sltb01pd.cc 2010-09-13 11:08:39 UTC (rev 7707) +++ trunk/octave-forge/main/control/src/sltb01pd.cc 2010-09-13 16:31:22 UTC (rev 7708) @@ -23,7 +23,7 @@ Author: Lukas Reichlin <luk...@gm...> Created: September 2010 -Version: 0.1 +Version: 0.2 */ @@ -79,6 +79,8 @@ else ldc = max (1, m, p); + b.resize (ldb, max (m, p)); + // arguments out int nr = 0; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |