]> Creatis software - CreaPhase.git/blobdiff - octave_packages/control-2.3.52/ltimodels.m
Add a useful package (from Source forge) for octave
[CreaPhase.git] / octave_packages / control-2.3.52 / ltimodels.m
diff --git a/octave_packages/control-2.3.52/ltimodels.m b/octave_packages/control-2.3.52/ltimodels.m
new file mode 100644 (file)
index 0000000..369193f
--- /dev/null
@@ -0,0 +1,413 @@
+## Copyright (C) 2009 Luca Favatella
+## Copyright (C) 2009, 2010, 2011   Lukas 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 LTI Syncope.  If not, see <http://www.gnu.org/licenses/>.
+
+## -*- texinfo -*-
+## @deftypefn {Function File} test ltimodels
+## @deftypefnx {Function File} ltimodels
+## @deftypefnx {Function File} ltimodels (@var{systype})
+## Test suite and help for LTI models.
+## @end deftypefn
+
+## Author: Lukas Reichlin <lukas.reichlin@gmail.com>
+## Created: November 2009
+## Version: 0.2
+
+function ltimodels (systype = "general")
+
+  %if (nargin > 1)
+    print_usage ();
+  %endif
+
+  ## TODO: write documentation
+
+  if (! ischar (systype))
+    error ("ltimodels: argument must be a string");
+  endif
+
+  systype = lower (systype);
+
+  switch (systype)
+    case "ss"
+      str = {"State Space (SS) Models"\
+             "-----------------------"\
+             ""};
+
+    case "tf"
+      str = {"Transfer Function (TF) Models"\
+             "-----------------------------"\
+             ""};
+
+    otherwise  # general
+      str = {"Linear Time Invariant (LTI) Models"\
+             "----------------------------------"\
+             ""};
+
+  endswitch
+
+  disp ("");
+  disp (char (str));
+
+endfunction
+
+
+
+## ==============================================================================
+## LTI Tests
+## ==============================================================================
+
+## isct, isdt
+%!shared ltisys
+%! ltisys = tf (12);
+%!assert (ltisys.ts, -2);
+%!assert (isct (ltisys));
+%!assert (isdt (ltisys));
+
+%!shared ltisys
+%! ltisys = ss (17);
+%!assert (ltisys.ts, -2);
+%!assert (isct (ltisys));
+%!assert (isdt (ltisys));
+
+%!shared ltisys
+%! ltisys = tf (1, [1 1]);
+%!assert (ltisys.ts, 0);
+%!assert (isct (ltisys));
+%!assert (! isdt (ltisys));
+
+%!shared ltisys, ts
+%! ts = 0.1;
+%! ltisys = ss (-1, 1, 1, 0, ts);
+%!assert (ltisys.ts, ts);
+%!assert (! isct (ltisys));
+%!assert (isdt (ltisys));
+
+
+
+## ==============================================================================
+## TF Tests
+## ==============================================================================
+
+
+
+## ==============================================================================
+## SS Tests
+## ==============================================================================
+
+
+## staircase (SLICOT AB01OD)
+%!shared Ac, Bc, Ace, Bce
+%! A = [ 17.0   24.0    1.0    8.0   15.0
+%!       23.0    5.0    7.0   14.0   16.0
+%!        4.0    6.0   13.0   20.0   22.0
+%!       10.0   12.0   19.0   21.0    3.0
+%!       11.0   18.0   25.0    2.0    9.0 ];
+%!
+%! B = [ -1.0   -4.0
+%!        4.0    9.0
+%!       -9.0  -16.0
+%!       16.0   25.0
+%!      -25.0  -36.0 ];
+%!
+%! tol = 0;
+%!
+%! A = A.';  # There's a little mistake in the example
+%!           # program of routine AB01OD in SLICOT 5.0
+%!
+%! [Ac, Bc, U, ncont] = slab01od (A, B, tol);
+%!
+%! Ace = [ 12.8848   3.2345  11.8211   3.3758  -0.8982
+%!          4.4741 -12.5544   5.3509   5.9403   1.4360
+%!         14.4576   7.6855  23.1452  26.3872 -29.9557
+%!          0.0000   1.4805  27.4668  22.6564  -0.0072
+%!          0.0000   0.0000 -30.4822   0.6745  18.8680 ];
+%!
+%! Bce = [ 31.1199  47.6865
+%!          3.2480   0.0000
+%!          0.0000   0.0000
+%!          0.0000   0.0000
+%!          0.0000   0.0000 ];
+%!
+%!assert (Ac, Ace, 1e-4);
+%!assert (Bc, Bce, 1e-4);
+
+
+## controllability staircase form of descriptor state-space models (SLICOT TG01HD)
+%!shared ac, ec, bc, cc, q, z, ncont, ac_e, ec_e, bc_e, cc_e, q_e, z_e, ncont_e
+%!
+%! a = [ 2     0     2     0    -1     3     1
+%!       0     1     0     0     1     0     0
+%!       0     0     0     1     0     0     1
+%!       0     0     2     0    -1     3     1
+%!       0     0     0     1     0     0     1
+%!       0     1     0     0     1     0     0
+%!       0     0     0     1     0     0     1 ];
+%!
+%! e = [ 0     0     1     0     0     0     0
+%!       0     0     0     0     0     1     0
+%!       0     0     0     0     0     0     1
+%!       0     0     0     0     0     0     1
+%!       0     0     0     1     0     0     0
+%!       0     0     1     0    -1     0     0
+%!       1     3     0     2     0     0     0 ];
+%!
+%! b = [ 2     1     0
+%!       0     0     0
+%!       0     0     0
+%!       0     0     0
+%!       0     0     0
+%!       0     0     0
+%!       1     2     3 ];
+%!
+%! c = [ 1     0     0     1     0     0     1
+%!       0    -1     1     0    -1     1     0 ];
+%!
+%! tol = 0;
+%!
+%! [ac, ec, bc, cc, q, z, ncont] = sltg01hd (a, e, b, c, tol);
+%!
+%! ncont_e = 3;
+%!
+%! ac_e = [  0.0000   0.0000   0.0000   0.0000  -1.2627   0.4334   0.4666
+%!           0.0000   2.0000   0.0000  -3.7417  -0.8520   0.2924  -0.4342
+%!           0.0000   0.0000   1.7862   0.3780  -0.2651  -0.7723   0.0000
+%!           0.0000   0.0000   0.0000   3.7417   0.8520  -0.2924   0.4342
+%!           0.0000   0.0000   0.0000   0.0000  -1.5540   0.5334   0.5742
+%!           0.0000   0.0000   0.0000   0.0000  -0.6533   0.2242   0.2414
+%!           0.0000   0.0000   0.0000   0.0000  -0.5892   0.2022   0.2177 ];
+%!
+%! ec_e = [ -1.8325   1.0000   2.3752   0.0000  -0.8214   0.2819   1.8016
+%!           0.4887   0.0000   0.3770  -0.5345   0.1874   0.5461   0.0000
+%!          -0.1728   0.0000  -0.1333  -1.1339   0.1325   0.3861   0.0000
+%!           0.0000   0.0000   0.0000   0.0000   0.8520  -0.2924   0.4342
+%!           0.0000   0.0000   0.0000   0.0000  -1.0260  -0.1496   0.0000
+%!           0.0000   0.0000   0.0000   0.0000   0.0000   1.1937   0.0000
+%!           0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   1.0000 ];
+%!
+%! bc_e = [  1.0000   2.0000   3.0000
+%!           2.0000   1.0000   0.0000
+%!           0.0000   0.0000   0.0000
+%!           0.0000   0.0000   0.0000
+%!           0.0000   0.0000   0.0000
+%!           0.0000   0.0000   0.0000
+%!           0.0000   0.0000   0.0000 ];
+%!
+%! cc_e = [  0.0000   1.0000   0.0000   0.0000  -1.2627   0.4334   0.4666
+%!           0.3665   0.0000  -0.9803  -1.6036   0.1874   0.5461   0.0000 ];
+%!
+%! q_e = [   0.0000   1.0000   0.0000   0.0000   0.0000   0.0000   0.0000
+%!           0.0000   0.0000   0.7071   0.0000   0.2740  -0.6519   0.0000
+%!           0.0000   0.0000   0.0000   0.0000   0.8304   0.3491  -0.4342
+%!           0.0000   0.0000   0.0000  -1.0000   0.0000   0.0000   0.0000
+%!           0.0000   0.0000   0.0000   0.0000   0.4003   0.1683   0.9008
+%!           0.0000   0.0000   0.7071   0.0000  -0.2740   0.6519   0.0000
+%!           1.0000   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000 ];
+%!
+%! z_e = [   0.0000   1.0000   0.0000   0.0000   0.0000   0.0000   0.0000
+%!          -0.6108   0.0000   0.7917   0.0000   0.0000   0.0000   0.0000
+%!           0.4887   0.0000   0.3770  -0.5345   0.1874   0.5461   0.0000
+%!           0.0000   0.0000   0.0000   0.0000  -0.4107   0.1410   0.9008
+%!           0.6108   0.0000   0.4713   0.2673  -0.1874  -0.5461   0.0000
+%!          -0.1222   0.0000  -0.0943  -0.8018  -0.1874  -0.5461   0.0000
+%!           0.0000   0.0000   0.0000   0.0000  -0.8520   0.2924  -0.4342 ];
+%!
+%!assert (ac, ac_e, 1e-4);
+%!assert (ec, ec_e, 1e-4);
+%!assert (bc, bc_e, 1e-4);
+%!assert (cc, cc_e, 1e-4);
+%!assert (q, q_e, 1e-4);
+%!assert (z, z_e, 1e-4);
+%!assert (ncont, ncont_e);
+
+
+## observability staircase form of descriptor state-space models (SLICOT TG01ID)
+%!shared ao, eo, bo, co, q, z, nobsv, ao_e, eo_e, bo_e, co_e, q_e, z_e, nobsv_e
+%!
+%! a = [ 2     0     0     0     0     0     0
+%!       0     1     0     0     0     1     0
+%!       2     0     0     2     0     0     0
+%!       0     0     1     0     1     0     1
+%!      -1     1     0    -1     0     1     0
+%!       3     0     0     3     0     0     0
+%!       1     0     1     1     1     0     1 ];
+%!
+%! e = [ 0     0     0     0     0     0     1
+%!       0     0     0     0     0     0     3
+%!       1     0     0     0     0     1     0
+%!       0     0     0     0     1     0     2
+%!       0     0     0     0     0    -1     0
+%!       0     1     0     0     0     0     0
+%!       0     0     1     1     0     0     0 ];
+%!
+%! b = [ 1     0
+%!       0    -1
+%!       0     1
+%!       1     0
+%!       0    -1
+%!       0     1
+%!       1     0 ];
+%!
+%! c = [ 2     0     0     0     0     0     1
+%!       1     0     0     0     0     0     2
+%!       0     0     0     0     0     0     3 ];
+%!
+%! tol = 0;
+%!
+%! [ao, eo, bo, co, q, z, nobsv] = sltg01id (a, e, b, c, tol);
+%!
+%! nobsv_e = 3;
+%!
+%! ao_e = [  0.2177   0.2414   0.5742   0.4342   0.0000  -0.4342   0.4666
+%!           0.2022   0.2242   0.5334  -0.2924  -0.7723   0.2924   0.4334
+%!          -0.5892  -0.6533  -1.5540   0.8520  -0.2651  -0.8520  -1.2627
+%!           0.0000   0.0000   0.0000   3.7417   0.3780  -3.7417   0.0000
+%!           0.0000   0.0000   0.0000   0.0000   1.7862   0.0000   0.0000
+%!           0.0000   0.0000   0.0000   0.0000   0.0000   2.0000   0.0000
+%!           0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   0.0000 ];
+%!
+%! eo_e = [  1.0000   0.0000   0.0000   0.4342   0.0000   0.0000   1.8016
+%!           0.0000   1.1937  -0.1496  -0.2924   0.3861   0.5461   0.2819
+%!           0.0000   0.0000  -1.0260   0.8520   0.1325   0.1874  -0.8214
+%!           0.0000   0.0000   0.0000   0.0000  -1.1339  -0.5345   0.0000
+%!           0.0000   0.0000   0.0000   0.0000  -0.1333   0.3770   2.3752
+%!           0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   1.0000
+%!           0.0000   0.0000   0.0000   0.0000  -0.1728   0.4887  -1.8325 ];
+%!
+%! bo_e = [  0.4666   0.0000
+%!           0.4334   0.5461
+%!          -1.2627   0.1874
+%!           0.0000  -1.6036
+%!           0.0000  -0.9803
+%!           1.0000   0.0000
+%!           0.0000   0.3665 ];
+%!
+%! co_e = [  0.0000   0.0000   0.0000   0.0000   0.0000   2.0000   1.0000
+%!           0.0000   0.0000   0.0000   0.0000   0.0000   1.0000   2.0000
+%!           0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   3.0000 ];
+%!
+%! q_e = [   0.0000   0.0000   0.0000   0.0000   0.0000   1.0000   0.0000
+%!           0.0000   0.0000   0.0000   0.0000   0.7917   0.0000  -0.6108
+%!           0.0000   0.5461   0.1874  -0.5345   0.3770   0.0000   0.4887
+%!           0.9008   0.1410  -0.4107   0.0000   0.0000   0.0000   0.0000
+%!           0.0000  -0.5461  -0.1874   0.2673   0.4713   0.0000   0.6108
+%!           0.0000  -0.5461  -0.1874  -0.8018  -0.0943   0.0000  -0.1222
+%!          -0.4342   0.2924  -0.8520   0.0000   0.0000   0.0000   0.0000 ];
+%!
+%! z_e = [   0.0000   0.0000   0.0000   0.0000   0.0000   1.0000   0.0000
+%!           0.0000  -0.6519   0.2740   0.0000   0.7071   0.0000   0.0000
+%!          -0.4342   0.3491   0.8304   0.0000   0.0000   0.0000   0.0000
+%!           0.0000   0.0000   0.0000  -1.0000   0.0000   0.0000   0.0000
+%!           0.9008   0.1683   0.4003   0.0000   0.0000   0.0000   0.0000
+%!           0.0000   0.6519  -0.2740   0.0000   0.7071   0.0000   0.0000
+%!           0.0000   0.0000   0.0000   0.0000   0.0000   0.0000   1.0000 ];
+%!
+%!assert (ao, ao_e, 1e-4);
+%!assert (eo, eo_e, 1e-4);
+%!assert (bo, bo_e, 1e-4);
+%!assert (co, co_e, 1e-4);
+%!assert (q, q_e, 1e-4);
+%!assert (z, z_e, 1e-4);
+%!assert (nobsv, nobsv_e);
+
+
+## ss2tf conversion by Slicot TB04BD
+## Test provided by Slicot
+%!shared NUM, DEN, NUMe, DENe
+%! A = [ -1.0   0.0   0.0
+%!        0.0  -2.0   0.0
+%!        0.0   0.0  -3.0 ];
+%!
+%! B = [  0.0   1.0  -1.0
+%!        1.0   1.0   0.0 ].';
+%!
+%! C = [  0.0   1.0   1.0
+%!        1.0   1.0   1.0 ];
+%!
+%! D = [  1.0   0.0
+%!        0.0   1.0 ];
+%!
+%! [NUM, DEN] = tfdata (ss (A, B, C, D));
+%!
+%! NUMe = {[1, 5, 7], [1]; [1], [1, 5, 5]};
+%!
+%! DENe = {[1, 5, 6], [1, 2]; [1, 5, 6], [1, 3, 2]};
+%!
+%!assert (NUM, NUMe, 1e-4);
+%!assert (DEN, DENe, 1e-4);
+
+
+## ss2tf conversion by Slicot TB04BD
+## Trivial test
+%!shared NUM, DEN, NUMe, DENe
+%! A = [  0 ];
+%!
+%! B = [  1 ];
+%!
+%! C = [  1 ];
+%!
+%! D = [  0 ];
+%!
+%! [NUM, DEN] = tfdata (ss (A, B, C, D));
+%!
+%! NUMe = {[1]};
+%!
+%! DENe = {[1, 0]};
+%!
+%!assert (NUM, NUMe, 1e-4);
+%!assert (DEN, DENe, 1e-4);
+
+
+## transfer function to state-space conversion
+## test from SLICOT TD04AD
+%!shared Mo, Me
+%! INDEX =  [  3     3 ];
+%!
+%! DCOEFF = [  1.0   6.0  11.0   6.0
+%!             1.0   6.0  11.0   6.0 ];
+%!
+%! UCOEFF = zeros (2, 2, 4);
+%!
+%! u11 = [ 1.0   6.0  12.0   7.0 ];
+%! u12 = [ 0.0   1.0   4.0   3.0 ];
+%! u21 = [ 0.0   0.0   1.0   1.0 ];
+%! u22 = [ 1.0   8.0  20.0  15.0 ];
+%!
+%! UCOEFF(1,1,:) = u11;
+%! UCOEFF(1,2,:) = u12;
+%! UCOEFF(2,1,:) = u21;
+%! UCOEFF(2,2,:) = u22;
+%!
+%! [Ao, Bo, Co, Do] = sltd04ad (UCOEFF, DCOEFF, INDEX, 0);
+%!
+%! Ae = [  0.5000  -0.8028   0.9387
+%!         4.4047  -2.3380   2.5076
+%!        -5.5541   1.6872  -4.1620 ];
+%!
+%! Be = [ -0.2000  -1.2500
+%!         0.0000  -0.6097
+%!         0.0000   2.2217 ];
+%!
+%! Ce = [  0.0000  -0.8679   0.2119
+%!         0.0000   0.0000   0.9002 ];
+%!
+%! De = [  1.0000   0.0000
+%!         0.0000   1.0000 ];
+%!
+%! Mo = [Ao, Bo; Co, Do];
+%! Me = [Ae, Be; Ce, De];
+%!
+%!assert (Mo, Me, 1e-4);