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