]> Creatis software - CreaPhase.git/blob - octave_packages/control-2.3.52/@ss/__sys_inverse__.m
Add a useful package (from Source forge) for octave
[CreaPhase.git] / octave_packages / control-2.3.52 / @ss / __sys_inverse__.m
1 ## Copyright (C) 2009, 2010, 2012   Lukas F. Reichlin
2 ##
3 ## This file is part of LTI Syncope.
4 ##
5 ## LTI Syncope is free software: you can redistribute it and/or modify
6 ## it under the terms of the GNU General Public License as published by
7 ## the Free Software Foundation, either version 3 of the License, or
8 ## (at your option) any later version.
9 ##
10 ## LTI Syncope is distributed in the hope that it will be useful,
11 ## but WITHOUT ANY WARRANTY; without even the implied warranty of
12 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13 ## GNU General Public License for more details.
14 ##
15 ## You should have received a copy of the GNU General Public License
16 ## along with LTI Syncope.  If not, see <http://www.gnu.org/licenses/>.
17
18 ## -*- texinfo -*-
19 ## Inversion of SS models.
20
21 ## Author: Lukas Reichlin <lukas.reichlin@gmail.com>
22 ## Created: October 2009
23 ## Version: 0.3
24
25 function sys = __sys_inverse__ (sys)
26
27   a = sys.a;
28   b = sys.b;
29   c = sys.c;
30   d = sys.d;
31   e = sys.e;
32
33   if (! isempty (e) || rcond (d) < eps)  # dss or strictly proper ss
34
35     n = rows (a);
36     m = columns (b);                     # p = m (square system)
37
38     if (isempty (e))                     # avoid testing twice?
39       e = eye (n);
40     endif
41
42     sys.a = [a, b; c, d];
43     sys.b = [zeros(n, m); -eye(m)];
44     sys.c = [zeros(m, n), eye(m)];
45     sys.d = zeros (m);
46     sys.e = [e, zeros(n, m); zeros(m, n+m)];
47
48     sys.stname = repmat ({""}, n+m, 1);
49
50   else                                   # proper ss
51
52     bid = b / d;
53
54     sys.a = a - bid * c;
55     sys.b = -bid;
56     sys.c = d \ c;
57     sys.d = inv (d);
58
59   endif
60
61 endfunction