[3dd646]: inst / __dss2ss__.m Maximize Restore History

Download this file

__dss2ss__.m    112 lines (101 with data), 3.5 kB

  1
  2
  3
  4
  5
  6
  7
  8
  9
 10
 11
 12
 13
 14
 15
 16
 17
 18
 19
 20
 21
 22
 23
 24
 25
 26
 27
 28
 29
 30
 31
 32
 33
 34
 35
 36
 37
 38
 39
 40
 41
 42
 43
 44
 45
 46
 47
 48
 49
 50
 51
 52
 53
 54
 55
 56
 57
 58
 59
 60
 61
 62
 63
 64
 65
 66
 67
 68
 69
 70
 71
 72
 73
 74
 75
 76
 77
 78
 79
 80
 81
 82
 83
 84
 85
 86
 87
 88
 89
 90
 91
 92
 93
 94
 95
 96
 97
 98
 99
100
101
102
103
104
105
106
107
108
109
110
111
## Copyright (C) 2009-2013 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 LTI Syncope. If not, see <http://www.gnu.org/licenses/>.
## -*- texinfo -*-
## Convert descriptor state-space system into regular state-space form.
## Author: Lukas Reichlin <lukas.reichlin@gmail.com>
## Created: September 2011
## Version: 0.2
function [a, b, c, d, e] = __dss2ss__ (a, b, c, d, e)
if (isempty (e))
return;
elseif (rcond (e) < eps) # check for singularity
## check whether regular state-space representation is possible
[~, ~, ~, ~, ranke, rnka22] = __sl_tg01fd__ (a, e, b, c, false, 0);
if (ranke+rnka22 < rows (a))
error ("ss: dss2ss: this descriptor system cannot be converted to regular state-space form");
endif
endif
[a, b, c, d] = __sl_sb10jd__ (a, b, c, d, e);
e = [];
endfunction
## Test from SLICOT TG01FD
%!shared a, b, c, e, ranke, rnka22, q, z, a_exp, b_exp, c_exp, e_exp, q_exp, z_exp
%!
%! e = [1, 2, 0, 0; 0, 1, 0, 1; 3, 9, 6, 3; 0, 0, 2, 0];
%! a = [-1, 0, 0, 3; 0, 0, 1, 2; 1, 1, 0, 4; 0, 0, 0, 0];
%! b = [1, 0; 0, 0; 0, 1; 1, 1];
%! c = [-1, 0, 1, 0; 0, 1, -1, 1];
%!
%! [a, e, b, c, ranke, rnka22, q, z] = __sl_tg01fd__ (a, e, b, c, true, 0.0);
%!
%! e_exp = [10.1587 5.8230 1.3021 0.0000;
%! 0.0000 -2.4684 -0.1896 0.0000;
%! 0.0000 0.0000 1.0338 0.0000;
%! 0.0000 0.0000 0.0000 0.0000];
%!
%! a_exp = [ 2.0278 0.1078 3.9062 -2.1571;
%! -0.0980 0.2544 1.6053 -0.1269;
%! 0.2713 0.7760 -0.3692 -0.4853;
%! 0.0690 -0.5669 -2.1974 0.3086];
%!
%! b_exp = [-0.2157 -0.9705;
%! 0.3015 0.9516;
%! 0.7595 0.0991;
%! 1.1339 0.3780];
%!
%! c_exp = [ 0.3651 -1.0000 -0.4472 -0.8165;
%! -1.0954 1.0000 -0.8944 0.0000];
%!
%! q_exp = [-0.2157 -0.5088 0.6109 0.5669;
%! -0.1078 -0.2544 -0.7760 0.5669;
%! -0.9705 0.1413 -0.0495 -0.1890;
%! 0.0000 0.8102 0.1486 0.5669];
%!
%! z_exp = [-0.3651 0.0000 0.4472 0.8165;
%! -0.9129 0.0000 0.0000 -0.4082;
%! 0.0000 -1.0000 0.0000 0.0000;
%! -0.1826 0.0000 -0.8944 0.4082];
%!
%!assert (a, a_exp, 1e-4);
%!assert (e, e_exp, 1e-4);
%!assert (b, b_exp, 1e-4);
%!assert (c, c_exp, 1e-4);
%!assert (q, q_exp, 1e-4);
%!assert (z, z_exp, 1e-4);
%!assert (ranke, 3);
%!assert (rnka22, 1);
## test error
%!shared mms
%!
%! mm = tf([3, 5, 0], [4, 1]);
%! mms = ss (mm);
%!error (__dss2ss__ (mms.a, mms.b, mms.c, mms.d, mms.e));
## Realizable descriptor system with singular E matrix
%!test
%! A = [1 0; 0 1];
%! B = [1; 0];
%! C = [1 0];
%! D = 0;
%! E = [1 0; 0 0];
%!
%! sys = dss (A, B, C, D, E);
%! [Ao, Bo, Co, Do] = ssdata (sys);
%!
%! assert (Ao, 1, 1e-4);
%! assert (Bo, 1, 1e-4);
%! assert (Co, 1, 1e-4);
%! assert (Do, 0, 1e-4);