annotate scripts/control/base/__freqresp__.m @ 11921:166a195399f7 release-3-0-x

[project @ 2008-01-04 18:18:22 by jwe]
author jwe
date Fri, 16 Jan 2009 08:07:05 +0100
parents 4a375de63f66
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
7017
a1dbe9d80eee [project @ 2007-10-12 21:27:11 by jwe]
jwe
parents: 7016
diff changeset
1 ## Copyright (C) 1996, 1998, 2000, 2003, 2004, 2005, 2006, 2007
a1dbe9d80eee [project @ 2007-10-12 21:27:11 by jwe]
jwe
parents: 7016
diff changeset
2 ## Auburn University. All rights reserved.
3437
3c609681b2bf [project @ 2000-01-14 06:00:00 by jwe]
jwe
parents:
diff changeset
3 ##
3c609681b2bf [project @ 2000-01-14 06:00:00 by jwe]
jwe
parents:
diff changeset
4 ## This file is part of Octave.
3c609681b2bf [project @ 2000-01-14 06:00:00 by jwe]
jwe
parents:
diff changeset
5 ##
3c609681b2bf [project @ 2000-01-14 06:00:00 by jwe]
jwe
parents:
diff changeset
6 ## Octave is free software; you can redistribute it and/or modify it
7016
93c65f2a5668 [project @ 2007-10-12 06:40:56 by jwe]
jwe
parents: 6945
diff changeset
7 ## under the terms of the GNU General Public License as published by
93c65f2a5668 [project @ 2007-10-12 06:40:56 by jwe]
jwe
parents: 6945
diff changeset
8 ## the Free Software Foundation; either version 3 of the License, or (at
93c65f2a5668 [project @ 2007-10-12 06:40:56 by jwe]
jwe
parents: 6945
diff changeset
9 ## your option) any later version.
3437
3c609681b2bf [project @ 2000-01-14 06:00:00 by jwe]
jwe
parents:
diff changeset
10 ##
7016
93c65f2a5668 [project @ 2007-10-12 06:40:56 by jwe]
jwe
parents: 6945
diff changeset
11 ## Octave is distributed in the hope that it will be useful, but
93c65f2a5668 [project @ 2007-10-12 06:40:56 by jwe]
jwe
parents: 6945
diff changeset
12 ## WITHOUT ANY WARRANTY; without even the implied warranty of
93c65f2a5668 [project @ 2007-10-12 06:40:56 by jwe]
jwe
parents: 6945
diff changeset
13 ## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
93c65f2a5668 [project @ 2007-10-12 06:40:56 by jwe]
jwe
parents: 6945
diff changeset
14 ## General Public License for more details.
3437
3c609681b2bf [project @ 2000-01-14 06:00:00 by jwe]
jwe
parents:
diff changeset
15 ##
3c609681b2bf [project @ 2000-01-14 06:00:00 by jwe]
jwe
parents:
diff changeset
16 ## You should have received a copy of the GNU General Public License
7016
93c65f2a5668 [project @ 2007-10-12 06:40:56 by jwe]
jwe
parents: 6945
diff changeset
17 ## along with Octave; see the file COPYING. If not, see
93c65f2a5668 [project @ 2007-10-12 06:40:56 by jwe]
jwe
parents: 6945
diff changeset
18 ## <http://www.gnu.org/licenses/>.
3437
3c609681b2bf [project @ 2000-01-14 06:00:00 by jwe]
jwe
parents:
diff changeset
19
6945
6bbf56a9718a [project @ 2007-10-02 20:47:22 by jwe]
jwe
parents: 6046
diff changeset
20 ## Undocumented internal function.
6bbf56a9718a [project @ 2007-10-02 20:47:22 by jwe]
jwe
parents: 6046
diff changeset
21
3437
3c609681b2bf [project @ 2000-01-14 06:00:00 by jwe]
jwe
parents:
diff changeset
22 ## -*- texinfo -*-
3500
7923abdeb4e5 [project @ 2000-01-31 06:35:00 by jwe]
jwe
parents: 3438
diff changeset
23 ## @deftypefn {Function File} {} __freqresp__ (@var{sys}, @var{USEW}, @var{w})
5016
bdbee5282954 [project @ 2004-09-22 02:50:35 by jwe]
jwe
parents: 4460
diff changeset
24 ## Frequency response function - used internally by @command{bode}, @command{nyquist}.
bdbee5282954 [project @ 2004-09-22 02:50:35 by jwe]
jwe
parents: 4460
diff changeset
25 ## minimal argument checking; ``do not attempt to do this at home''.
3437
3c609681b2bf [project @ 2000-01-14 06:00:00 by jwe]
jwe
parents:
diff changeset
26 ##
3c609681b2bf [project @ 2000-01-14 06:00:00 by jwe]
jwe
parents:
diff changeset
27 ## @strong{Inputs}
3c609681b2bf [project @ 2000-01-14 06:00:00 by jwe]
jwe
parents:
diff changeset
28 ## @table @var
3c609681b2bf [project @ 2000-01-14 06:00:00 by jwe]
jwe
parents:
diff changeset
29 ## @item sys
3c609681b2bf [project @ 2000-01-14 06:00:00 by jwe]
jwe
parents:
diff changeset
30 ## system data structure
3c609681b2bf [project @ 2000-01-14 06:00:00 by jwe]
jwe
parents:
diff changeset
31 ## @item USEW
3c609681b2bf [project @ 2000-01-14 06:00:00 by jwe]
jwe
parents:
diff changeset
32 ## returned by @code{freqchkw}
3c609681b2bf [project @ 2000-01-14 06:00:00 by jwe]
jwe
parents:
diff changeset
33 ## @item optional
3c609681b2bf [project @ 2000-01-14 06:00:00 by jwe]
jwe
parents:
diff changeset
34 ## must be present if @var{USEW} is true (nonzero)
3c609681b2bf [project @ 2000-01-14 06:00:00 by jwe]
jwe
parents:
diff changeset
35 ## @end table
3c609681b2bf [project @ 2000-01-14 06:00:00 by jwe]
jwe
parents:
diff changeset
36 ## @strong{Outputs}
3c609681b2bf [project @ 2000-01-14 06:00:00 by jwe]
jwe
parents:
diff changeset
37 ## @table @var
3c609681b2bf [project @ 2000-01-14 06:00:00 by jwe]
jwe
parents:
diff changeset
38 ## @item @var{out}
5016
bdbee5282954 [project @ 2004-09-22 02:50:35 by jwe]
jwe
parents: 4460
diff changeset
39 ## vector of finite @math{G(j*w)} entries (or @math{||G(j*w)||} for @acronym{MIMO})
3437
3c609681b2bf [project @ 2000-01-14 06:00:00 by jwe]
jwe
parents:
diff changeset
40 ## @item w
3c609681b2bf [project @ 2000-01-14 06:00:00 by jwe]
jwe
parents:
diff changeset
41 ## vector of corresponding frequencies
3c609681b2bf [project @ 2000-01-14 06:00:00 by jwe]
jwe
parents:
diff changeset
42 ## @end table
3c609681b2bf [project @ 2000-01-14 06:00:00 by jwe]
jwe
parents:
diff changeset
43 ## @end deftypefn
3c609681b2bf [project @ 2000-01-14 06:00:00 by jwe]
jwe
parents:
diff changeset
44
3c609681b2bf [project @ 2000-01-14 06:00:00 by jwe]
jwe
parents:
diff changeset
45 ## Author: R. Bruce Tenison <btenison@eng.auburn.edu>
3c609681b2bf [project @ 2000-01-14 06:00:00 by jwe]
jwe
parents:
diff changeset
46 ## Created: July 11, 1994
3c609681b2bf [project @ 2000-01-14 06:00:00 by jwe]
jwe
parents:
diff changeset
47
3438
2e06c3941943 [project @ 2000-01-14 06:33:18 by jwe]
jwe
parents: 3437
diff changeset
48 function [ff, w] = __freqresp__ (sys, USEW, w);
3437
3c609681b2bf [project @ 2000-01-14 06:00:00 by jwe]
jwe
parents:
diff changeset
49
3c609681b2bf [project @ 2000-01-14 06:00:00 by jwe]
jwe
parents:
diff changeset
50 ## SYS_INTERNAL accesses members of system data structure
3c609681b2bf [project @ 2000-01-14 06:00:00 by jwe]
jwe
parents:
diff changeset
51
5568
e9cde940b271 [project @ 2005-12-08 02:28:22 by jwe]
jwe
parents: 5307
diff changeset
52 ## Check Args
7126
4a375de63f66 [project @ 2007-11-08 03:44:14 by jwe]
jwe
parents: 7017
diff changeset
53 if (nargin < 2 || nargin > 4)
6046
34f96dd5441b [project @ 2006-10-10 16:10:25 by jwe]
jwe
parents: 5568
diff changeset
54 print_usage ();
7126
4a375de63f66 [project @ 2007-11-08 03:44:14 by jwe]
jwe
parents: 7017
diff changeset
55 elseif (USEW && nargin < 3)
5568
e9cde940b271 [project @ 2005-12-08 02:28:22 by jwe]
jwe
parents: 5307
diff changeset
56 error ("USEW = 1 but w was not passed.");
7126
4a375de63f66 [project @ 2007-11-08 03:44:14 by jwe]
jwe
parents: 7017
diff changeset
57 elseif (USEW && isempty (w))
4a375de63f66 [project @ 2007-11-08 03:44:14 by jwe]
jwe
parents: 7017
diff changeset
58 warning ("USEW = 1 but w is empty; setting USEW=0");
5568
e9cde940b271 [project @ 2005-12-08 02:28:22 by jwe]
jwe
parents: 5307
diff changeset
59 USEW = 0;
e9cde940b271 [project @ 2005-12-08 02:28:22 by jwe]
jwe
parents: 5307
diff changeset
60 endif
4460
cef48c4b902d [project @ 2003-07-11 18:37:48 by jwe]
jwe
parents: 3500
diff changeset
61
7126
4a375de63f66 [project @ 2007-11-08 03:44:14 by jwe]
jwe
parents: 7017
diff changeset
62 DIGITAL = is_digital (sys);
4460
cef48c4b902d [project @ 2003-07-11 18:37:48 by jwe]
jwe
parents: 3500
diff changeset
63
5568
e9cde940b271 [project @ 2005-12-08 02:28:22 by jwe]
jwe
parents: 5307
diff changeset
64 ## compute default w if needed
7126
4a375de63f66 [project @ 2007-11-08 03:44:14 by jwe]
jwe
parents: 7017
diff changeset
65 if (! USEW)
4a375de63f66 [project @ 2007-11-08 03:44:14 by jwe]
jwe
parents: 7017
diff changeset
66 if (is_siso (sys))
4a375de63f66 [project @ 2007-11-08 03:44:14 by jwe]
jwe
parents: 7017
diff changeset
67 sys = sysupdate (sys, "zp");
4a375de63f66 [project @ 2007-11-08 03:44:14 by jwe]
jwe
parents: 7017
diff changeset
68 [zer, pol] = sys2zp (sys);
5568
e9cde940b271 [project @ 2005-12-08 02:28:22 by jwe]
jwe
parents: 5307
diff changeset
69 else
7126
4a375de63f66 [project @ 2007-11-08 03:44:14 by jwe]
jwe
parents: 7017
diff changeset
70 zer = tzero (sys);
4a375de63f66 [project @ 2007-11-08 03:44:14 by jwe]
jwe
parents: 7017
diff changeset
71 pol = eig (sys2ss (sys));
3437
3c609681b2bf [project @ 2000-01-14 06:00:00 by jwe]
jwe
parents:
diff changeset
72 endif
3c609681b2bf [project @ 2000-01-14 06:00:00 by jwe]
jwe
parents:
diff changeset
73
5568
e9cde940b271 [project @ 2005-12-08 02:28:22 by jwe]
jwe
parents: 5307
diff changeset
74 ## get default frequency range
7126
4a375de63f66 [project @ 2007-11-08 03:44:14 by jwe]
jwe
parents: 7017
diff changeset
75 [wmin, wmax] = bode_bounds (zer, pol, DIGITAL, sysgettsam (sys));
4a375de63f66 [project @ 2007-11-08 03:44:14 by jwe]
jwe
parents: 7017
diff changeset
76 w = logspace (wmin, wmax, 50);
5568
e9cde940b271 [project @ 2005-12-08 02:28:22 by jwe]
jwe
parents: 5307
diff changeset
77 else
7126
4a375de63f66 [project @ 2007-11-08 03:44:14 by jwe]
jwe
parents: 7017
diff changeset
78 w = reshape (w, 1, length (w)); # make sure it's a row vector
5568
e9cde940b271 [project @ 2005-12-08 02:28:22 by jwe]
jwe
parents: 5307
diff changeset
79 endif
3437
3c609681b2bf [project @ 2000-01-14 06:00:00 by jwe]
jwe
parents:
diff changeset
80
5568
e9cde940b271 [project @ 2005-12-08 02:28:22 by jwe]
jwe
parents: 5307
diff changeset
81 ## now get complex values of s or z
7126
4a375de63f66 [project @ 2007-11-08 03:44:14 by jwe]
jwe
parents: 7017
diff changeset
82 if (DIGITAL)
4a375de63f66 [project @ 2007-11-08 03:44:14 by jwe]
jwe
parents: 7017
diff changeset
83 jw = exp (i*w*sysgettsam(sys));
5568
e9cde940b271 [project @ 2005-12-08 02:28:22 by jwe]
jwe
parents: 5307
diff changeset
84 else
e9cde940b271 [project @ 2005-12-08 02:28:22 by jwe]
jwe
parents: 5307
diff changeset
85 jw = i*w;
e9cde940b271 [project @ 2005-12-08 02:28:22 by jwe]
jwe
parents: 5307
diff changeset
86 endif
e9cde940b271 [project @ 2005-12-08 02:28:22 by jwe]
jwe
parents: 5307
diff changeset
87
7126
4a375de63f66 [project @ 2007-11-08 03:44:14 by jwe]
jwe
parents: 7017
diff changeset
88 [nn, nz, mm, pp] = sysdimensions (sys);
5568
e9cde940b271 [project @ 2005-12-08 02:28:22 by jwe]
jwe
parents: 5307
diff changeset
89
e9cde940b271 [project @ 2005-12-08 02:28:22 by jwe]
jwe
parents: 5307
diff changeset
90 ## now compute the frequency response - divide by zero yields a warning
7126
4a375de63f66 [project @ 2007-11-08 03:44:14 by jwe]
jwe
parents: 7017
diff changeset
91 if (strcmp (sysgettype (sys), "zp"))
5568
e9cde940b271 [project @ 2005-12-08 02:28:22 by jwe]
jwe
parents: 5307
diff changeset
92 ## zero-pole form (preferred)
7126
4a375de63f66 [project @ 2007-11-08 03:44:14 by jwe]
jwe
parents: 7017
diff changeset
93 [zer, pol, sysk] = sys2zp (sys);
4a375de63f66 [project @ 2007-11-08 03:44:14 by jwe]
jwe
parents: 7017
diff changeset
94 ff = ones (size (jw));
4a375de63f66 [project @ 2007-11-08 03:44:14 by jwe]
jwe
parents: 7017
diff changeset
95 l1 = min (length(zer)*(1-isempty(zer)), length(pol)*(1-isempty(pol)));
4a375de63f66 [project @ 2007-11-08 03:44:14 by jwe]
jwe
parents: 7017
diff changeset
96 for ii = 1:l1
4a375de63f66 [project @ 2007-11-08 03:44:14 by jwe]
jwe
parents: 7017
diff changeset
97 ff = ff .* (jw - zer(ii)) ./ (jw - pol(ii));
5568
e9cde940b271 [project @ 2005-12-08 02:28:22 by jwe]
jwe
parents: 5307
diff changeset
98 endfor
3437
3c609681b2bf [project @ 2000-01-14 06:00:00 by jwe]
jwe
parents:
diff changeset
99
5568
e9cde940b271 [project @ 2005-12-08 02:28:22 by jwe]
jwe
parents: 5307
diff changeset
100 ## require proper transfer function, so now just get poles.
7126
4a375de63f66 [project @ 2007-11-08 03:44:14 by jwe]
jwe
parents: 7017
diff changeset
101 for ii = (l1+1):length(pol)
5568
e9cde940b271 [project @ 2005-12-08 02:28:22 by jwe]
jwe
parents: 5307
diff changeset
102 ff = ff ./ (jw - pol(ii));
e9cde940b271 [project @ 2005-12-08 02:28:22 by jwe]
jwe
parents: 5307
diff changeset
103 endfor
e9cde940b271 [project @ 2005-12-08 02:28:22 by jwe]
jwe
parents: 5307
diff changeset
104 ff = ff*sysk;
7126
4a375de63f66 [project @ 2007-11-08 03:44:14 by jwe]
jwe
parents: 7017
diff changeset
105 elseif (strcmp (sysgettype (sys), "tf"))
5568
e9cde940b271 [project @ 2005-12-08 02:28:22 by jwe]
jwe
parents: 5307
diff changeset
106 ## transfer function form
7126
4a375de63f66 [project @ 2007-11-08 03:44:14 by jwe]
jwe
parents: 7017
diff changeset
107 [num, den] = sys2tf (sys);
4a375de63f66 [project @ 2007-11-08 03:44:14 by jwe]
jwe
parents: 7017
diff changeset
108 ff = polyval (num, jw) ./ polyval (den, jw);
5568
e9cde940b271 [project @ 2005-12-08 02:28:22 by jwe]
jwe
parents: 5307
diff changeset
109 elseif (mm==pp)
e9cde940b271 [project @ 2005-12-08 02:28:22 by jwe]
jwe
parents: 5307
diff changeset
110 ## The system is square; do state-space form bode plot
7126
4a375de63f66 [project @ 2007-11-08 03:44:14 by jwe]
jwe
parents: 7017
diff changeset
111 [sysa, sysb, sysc, sysd, tsam, sysn, sysnz] = sys2ss (sys);
5568
e9cde940b271 [project @ 2005-12-08 02:28:22 by jwe]
jwe
parents: 5307
diff changeset
112 n = sysn + sysnz;
7126
4a375de63f66 [project @ 2007-11-08 03:44:14 by jwe]
jwe
parents: 7017
diff changeset
113 for ii = 1:length(jw);
4a375de63f66 [project @ 2007-11-08 03:44:14 by jwe]
jwe
parents: 7017
diff changeset
114 ff(ii) = det (sysc*((jw(ii).*eye(n)-sysa)\sysb)+sysd);
4a375de63f66 [project @ 2007-11-08 03:44:14 by jwe]
jwe
parents: 7017
diff changeset
115 endfor
5568
e9cde940b271 [project @ 2005-12-08 02:28:22 by jwe]
jwe
parents: 5307
diff changeset
116 else
e9cde940b271 [project @ 2005-12-08 02:28:22 by jwe]
jwe
parents: 5307
diff changeset
117 ## Must be state space... bode
7126
4a375de63f66 [project @ 2007-11-08 03:44:14 by jwe]
jwe
parents: 7017
diff changeset
118 [sysa, sysb, sysc, sysd, tsam, sysn, sysnz] = sys2ss (sys);
5568
e9cde940b271 [project @ 2005-12-08 02:28:22 by jwe]
jwe
parents: 5307
diff changeset
119 n = sysn + sysnz;
7126
4a375de63f66 [project @ 2007-11-08 03:44:14 by jwe]
jwe
parents: 7017
diff changeset
120 for ii = 1:length(jw);
4a375de63f66 [project @ 2007-11-08 03:44:14 by jwe]
jwe
parents: 7017
diff changeset
121 ff(ii) = norm (sysc*((jw(ii)*eye(n)-sysa)\sysb)+sysd);
5568
e9cde940b271 [project @ 2005-12-08 02:28:22 by jwe]
jwe
parents: 5307
diff changeset
122 endfor
e9cde940b271 [project @ 2005-12-08 02:28:22 by jwe]
jwe
parents: 5307
diff changeset
123 endif
4460
cef48c4b902d [project @ 2003-07-11 18:37:48 by jwe]
jwe
parents: 3500
diff changeset
124
7126
4a375de63f66 [project @ 2007-11-08 03:44:14 by jwe]
jwe
parents: 7017
diff changeset
125 w = reshape (w, 1, length (w));
4a375de63f66 [project @ 2007-11-08 03:44:14 by jwe]
jwe
parents: 7017
diff changeset
126 ff = reshape (ff, 1, length (ff));
3437
3c609681b2bf [project @ 2000-01-14 06:00:00 by jwe]
jwe
parents:
diff changeset
127
3c609681b2bf [project @ 2000-01-14 06:00:00 by jwe]
jwe
parents:
diff changeset
128 endfunction
3c609681b2bf [project @ 2000-01-14 06:00:00 by jwe]
jwe
parents:
diff changeset
129