Mercurial > octave-nkf
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 |