Mercurial > octave-nkf
comparison scripts/control/system/syssub.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 |
---|---|
45 ## Created: July 1996 | 45 ## Created: July 1996 |
46 ## updated for variable numbers of input arguments by July 1999 A. S. Hodel | 46 ## updated for variable numbers of input arguments by July 1999 A. S. Hodel |
47 | 47 |
48 function sys = syssub (varargin) | 48 function sys = syssub (varargin) |
49 | 49 |
50 if(nargin < 1) | 50 if (nargin < 1) |
51 print_usage (); | 51 print_usage (); |
52 endif | 52 endif |
53 | 53 |
54 ## collect all arguments | 54 ## collect all arguments |
55 arglist = {}; | 55 arglist = {}; |
56 for kk=1:nargin | 56 for kk = 1:nargin |
57 arglist{kk} = varargin{kk}; | 57 arglist{kk} = varargin{kk}; |
58 if(!isstruct(arglist{kk})) | 58 if (! isstruct (arglist{kk})) |
59 error("syssub: argument %d is not a data structure",kk); | 59 error ("syssub: argument %d is not a data structure", kk); |
60 endif | 60 endif |
61 endfor | 61 endfor |
62 | 62 |
63 ## check system dimensions | 63 ## check system dimensions |
64 [n,nz,mg,pg,Gyd] = sysdimensions(arglist{1}); | 64 [n, nz, mg, pg, Gyd] = sysdimensions (arglist{1}); |
65 for kk=2:nargin | 65 for kk = 2:nargin |
66 [n,nz,mh,ph,Hyd] = sysdimensions(arglist{kk}); | 66 [n, nz, mh, ph, Hyd] = sysdimensions (arglist{kk}); |
67 if(mg != mh) | 67 if (mg != mh) |
68 error("arg 1 has %d inputs; arg %d has vs %d inputs",mg,kk,mh); | 68 error ("arg 1 has %d inputs; arg %d has vs %d inputs", mg, kk, mh); |
69 elseif(pg != ph) | 69 elseif (pg != ph) |
70 error("arg 1 has %d outputs; arg %d has vs %d outputs",pg,kk,ph); | 70 error ("arg 1 has %d outputs; arg %d has vs %d outputs", pg, kk, ph); |
71 elseif(norm(Gyd - Hyd)) | 71 elseif (norm (Gyd - Hyd)) |
72 warning("cannot add a discrete output to a continuous output"); | 72 warning ("cannot add a discrete output to a continuous output"); |
73 error("Output type mismatch: arguments 1 and %d\n",kk); | 73 error ("Output type mismatch: arguments 1 and %d", kk); |
74 endif | 74 endif |
75 endfor | 75 endfor |
76 | 76 |
77 ## perform the subtract | 77 ## perform the subtract |
78 if(nargin == 2) | 78 if (nargin == 2) |
79 Gsys = arglist{1}; | 79 Gsys = arglist{1}; |
80 Hsys = arglist{2}; | 80 Hsys = arglist{2}; |
81 if( strcmp(sysgettype(Gsys),"tf") | strcmp(sysgettype(Hsys),"tf") ) | 81 if (strcmp (sysgettype (Gsys), "tf") || strcmp (sysgettype (Hsys), "tf")) |
82 ## see if subtracting transfer functions with identical denominators | 82 ## see if subtracting transfer functions with identical denominators |
83 [Gnum,Gden,GT,Gin,Gout] = sys2tf(Gsys); | 83 [Gnum, Gden, GT, Gin, Gout] = sys2tf (Gsys); |
84 [Hnum,Hden,HT,Hin,Hout] = sys2tf(Hsys); | 84 [Hnum, Hden, HT, Hin, Hout] = sys2tf (Hsys); |
85 if(length(Hden) == length(Gden) ) | 85 if (length (Hden) == length (Gden)) |
86 if( (Hden == Gden) & (HT == GT) ) | 86 if ((Hden == Gden) & (HT == GT)) |
87 sys = tf(Gnum-Hnum,Gden,GT,Gin,Gout); | 87 sys = tf (Gnum-Hnum, Gden, GT, Gin, Gout); |
88 return | 88 return; |
89 endif | 89 endif |
90 ## if not, we go on and do the usual thing... | 90 ## if not, we go on and do the usual thing... |
91 endif | 91 endif |
92 endif | 92 endif |
93 | 93 |
94 ## make sure in ss form | 94 ## make sure in ss form |
95 Gsys = sysupdate(Gsys,"ss"); | 95 Gsys = sysupdate (Gsys, "ss"); |
96 Hsys = sysupdate(Hsys,"ss"); | 96 Hsys = sysupdate (Hsys, "ss"); |
97 | 97 |
98 ## change signal names to avoid warning messages from sysgroup | 98 ## change signal names to avoid warning messages from sysgroup |
99 Gsys = syssetsignals(Gsys,"in",__sysdefioname__(length(Gin),"Gin_u")); | 99 Gsys = syssetsignals (Gsys, "in", |
100 Gsys = syssetsignals(Gsys,"out",__sysdefioname__(length(Gout),"Gout_u")); | 100 __sysdefioname__(length(Gin), "Gin_u")); |
101 Hsys = syssetsignals(Hsys,"in",__sysdefioname__(length(Hin),"Hin_u")); | |
102 Hsys = syssetsignals(Hsys,"out",__sysdefioname__(length(Hout),"Hout_u")); | |
103 | 101 |
104 sys = sysgroup(Gsys,Hsys); | 102 Gsys = syssetsignals (Gsys, "out", |
103 __sysdefioname__(length(Gout), "Gout_u")); | |
105 | 104 |
106 eyin = eye(mg); | 105 Hsys = syssetsignals (Hsys, "in", |
107 eyout = eye(pg); | 106 __sysdefioname__(length(Hin), "Hin_u")); |
107 | |
108 Hsys = syssetsignals (Hsys, "out", | |
109 __sysdefioname__(length(Hout), "Hout_u")); | |
110 | |
111 sys = sysgroup (Gsys, Hsys); | |
112 | |
113 eyin = eye (mg); | |
114 eyout = eye (pg); | |
108 | 115 |
109 sys = sysscale (sys, [eyout, -eyout], [eyin; eyin], Gout, Gin); | 116 sys = sysscale (sys, [eyout, -eyout], [eyin; eyin], Gout, Gin); |
110 | 117 |
111 else | 118 else |
112 ## multiple systems (or a single system); combine together one by one | 119 ## multiple systems (or a single system); combine together one by one |
113 sys = arglist{1}; | 120 sys = arglist{1}; |
114 for kk=2:length(arglist) | 121 for kk = 2:length(arglist) |
115 sys = syssub(sys,arglist{kk}); | 122 sys = syssub (sys, arglist{kk}); |
116 endfor | 123 endfor |
117 endif | 124 endif |
118 | 125 |
119 endfunction | 126 endfunction |