comparison scripts/control/system/sysmult.m @ 7136:59dcf01bb3e3

[project @ 2007-11-08 20:18:25 by jwe]
author jwe
date Thu, 08 Nov 2007 20:18:26 +0000
parents a1dbe9d80eee
children
comparison
equal deleted inserted replaced
7135:8aa770b6c5bf 7136:59dcf01bb3e3
37 ## Created: July 1996 37 ## Created: July 1996
38 ## updated for variable number of arguments by A. S. Hodel July 1999 38 ## updated for variable number of arguments by A. S. Hodel July 1999
39 39
40 function sys = sysmult (varargin) 40 function sys = sysmult (varargin)
41 41
42 if(nargin < 1) 42 if (nargin < 1)
43 print_usage (); 43 print_usage ();
44 endif 44 endif
45 45
46 ## collect all arguments 46 ## collect all arguments
47 arglist = {}; 47 arglist = {};
48 for kk=1:nargin 48 for kk = 1:nargin
49 arglist{kk} = varargin{kk}; 49 arglist{kk} = varargin{kk};
50 if(!isstruct(arglist{kk})) 50 if (! isstruct (arglist{kk}))
51 error("sysadd: argument %d is not a data structure",kk); 51 error ("sysadd: argument %d is not a data structure", kk);
52 endif 52 endif
53 endfor 53 endfor
54 54
55 ## check system dimensions 55 ## check system dimensions
56 [n,nz,mg,pg,Gyd] = sysdimensions(arglist{1}); 56 [n, nz, mg, pg, Gyd] = sysdimensions (arglist{1});
57 for kk=2:nargin 57 for kk = 2:nargin
58 [n,nz,mh,ph,Hyd] = sysdimensions(arglist{kk}); 58 [n, nz, mh, ph, Hyd] = sysdimensions (arglist{kk});
59 if(ph != mg) 59 if(ph != mg)
60 error("arg %d has %d outputs; arg %d has %d inputs",kk,ph,kk-1,mg); 60 error ("arg %d has %d outputs; arg %d has %d inputs", kk, ph, kk-1, mg);
61 endif 61 endif
62 [n,nz,mg,pg,Gyd] = sysdimensions(arglist{kk}); # for next iteration 62 [n, nz, mg, pg, Gyd] = sysdimensions (arglist{kk}); # for next iteration
63 endfor 63 endfor
64 64
65 ## perform the multiply 65 ## perform the multiply
66 if(nargin == 2) 66 if (nargin == 2)
67 Asys = arglist{1}; 67 Asys = arglist{1};
68 Bsys = arglist{2}; 68 Bsys = arglist{2};
69 69
70 [An,Anz,Am,Ap] = sysdimensions(Asys); 70 [An, Anz, Am, Ap] = sysdimensions (Asys);
71 [Bn,Bnz,Bm,Bp] = sysdimensions(Bsys); 71 [Bn, Bnz, Bm, Bp] = sysdimensions (Bsys);
72 72
73 [Aa,Ab,Ac,Ad,Atsam,An,Anz,Astname,Ainname,Aoutname,Ayd] = sys2ss(Asys); 73 [Aa, Ab, Ac, Ad, Atsam, An, Anz, ...
74 [Ba,Bb,Bc,Bd,Btsam,Bn,Bnz,Bstname,Binname,Boutname,Byd] = sys2ss(Bsys); 74 Astname, Ainname, Aoutname, Ayd] = sys2ss(Asys);
75 75
76 if(Byd) 76 [Ba, Bb, Bc, Bd, Btsam, Bn, Bnz, ...
77 Bstname, Binname, Boutname, Byd] = sys2ss(Bsys);
78
79 if (Byd)
77 ## check direct feed-through of inputs through discrete outputs 80 ## check direct feed-through of inputs through discrete outputs
78 alist = find(Byd); 81 alist = find (Byd);
79 if(An) 82 if (An)
80 bd = Ab(1:An)* Bd(alist,:); 83 bd = Ab(1:An) * Bd(alist,:);
81 if(norm(bd,1)) 84 if (norm (bd, 1))
82 warning("sysmult: inputs -> Bsys discrete outputs -> continuous states of Asys"); 85 warning ("sysmult: inputs -> Bsys discrete outputs -> continuous states of Asys");
83 endif 86 endif
84 endif 87 endif
85 ## check direct feed-through of continuous state through discrete outputs 88 ## check direct feed-through of continuous state through discrete outputs
86 if(Bn) 89 if (Bn)
87 bc = Ab(1:An)* Bc(alist,1:(Bn)); 90 bc = Ab(1:An) * Bc(alist,1:(Bn));
88 if( norm(bc,1) ) 91 if (norm (bc, 1))
89 warning("sysmult: Bsys states -> Bsys discrete outputs -> continuous states of Asys"); 92 warning ("sysmult: Bsys states -> Bsys discrete outputs -> continuous states of Asys");
90 endif 93 endif
91 endif 94 endif
92 endif 95 endif
93 96
94 ## change signal names to avoid spurious warnings from sysgroup 97 ## change signal names to avoid spurious warnings from sysgroup
95 Asys = syssetsignals(Asys,"in",__sysdefioname__(Am,"A_sysmult_tmp_name")); 98 Asys = syssetsignals (Asys, "in",
96 Bsys = syssetsignals(Bsys,"out",__sysdefioname__(Bp,"B_sysmult_tmp_name")); 99 __sysdefioname__ (Am, "A_sysmult_tmp_name"));
97 100
98 sys = sysgroup(Asys,Bsys); 101 Bsys = syssetsignals (Bsys, "out",
102 __sysdefioname__ (Bp, "B_sysmult_tmp_name"));
103
104 sys = sysgroup (Asys, Bsys);
99 105
100 ## connect outputs of B to inputs of A 106 ## connect outputs of B to inputs of A
101 sys = sysconnect(sys,Ap+(1:Bp),1:Am); 107 sys = sysconnect (sys, Ap+(1:Bp), 1:Am);
102 108
103 ## now keep only outputs of A and inputs of B 109 ## now keep only outputs of A and inputs of B
104 sys = sysprune(sys,1:Ap,Am+(1:Bm)); 110 sys = sysprune (sys, 1:Ap, Am+(1:Bm));
105 111
106 else 112 else
107 ## multiple systems (or a single system); combine together one by one 113 ## multiple systems (or a single system); combine together one by one
108 sys = arglist{1}; 114 sys = arglist{1};
109 for kk=2:length(arglist) 115 for kk = 2:length(arglist)
110 sys = sysmult(sys,arglist{kk}); 116 sys = sysmult (sys, arglist{kk});
111 endfor 117 endfor
112 endif 118 endif
113 119
114 endfunction 120 endfunction
115 121