comparison scripts/control/base/__freqresp__.m @ 5568:e9cde940b271

[project @ 2005-12-08 02:28:22 by jwe]
author jwe
date Thu, 08 Dec 2005 02:28:22 +0000
parents 4c8a2e4e0717
children 34f96dd5441b
comparison
equal deleted inserted replaced
5567:80e629357483 5568:e9cde940b271
45 45
46 function [ff, w] = __freqresp__ (sys, USEW, w); 46 function [ff, w] = __freqresp__ (sys, USEW, w);
47 47
48 ## SYS_INTERNAL accesses members of system data structure 48 ## SYS_INTERNAL accesses members of system data structure
49 49
50 save_warn_empty_list_elements = warn_empty_list_elements; 50 ## Check Args
51 unwind_protect 51 if ((nargin < 2) || (nargin > 4))
52 warn_empty_list_elements = 0; 52 usage ("[ff, w] = __freqresp__ (sys, USEW, w)");
53 elseif (USEW & (nargin < 3) )
54 error ("USEW = 1 but w was not passed.");
55 elseif (USEW & isempty(w))
56 warning("USEW = 1 but w is empty; setting USEW=0");
57 USEW = 0;
58 endif
53 59
54 ## Check Args 60 DIGITAL = is_digital(sys);
55 if ((nargin < 2) || (nargin > 4)) 61
56 usage ("[ff, w] = __freqresp__ (sys, USEW, w)"); 62 ## compute default w if needed
57 elseif (USEW & (nargin < 3) ) 63 if(!USEW)
58 error ("USEW = 1 but w was not passed."); 64 if(is_siso(sys))
59 elseif (USEW & isempty(w)) 65 sys = sysupdate(sys,"zp");
60 warning("USEW = 1 but w is empty; setting USEW=0"); 66 [zer,pol] = sys2zp(sys);
61 USEW = 0; 67 else
68 zer = tzero(sys);
69 pol = eig(sys2ss(sys));
62 endif 70 endif
63 71
64 DIGITAL = is_digital(sys); 72 ## get default frequency range
73 [wmin,wmax] = bode_bounds(zer,pol,DIGITAL,sysgettsam(sys));
74 w = logspace(wmin,wmax,50);
75 else
76 w = reshape(w,1,length(w)); # make sure it's a row vector
77 endif
65 78
66 ## compute default w if needed 79 ## now get complex values of s or z
67 if(!USEW) 80 if(DIGITAL)
68 if(is_siso(sys)) 81 jw = exp(i*w*sysgettsam(sys));
69 sys = sysupdate(sys,"zp"); 82 else
70 [zer,pol] = sys2zp(sys); 83 jw = i*w;
71 else 84 endif
72 zer = tzero(sys);
73 pol = eig(sys2ss(sys));
74 endif
75 85
76 ## get default frequency range 86 [nn,nz,mm,pp] = sysdimensions(sys);
77 [wmin,wmax] = bode_bounds(zer,pol,DIGITAL,sysgettsam(sys));
78 w = logspace(wmin,wmax,50);
79 else
80 w = reshape(w,1,length(w)); # make sure it's a row vector
81 endif
82 87
83 ## now get complex values of s or z 88 ## now compute the frequency response - divide by zero yields a warning
84 if(DIGITAL) 89 if (strcmp(sysgettype(sys),"zp"))
85 jw = exp(i*w*sysgettsam(sys)); 90 ## zero-pole form (preferred)
86 else 91 [zer,pol,sysk] = sys2zp(sys);
87 jw = i*w; 92 ff = ones(size(jw));
88 endif 93 l1 = min(length(zer)*(1-isempty(zer)),length(pol)*(1-isempty(pol)));
94 for ii=1:l1
95 ff = ff .* (jw - zer(ii)) ./ (jw - pol(ii));
96 endfor
89 97
90 [nn,nz,mm,pp] = sysdimensions(sys); 98 ## require proper transfer function, so now just get poles.
99 for ii=(l1+1):length(pol)
100 ff = ff ./ (jw - pol(ii));
101 endfor
102 ff = ff*sysk;
91 103
92 ## now compute the frequency response - divide by zero yields a warning 104 elseif (strcmp(sysgettype(sys),"tf"))
93 if (strcmp(sysgettype(sys),"zp")) 105 ## transfer function form
94 ## zero-pole form (preferred) 106 [num,den] = sys2tf(sys);
95 [zer,pol,sysk] = sys2zp(sys); 107 ff = polyval(num,jw)./polyval(den,jw);
96 ff = ones(size(jw)); 108 elseif (mm==pp)
97 l1 = min(length(zer)*(1-isempty(zer)),length(pol)*(1-isempty(pol))); 109 ## The system is square; do state-space form bode plot
98 for ii=1:l1 110 [sysa,sysb,sysc,sysd,tsam,sysn,sysnz] = sys2ss(sys);
99 ff = ff .* (jw - zer(ii)) ./ (jw - pol(ii)); 111 n = sysn + sysnz;
100 endfor 112 for ii=1:length(jw);
113 ff(ii) = det(sysc*((jw(ii).*eye(n)-sysa)\sysb)+sysd);
114 endfor;
115 else
116 ## Must be state space... bode
117 [sysa,sysb,sysc,sysd,tsam,sysn,sysnz] = sys2ss(sys);
118 n = sysn + sysnz;
119 for ii=1:length(jw);
120 ff(ii) = norm(sysc*((jw(ii)*eye(n)-sysa)\sysb)+sysd);
121 endfor
101 122
102 ## require proper transfer function, so now just get poles. 123 endif
103 for ii=(l1+1):length(pol)
104 ff = ff ./ (jw - pol(ii));
105 endfor
106 ff = ff*sysk;
107 124
108 elseif (strcmp(sysgettype(sys),"tf")) 125 w = reshape(w,1,length(w));
109 ## transfer function form 126 ff = reshape(ff,1,length(ff));
110 [num,den] = sys2tf(sys);
111 ff = polyval(num,jw)./polyval(den,jw);
112 elseif (mm==pp)
113 ## The system is square; do state-space form bode plot
114 [sysa,sysb,sysc,sysd,tsam,sysn,sysnz] = sys2ss(sys);
115 n = sysn + sysnz;
116 for ii=1:length(jw);
117 ff(ii) = det(sysc*((jw(ii).*eye(n)-sysa)\sysb)+sysd);
118 endfor;
119 else
120 ## Must be state space... bode
121 [sysa,sysb,sysc,sysd,tsam,sysn,sysnz] = sys2ss(sys);
122 n = sysn + sysnz;
123 for ii=1:length(jw);
124 ff(ii) = norm(sysc*((jw(ii)*eye(n)-sysa)\sysb)+sysd);
125 endfor
126
127 endif
128
129 w = reshape(w,1,length(w));
130 ff = reshape(ff,1,length(ff));
131
132 unwind_protect_cleanup
133 warn_empty_list_elements = save_warn_empty_list_elements;
134 end_unwind_protect
135 127
136 endfunction 128 endfunction
137 129