From: <par...@us...> - 2012-09-14 11:44:46
|
Revision: 11012 http://octave.svn.sourceforge.net/octave/?rev=11012&view=rev Author: paramaniac Date: 2012-09-14 11:44:35 +0000 (Fri, 14 Sep 2012) Log Message: ----------- control: cleaning up Modified Paths: -------------- trunk/octave-forge/main/control/devel/multiplot.m trunk/octave-forge/main/control/devel/multiplot2.m Removed Paths: ------------- trunk/octave-forge/main/control/devel/__frequency_response_2__.m trunk/octave-forge/main/control/devel/__frequency_vector_2__.m trunk/octave-forge/main/control/devel/bode2.m trunk/octave-forge/main/control/devel/nyquist2.m Deleted: trunk/octave-forge/main/control/devel/__frequency_response_2__.m =================================================================== --- trunk/octave-forge/main/control/devel/__frequency_response_2__.m 2012-09-14 11:40:39 UTC (rev 11011) +++ trunk/octave-forge/main/control/devel/__frequency_response_2__.m 2012-09-14 11:44:35 UTC (rev 11012) @@ -1,67 +0,0 @@ -## Copyright (C) 2009, 2010, 2012 Lukas F. Reichlin -## -## This file is part of LTI Syncope. -## -## LTI Syncope is free software: you can redistribute it and/or modify -## it under the terms of the GNU General Public License as published by -## the Free Software Foundation, either version 3 of the License, or -## (at your option) any later version. -## -## LTI Syncope is distributed in the hope that it will be useful, -## but WITHOUT ANY WARRANTY; without even the implied warranty of -## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -## GNU General Public License for more details. -## -## You should have received a copy of the GNU General Public License -## along with LTI Syncope. If not, see <http://www.gnu.org/licenses/>. - -## -*- texinfo -*- -## Return frequency response H and frequency vector w. -## If w is empty, it will be calculated by __frequency_vector__. - -## Author: Lukas Reichlin <luk...@gm...> -## Created: November 2009 -## Version: 0.5 - -function [H, w] = __frequency_response_2__ (args, mimoflag = 0, resptype = 0, wbounds = "std", cellflag = false) - - %if (! iscell (args)) - % args = {args}; - %endif - - sys_idx = cellfun (@isa, args, {"lti"}); # look for LTI models - w_idx = cellfun (@is_real_vector, args); # look for frequency vectors - r_idx = cellfun (@iscell, args); # look for frequency ranges {wmin, wmax} - - sys_cell = args(sys_idx); # extract LTI models - frd_idx = cellfun (@isa, sys_cell, {"frd"}); # look for FRD models - - ## check arguments - if (! mimoflag && ! all (cellfun (@issiso, sys_cell))) - error ("frequency_response: require SISO systems"); - endif - - ## determine frequencies - if (any (r_idx)) # if there are frequency ranges - r = args(r_idx){end}; # take the last one - if (numel (r) == 2 && issample (r{1}) && issample (r{2})) - w = __frequency_vector_2__ (sys_cell, wbounds, r{1}, r{2}); - else - error ("frequency_response: invalid cell"); - endif - elseif (any (w_idx)) # are there any frequency vectors? - w = args(w_idx){end}; - else # there are neither frequency ranges nor vectors - w = __frequency_vector_2__ (sys_cell, wbounds); - endif - - w_frd = w(frd_idx); # temporarily save frequency vectors of FRD models - w(frd_idx) = {[]}; # freqresp returns all frequencies of FRD models for w=[] - - ## compute frequency response H for all LTI models - H = cellfun (@__freqresp__, sys_cell, w, {resptype}, {cellflag}, "uniformoutput", false); - - ## restore frequency vectors of FRD models in w - w(frd_idx) = w_frd; - -endfunction Deleted: trunk/octave-forge/main/control/devel/__frequency_vector_2__.m =================================================================== --- trunk/octave-forge/main/control/devel/__frequency_vector_2__.m 2012-09-14 11:40:39 UTC (rev 11011) +++ trunk/octave-forge/main/control/devel/__frequency_vector_2__.m 2012-09-14 11:44:35 UTC (rev 11012) @@ -1,196 +0,0 @@ -## Copyright (C) 1996, 2000, 2004, 2005, 2006, 2007 -## Auburn University. All rights reserved. -## Copyright (C) 2009 - 2012 Lukas F. Reichlin -## -## This program is free software; you can redistribute it and/or modify it -## under the terms of the GNU General Public License as published by -## the Free Software Foundation; either version 3 of the License, or (at -## your option) any later version. -## -## This program is distributed in the hope that it will be useful, but -## WITHOUT ANY WARRANTY; without even the implied warranty of -## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -## General Public License for more details. -## -## You should have received a copy of the GNU General Public License -## along with this program; see the file COPYING. If not, see -## <http://www.gnu.org/licenses/>. - -## -*- texinfo -*- -## @deftypefn {Function File} {@var{w} =} __frequency_vector__ (@var{sys}) -## Get default range of frequencies based on cutoff frequencies of system -## poles and zeros. -## Frequency range is the interval -## @iftex -## @tex -## $ [ 10^{w_{min}}, 10^{w_{max}} ] $ -## @end tex -## @end iftex -## @ifnottex -## [10^@var{wmin}, 10^@var{wmax}] -## @end ifnottex -## -## Used by @command{__frequency_response__} -## @end deftypefn - -## Adapted-By: Lukas Reichlin <luk...@gm...> -## Date: October 2009 -## Version: 0.3 - -function w = __frequency_vector_2__ (sys_cell, wbounds = "std", wmin, wmax) - - isc = iscell (sys_cell); - - if (! isc) # __sys2frd__ methods pass LTI models not in cells - sys_cell = {sys_cell} - endif - - idx = cellfun (@(x) isa (x, "lti"), sys_cell); - sys_cell = sys_cell(idx); - len = numel (sys_cell); - - [dec_min, dec_max, zp] = cellfun (@__frequency_range__, sys_cell, {wbounds}, "uniformoutput", false); - - if (strcmpi (wbounds, "std")) # plots with explicit frequencies - - if (nargin == 2) - dec_min = min (cell2mat (dec_min)); - dec_max = max (cell2mat (dec_max)); - elseif (nargin == 4) # w = {wmin, wmax} - dec_min = log10 (wmin); - dec_max = log10 (wmax); - else - print_usage (); - endif - - zp = horzcat (zp{:}); - - ## include zeros and poles for nice peaks in plots - idx = find (zp > 10^dec_min & zp < 10^dec_max); - zp = zp(idx); - - w = logspace (dec_min, dec_max, 500); - w = unique ([w, zp]); # unique also sorts frequency vector - - w = repmat ({w}, 1, len); # return cell of frequency vectors - - elseif (strcmpi (wbounds, "ext")) # plots with implicit frequencies - - if (nargin == 4) - dec_min = repmat ({log10 (wmin)}, 1, len); - dec_max = repmat ({log10 (wmax)}, 1, len); - endif - - idx = cellfun (@(zp, dec_min, dec_max) find (zp > 10^dec_min & zp < 10^dec_max), \ - zp, dec_min, dec_max, "uniformoutput", false); - zp = cellfun (@(zp, idx) zp(idx), zp, idx, "uniformoutput", false); - - w = cellfun (@logspace, dec_min, dec_max, {500}, "uniformoutput", false); - w = cellfun (@(w, zp) unique ([w, zp]), w, zp, "uniformoutput", false); - ## unique also sorts frequency vector - - else - error ("frequency_vector: invalid argument 'wbounds'"); - endif - - if (! isc) # for __sys2frd__ methods - w = w{1}; - endif - -endfunction - - -function [dec_min, dec_max, zp] = __frequency_range__ (sys, wbounds = "std") - - if (isa (sys, "frd")) - w = get (sys, "w"); - dec_min = log10 (w(1)); - dec_max = log10 (w(end)); - zp = []; - return; - endif - - zer = zero (sys); - pol = pole (sys); - tsam = abs (get (sys, "tsam")); # tsam could be -1 - discrete = ! isct (sys); # static gains (tsam = -2) are assumed continuous - - ## make sure zer, pol are row vectors - pol = reshape (pol, 1, []); - zer = reshape (zer, 1, []); - - ## check for natural frequencies away from omega = 0 - if (discrete) - ## The 2nd conditions prevents log(0) in the next log command - iiz = find (abs(zer-1) > norm(zer)*eps && abs(zer) > norm(zer)*eps); - iip = find (abs(pol-1) > norm(pol)*eps && abs(pol) > norm(pol)*eps); - - ## avoid dividing empty matrices, it would work but looks nasty - if (! isempty (iiz)) - czer = log (zer(iiz))/tsam; - else - czer = []; - endif - - if (! isempty (iip)) - cpol = log (pol(iip))/tsam; - else - cpol = []; - endif - else - ## continuous - iip = find (abs(pol) > norm(pol)*eps); - iiz = find (abs(zer) > norm(zer)*eps); - - if (! isempty (zer)) - czer = zer(iiz); - else - czer = []; - endif - if (! isempty (pol)) - cpol = pol(iip); - else - cpol = []; - endif - endif - - if (isempty (iip) && isempty (iiz)) - ## no poles/zeros away from omega = 0; pick defaults - dec_min = 0; # -1 - dec_max = 2; # 3 - else - dec_min = floor (log10 (min (abs ([cpol, czer])))); - dec_max = ceil (log10 (max (abs ([cpol, czer])))); - endif - - ## expand to show the entirety of the "interesting" portion of the plot - switch (wbounds) - case "std" # standard - if (dec_min == dec_max) - dec_min -= 2; - dec_max += 2; - else - dec_min--; - dec_max++; - endif - case "ext" # extended (for nyquist) - if (any (abs (pol) < sqrt (eps))) # look for integrators - ## dec_min -= 0.5; - dec_max += 2; - else - dec_min -= 2; - dec_max += 2; - endif - otherwise - error ("frequency_range: second argument invalid"); - endswitch - - ## run discrete frequency all the way to pi - if (discrete) - dec_max = log10 (pi/tsam); - endif - - ## include zeros and poles for nice peaks in plots - zp = [abs(zer), abs(pol)]; - -endfunction Deleted: trunk/octave-forge/main/control/devel/bode2.m =================================================================== --- trunk/octave-forge/main/control/devel/bode2.m 2012-09-14 11:40:39 UTC (rev 11011) +++ trunk/octave-forge/main/control/devel/bode2.m 2012-09-14 11:44:35 UTC (rev 11012) @@ -1,112 +0,0 @@ -## Copyright (C) 2009, 2010, 2011, 2012 Lukas F. Reichlin -## -## This file is part of LTI Syncope. -## -## LTI Syncope is free software: you can redistribute it and/or modify -## it under the terms of the GNU General Public License as published by -## the Free Software Foundation, either version 3 of the License, or -## (at your option) any later version. -## -## LTI Syncope is distributed in the hope that it will be useful, -## but WITHOUT ANY WARRANTY; without even the implied warranty of -## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -## GNU General Public License for more details. -## -## You should have received a copy of the GNU General Public License -## along with LTI Syncope. If not, see <http://www.gnu.org/licenses/>. - -## -*- texinfo -*- -## @deftypefn {Function File} {[@var{mag}, @var{pha}, @var{w}] =} bode (@var{sys}) -## @deftypefnx {Function File} {[@var{mag}, @var{pha}, @var{w}] =} bode (@var{sys}, @var{w}) -## Bode diagram of frequency response. If no output arguments are given, -## the response is printed on the screen. -## -## @strong{Inputs} -## @table @var -## @item sys -## LTI system. Must be a single-input and single-output (SISO) system. -## @item w -## Optional vector of frequency values. If @var{w} is not specified, -## it is calculated by the zeros and poles of the system. -## Alternatively, the cell @code{@{wmin, wmax@}} specifies a frequency range, -## where @var{wmin} and @var{wmax} denote minimum and maximum frequencies -## in rad/s. -## @end table -## -## @strong{Outputs} -## @table @var -## @item mag -## Vector of magnitude. Has length of frequency vector @var{w}. -## @item pha -## Vector of phase. Has length of frequency vector @var{w}. -## @item w -## Vector of frequency values used. -## @end table -## -## @seealso{nichols, nyquist, sigma} -## @end deftypefn - -## Author: Lukas Reichlin <luk...@gm...> -## Created: November 2009 -## Version: 0.5 - -function [mag_r, pha_r, w_r] = bode2 (varargin) - - if (nargin == 0) - print_usage (); - endif - - [H, w] = __frequency_response_2__ (varargin, false, 0, "std", false); - - H = cellfun (@reshape, H, {[]}, {1}, "uniformoutput", false); - mag = cellfun (@abs, H, "uniformoutput", false); - pha = cellfun (@(H) unwrap (arg (H)) * 180 / pi, H, "uniformoutput", false); - - if (! nargout) - mag_db = cellfun (@(mag) 20 * log10 (mag), mag, "uniformoutput", false); - - tmp = cellfun (@isa, varargin, {"lti"}); - sys_idx = find (tmp); - tmp = cellfun (@ischar, varargin); - style_idx = find (tmp); - - len = numel (H); - mag_args = {}; - pha_args = {}; - legend_args = cell (len, 1); - - for k = 1:len - if (k == len) - lim = nargin; - else - lim = sys_idx(k+1); - endif - style = varargin(style_idx(style_idx > sys_idx(k) & style_idx <= lim)); - mag_args = cat (2, mag_args, w(k), mag_db(k), style); - pha_args = cat (2, pha_args, w(k), pha(k), style); - legend_args{k} = inputname(sys_idx(k)); - endfor - - subplot (2, 1, 1) - semilogx (mag_args{:}) - axis ("tight") - ylim (__axis_margin__ (ylim)) - grid ("on") - title ("Bode Diagram") - ylabel ("Magnitude [dB]") - - subplot (2, 1, 2) - semilogx (pha_args{:}) - axis ("tight") - ylim (__axis_margin__ (ylim)) - grid ("on") - xlabel ("Frequency [rad/s]") - ylabel ("Phase [deg]") - legend (legend_args) - else - mag_r = mag{1}; - pha_r = pha{1}; - w_r = w{1}; - endif - -endfunction Modified: trunk/octave-forge/main/control/devel/multiplot.m =================================================================== --- trunk/octave-forge/main/control/devel/multiplot.m 2012-09-14 11:40:39 UTC (rev 11011) +++ trunk/octave-forge/main/control/devel/multiplot.m 2012-09-14 11:44:35 UTC (rev 11012) @@ -1,21 +1,21 @@ load tfs.dat figure (1) -bode2 (C_AH, C_opt) +bode (C_AH, C_opt) figure (2) -bode2 (5*C_AH, frd (C_AH), frd (C_opt)) +bode (5*C_AH, frd (C_AH), frd (C_opt)) % bode2 (5*C_AH, frd (C_AH, 1:10), frd (C_opt, 11:20)) figure (3) -bode2 (5*C_AH, '*r', C_AH, 'xb', C_opt, 'ok') +bode (5*C_AH, '*r', C_AH, 'xb', C_opt, 'ok') figure (4) -nyquist2 (C_AH, C_opt) +nyquist (C_AH, C_opt) figure (5) -nyquist2 (C_AH, "xr", C_opt, "ob") +nyquist (C_AH, "xr", C_opt, "ob") legend ("Test C_AH", "Test C_opt") \ No newline at end of file Modified: trunk/octave-forge/main/control/devel/multiplot2.m =================================================================== --- trunk/octave-forge/main/control/devel/multiplot2.m 2012-09-14 11:40:39 UTC (rev 11011) +++ trunk/octave-forge/main/control/devel/multiplot2.m 2012-09-14 11:44:35 UTC (rev 11012) @@ -90,8 +90,8 @@ % Bode Plot of Controller figure (1) -bode2 (K, Kr4, Kr2, w) -title ('Bode Diagrams of K and Kr') +bode (K, Kr4, Kr2, w) +% title ('Bode Diagrams of K and Kr') legend ('K (8 states)', 'Kr (4 states)', 'Kr (2 states)', 'location', 'southwest') %{ Deleted: trunk/octave-forge/main/control/devel/nyquist2.m =================================================================== --- trunk/octave-forge/main/control/devel/nyquist2.m 2012-09-14 11:40:39 UTC (rev 11011) +++ trunk/octave-forge/main/control/devel/nyquist2.m 2012-09-14 11:44:35 UTC (rev 11012) @@ -1,115 +0,0 @@ -## Copyright (C) 2009, 2010, 2012 Lukas F. Reichlin -## -## This file is part of LTI Syncope. -## -## LTI Syncope is free software: you can redistribute it and/or modify -## it under the terms of the GNU General Public License as published by -## the Free Software Foundation, either version 3 of the License, or -## (at your option) any later version. -## -## LTI Syncope is distributed in the hope that it will be useful, -## but WITHOUT ANY WARRANTY; without even the implied warranty of -## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -## GNU General Public License for more details. -## -## You should have received a copy of the GNU General Public License -## along with LTI Syncope. If not, see <http://www.gnu.org/licenses/>. - -## -*- texinfo -*- -## @deftypefn {Function File} {[@var{re}, @var{im}, @var{w}] =} nyquist (@var{sys}) -## @deftypefnx {Function File} {[@var{re}, @var{im}, @var{w}] =} nyquist (@var{sys}, @var{w}) -## Nyquist diagram of frequency response. If no output arguments are given, -## the response is printed on the screen. -## -## @strong{Inputs} -## @table @var -## @item sys -## LTI system. Must be a single-input and single-output (SISO) system. -## @item w -## Optional vector of frequency values. If @var{w} is not specified, -## it is calculated by the zeros and poles of the system. -## Alternatively, the cell @code{@{wmin, wmax@}} specifies a frequency range, -## where @var{wmin} and @var{wmax} denote minimum and maximum frequencies -## in rad/s. -## @end table -## -## @strong{Outputs} -## @table @var -## @item re -## Vector of real parts. Has length of frequency vector @var{w}. -## @item im -## Vector of imaginary parts. Has length of frequency vector @var{w}. -## @item w -## Vector of frequency values used. -## @end table -## -## @seealso{bode, nichols, sigma} -## @end deftypefn - -## Author: Lukas Reichlin <luk...@gm...> -## Created: November 2009 -## Version: 0.4 - -function [re_r, im_r, w_r] = nyquist2 (varargin) - - if (nargin == 0) - print_usage (); - endif - - [H, w] = __frequency_response_2__ (varargin, false, 0, "ext"); - - H = cellfun (@reshape, H, {[]}, {1}, "uniformoutput", false); - re = cellfun (@real, H, "uniformoutput", false); - im = cellfun (@imag, H, "uniformoutput", false); - - if (! nargout) - tmp = cellfun (@isa, varargin, {"lti"}); - sys_idx = find (tmp); - tmp = cellfun (@ischar, varargin); - style_idx = find (tmp); - - len = numel (H); - pos_args = {}; - neg_args = {}; - legend_args = cell (len, 1); - colororder = get (gca, "colororder"); - rc = rows (colororder); - - for k = 1:len - col = colororder(1+rem (k-1, rc), :); - if (k == len) - lim = nargin; - else - lim = sys_idx(k+1); - endif - style = varargin(style_idx(style_idx > sys_idx(k) & style_idx <= lim)); - if (isempty (style)) - pos_args = cat (2, pos_args, re{k}, im{k}, {"-", "color", col}); - neg_args = cat (2, neg_args, re{k}, -im{k}, {"-.", "color", col}); - else - pos_args = cat (2, pos_args, re{k}, im{k}, style); - neg_args = cat (2, neg_args, re{k}, -im{k}, style); - endif - legend_args{k} = inputname(sys_idx(k)); - endfor - - ## FIXME: pos_args = cat (2, pos_args, re{k}, im{k}, {"-", "color", col}, style); - ## doesn't work! it would be nice to have default arguments that can be - ## (partially) overwritten by user-specified plot styles. - - h = plot (pos_args{:}, neg_args{:}); - axis ("tight") - xlim (__axis_margin__ (xlim)) - ylim (__axis_margin__ (ylim)) - grid ("on") - title ("Nyquist Diagram") - xlabel ("Real Axis") - ylabel ("Imaginary Axis") - legend (h(1:len), legend_args) - else - re_r = re{1}; - im_r = im{1}; - w_r = w{1}; - endif - -endfunction This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |