comparison scripts/control/system/c2d.m @ 7135:8aa770b6c5bf

[project @ 2007-11-08 18:54:10 by jwe]
author jwe
date Thu, 08 Nov 2007 18:54:10 +0000
parents a1dbe9d80eee
children aeeb646f6538
comparison
equal deleted inserted replaced
7134:ff0b965b65bc 7135:8aa770b6c5bf
98 ## Author: R. Bruce Tenison <btenison@eng.auburn.edu> 98 ## Author: R. Bruce Tenison <btenison@eng.auburn.edu>
99 ## Created: October 1993 99 ## Created: October 1993
100 ## Updated by John Ingram for system data structure August 1996 100 ## Updated by John Ingram for system data structure August 1996
101 101
102 function dsys = c2d (sys, opt, T) 102 function dsys = c2d (sys, opt, T)
103
103 ## parse input arguments 104 ## parse input arguments
104 if(nargin < 1 | nargin > 3) 105 if (nargin < 1 || nargin > 3)
105 print_usage (); 106 print_usage ();
106 elseif (!isstruct(sys)) 107 elseif (! isstruct (sys))
107 error("sys must be a system data structure"); 108 error ("sys must be a system data structure");
108 elseif (nargin == 1) 109 elseif (nargin == 1)
109 opt = "ex"; 110 opt = "ex";
110 elseif (nargin == 2 & !ischar(opt) ) 111 elseif (nargin == 2 && ! ischar (opt))
111 T = opt; 112 T = opt;
112 opt = "ex"; 113 opt = "ex";
113 endif 114 endif
114 115
115 if (! ischar (opt)) 116 if (! ischar (opt))
116 error ("expecting option as a string"); 117 error ("expecting option as a string");
117 endif 118 endif
118 119
119 ## check if sampling period T was passed. 120 ## check if sampling period T was passed.
120 Ts = sysgettsam(sys); 121 Ts = sysgettsam (sys);
121 if(!exist("T")) 122 if (! exist ("T"))
122 T = Ts; 123 T = Ts;
123 if(T == 0) 124 if (T == 0)
124 error("sys is purely continuous; no sampling period T provided"); 125 error ("sys is purely continuous; no sampling period T provided");
125 endif 126 endif
126 elseif (T != Ts & Ts > 0) 127 elseif (T != Ts && Ts > 0)
127 warning(["c2d: T=",num2str(T),", system tsam==",num2str(Ts), ... 128 warning ("c2d: T=%g, system tsam=%g: using T=", T, Ts, min (T, Ts));
128 ": using T=", num2str(min(T,Ts))]); 129 T = min (T, Ts);
129 T = min(T,Ts); 130 endif
130 endif 131
131 132 if (! is_sample (T))
132 if (!is_sample(T)) 133 error ("sampling period T must be a positive, real scalar");
133 error("sampling period T must be a positive, real scalar");
134 elseif (! (strcmp (opt, "ex") 134 elseif (! (strcmp (opt, "ex")
135 || strcmp (opt, "bi") 135 || strcmp (opt, "bi")
136 || strcmp (opt, "matched"))) 136 || strcmp (opt, "matched")))
137 error ("invalid option passed: %s", opt); 137 error ("invalid option passed: %s", opt);
138 endif 138 endif
139 139
140 sys = sysupdate(sys,"ss"); 140 sys = sysupdate (sys, "ss");
141 [n,nz,m,p] = sysdimensions(sys); 141 [n, nz, m, p] = sysdimensions (sys);
142 if(n == 0) 142 if (n == 0)
143 dsys = syssetsignals(sys,"yd",ones(1:p)); 143 dsys = syssetsignals (sys, "yd", ones(1:p));
144 elseif(strcmp(opt,"ex")); 144 elseif (strcmp (opt, "ex"));
145 [aa,bb,cc,dd] = sys2ss(sys); 145 [aa, bb, cc, dd] = sys2ss (sys);
146 crng= 1:n; 146 crng= 1:n;
147 drng = n+(1:nz); 147 drng = n+(1:nz);
148 148
149 ## partition state equations into continuous, imaginary subsystems 149 ## partition state equations into continuous, imaginary subsystems
150 Ac = aa(crng,crng); 150 Ac = aa(crng,crng);
151 Bc = bb(crng,:); 151 Bc = bb(crng,:);
152 if(nz == 0) 152 if (nz == 0)
153 Acd = Adc = Add = Bd = 0; 153 Acd = Adc = Add = Bd = 0;
154 else 154 else
155 Acd = aa(crng,drng); 155 Acd = aa(crng,drng);
156 Adc = aa(drng,crng); 156 Adc = aa(drng,crng);
157 Add = aa(drng,drng); 157 Add = aa(drng,drng);
159 Bc = [Bc, Acd]; ## append discrete states as inputs to cont system 159 Bc = [Bc, Acd]; ## append discrete states as inputs to cont system
160 endif 160 endif
161 161
162 ## convert state equations 162 ## convert state equations
163 mat = [Ac, Bc; zeros(m+nz,n+nz+m)]; 163 mat = [Ac, Bc; zeros(m+nz,n+nz+m)];
164 matexp = expm(mat * T); 164 matexp = expm (mat * T);
165 165
166 ## replace Ac 166 ## replace Ac
167 aa(crng,crng) = matexp(crng,crng); ## discretized homegenous diff eqn 167 aa(crng,crng) = matexp(crng,crng); ## discretized homegenous diff eqn
168 168
169 ## replace Bc 169 ## replace Bc
170 bb(crng,:) = matexp(crng,n+(1:m)); 170 bb(crng,:) = matexp(crng,n+(1:m));
171 171
172 ## replace Acd 172 ## replace Acd
173 if(nz) 173 if (nz)
174 aa(crng,drng) = matexp(crng,n+m+(1:nz)); 174 aa(crng,drng) = matexp(crng,n+m+(1:nz));
175 end 175 end
176 176
177 stnames = sysgetsignals(sys,"st"); ## continuous states renamed below 177 stnames = sysgetsignals (sys, "st"); ## continuous states renamed below
178 innames = sysgetsignals(sys,"in"); 178 innames = sysgetsignals (sys, "in");
179 outnames = sysgetsignals(sys,"out"); 179 outnames = sysgetsignals (sys, "out");
180 outlist = 1:p; 180 outlist = 1:p;
181 dsys = ss(aa,bb,cc,dd,T,0,n+nz,stnames,innames, ... 181 dsys = ss (aa, bb, cc, dd, T, 0, n+nz, stnames, innames,
182 outnames,outlist); 182 outnames, outlist);
183 ## rename states 183 ## rename states
184 for ii=1:n 184 for ii = 1:n
185 strval = sprintf("%s_d",sysgetsignals(dsys,"st",ii,1)); 185 strval = sprintf ("%s_d", sysgetsignals (dsys, "st", ii, 1));
186 dsys = syssetsignals(dsys,"st",strval,ii); 186 dsys = syssetsignals (dsys, "st", strval, ii);
187 endfor 187 endfor
188 188
189 elseif(strcmp(opt,"bi")) 189 elseif (strcmp (opt, "bi"))
190 if(is_digital(sys)) 190 if (is_digital (sys))
191 error("c2d: system is already digital") 191 error ("c2d: system is already digital")
192 else 192 else
193 ## convert with bilinear transform 193 ## convert with bilinear transform
194 [a,b,c,d,tsam,n,nz,stname,inname,outname,yd] = sys2ss(sys); 194 [a, b, c, d, tsam, n, nz, stname, inname, outname, yd] = sys2ss (sys);
195 IT = (2/T)*eye(size(a)); 195 IT = (2/T) * eye (size (a));
196 A = (IT+a)/(IT-a); 196 A = (IT+a)/(IT-a);
197 iab = (IT-a)\b; 197 iab = (IT-a)\b;
198 tk=2/sqrt(T); 198 tk = 2 / sqrt (T);
199 B = tk*iab; 199 B = tk*iab;
200 C = tk*(c/(IT-a)); 200 C = tk*(c/(IT-a));
201 D = d + (c*iab); 201 D = d + (c*iab);
202 stnamed = strappend(stname,"_d"); 202 stnamed = strappend (stname, "_d");
203 dsys = ss(A,B,C,D,T,0,rows(A),stnamed,inname,outname); 203 dsys = ss (A, B, C, D, T, 0, rows (A), stnamed, inname, outname);
204 endif 204 endif
205 elseif(strcmp(opt,"matched")) 205 elseif (strcmp (opt, "matched"))
206 if(is_digital(sys)) 206 if (is_digital (sys))
207 error("c2d: system is already digital"); 207 error ("c2d: system is already digital");
208 elseif((length(sys.inname) != 1) || (length(sys.outname) != 1)) 208 elseif (length (sys.inname) != 1 || length (sys.outname) != 1)
209 error("c2d: system in not single input, single output"); 209 error ("c2d: system in not single input, single output");
210 else 210 else
211 sys = sysupdate(sys,"zp"); 211 sys = sysupdate (sys, "zp");
212 p = exp(sys.pol*T); 212 p = exp (sys.pol*T);
213 z = exp(sys.zer*T); 213 z = exp (sys.zer*T);
214 infinite_zeros = max(size(sys.pol))-max(size(sys.zer))-1; 214 infinite_zeros = max (size (sys.pol)) - max (size (sys.zer)) - 1;
215 for i = 1:infinite_zeros 215 for i = 1:infinite_zeros
216 z = [z ; -1]; 216 z = [z ; -1];
217 endfor 217 endfor
218 ## Should the freaquency we adjust around always be 1? 218 ## Should the freaquency we adjust around always be 1?
219 [cmag,cphase,cw] = bode(sys,1); 219 [cmag, cphase, cw] = bode (sys, 1);
220 [dmag,dpahse,dw] = bode(zp(z,p,1,T),1); 220 [dmag, dpahse, dw] = bode (zp (z, p, 1, T), 1);
221 dsys = zp(z,p,cmag/dmag,T); 221 dsys = zp (z, p, cmag/dmag, T);
222 endif 222 endif
223 else 223 else
224 error ("invalid option = %s", opt); 224 error ("invalid option = %s", opt);
225 endif 225 endif
226 226
227 endfunction 227 endfunction