5e752c3edffe54b6a2b050f98430ab986b28d943
[scilab.git] / scilab / modules / cacsd / macros / obs_gram.sci
1 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
2 // Copyright (C) INRIA -
3 //
4 // Copyright (C) 2012 - 2016 - Scilab Enterprises
5 //
6 // This file is hereby licensed under the terms of the GNU GPL v2.0,
7 // pursuant to article 5.3.4 of the CeCILL v.2.1.
8 // This file was originally licensed under the terms of the CeCILL v2.1,
9 // and continues to be available under such terms.
10 // For more information, see the COPYING file which you should have received
11 // along with this program.
12
13 function [go]=obs_gram(a,c,domaine)
14
15     [lhs,rhs]=argn(0)
16     select typeof(a)
17     case "constant" then
18         if rhs<2 then error(39); end;
19         if rhs==2 then domaine="c"; end;
20         if and(domaine<>["d","c"]) then
21             error(msprintf(gettext("%s: Wrong value for input argument #%d: Must be in the set {%s}.\n"), "obs_gram",3,"''d'', ''c''"));
22         end
23         [m,n]=size(a)
24         if m<>n then error(20,1),end
25         [mb,nb]=size(c);if nb<>n then error(60),end
26     case "state-space" then
27         if rhs>1 then
28             error(msprintf(gettext("%s: Wrong number of input arguments: %d expected"),"obs_gram",1)),
29         end
30         [a,c,domaine]=a([2,4,7])
31         if domaine==[] then
32             warning(msprintf(gettext("%s: Input argument #%d is assumed continuous time.\n"),"obs_gram",1));
33             domaine="c";
34         elseif type(domaine)==1 then
35             domaine="d",
36         end
37         [n,n]=size(a)
38     case "rational" then
39         if rhs>1 then
40             error(msprintf(gettext("%s: Wrong number of input arguments: %d expected"),"obs_gram",1)),
41         end
42         a=tf2ss(a)
43         [a,c,domaine]=a([2,4,7])
44         if domaine==[] then
45             warning(msprintf(gettext("%s: Input argument #%d is assumed continuous time.\n"),"obs_gram",1));
46             domaine="c";
47         elseif type(domaine)==1 then
48             domaine="d",
49         end
50         [n,n]=size(a)
51     else
52         if rhs==1 then
53             error(msprintf(gettext("%s: Wrong type for input argument #%d: Linear dynamical system  expected.\n"),"obs_gram",1))
54         else
55             error(msprintf(gettext("%s: Wrong type of input argument #%d: Array of floating point numbers expected.\n"),"obs_gram",1))
56         end
57     end;
58     //
59     s=spec(a)
60     if (domaine=="c"&max(real(s))>=0)|(domaine=="d"&max(abs(s))>=1) then
61         error(msprintf(gettext("%s: Wrong value for input argument #%d: Stable system expected.\n"),"obs_gram",1));
62     end
63     go=lyap(a,-c'*c,domaine)
64 endfunction