From: <par...@us...> - 2012-09-14 08:24:42
|
Revision: 11006 http://octave.svn.sourceforge.net/octave/?rev=11006&view=rev Author: paramaniac Date: 2012-09-14 08:24:31 +0000 (Fri, 14 Sep 2012) Log Message: ----------- control: handle plots with implicit frequencies in backend of multiplot feature Modified Paths: -------------- trunk/octave-forge/main/control/devel/__frequency_response_2__.m trunk/octave-forge/main/control/devel/__frequency_vector_2__.m Modified: trunk/octave-forge/main/control/devel/__frequency_response_2__.m =================================================================== --- trunk/octave-forge/main/control/devel/__frequency_response_2__.m 2012-09-13 18:01:43 UTC (rev 11005) +++ trunk/octave-forge/main/control/devel/__frequency_response_2__.m 2012-09-14 08:24:31 UTC (rev 11006) @@ -55,44 +55,13 @@ w = __frequency_vector_2__ (sys_cell, wbounds); endif - w = repmat ({w}, 1, numel (sys_cell)); # return cell of frequency vectors + 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); - ## save frequency vectors of FRD models in w - w_frd = cellfun (@get, sys_cell(frd_idx), {"w"}, "uniformoutput", false); + ## restore frequency vectors of FRD models in w w(frd_idx) = w_frd; -%{ - ## check arguments - if(! isa (sys, "lti")) - error ("frequency_response: first argument sys must be an LTI system"); - endif - - if (! mimoflag && ! issiso (sys)) - error ("frequency_response: require SISO system"); - endif - - if (isa (sys, "frd")) - if (! isempty (w)) - warning ("frequency_response: second argument w is ignored"); - endif - w = get (sys, "w"); - H = __freqresp__ (sys, [], resptype, cellflag); - elseif (isempty (w)) # find interesting frequency range w if not specified - w = __frequency_vector__ (sys, wbounds); - H = __freqresp__ (sys, w, resptype, cellflag); - elseif (iscell (w) && numel (w) == 2 && issample (w{1}) && issample (w{2})) - w = __frequency_vector__ (sys, wbounds, w{1}, w{2}); - H = __freqresp__ (sys, w, resptype, cellflag); - elseif (! is_real_vector (w)) - error ("frequency_response: second argument w must be a vector of frequencies"); - else - H = __freqresp__ (sys, w, resptype, cellflag); - endif - -%} - endfunction Modified: trunk/octave-forge/main/control/devel/__frequency_vector_2__.m =================================================================== --- trunk/octave-forge/main/control/devel/__frequency_vector_2__.m 2012-09-13 18:01:43 UTC (rev 11005) +++ trunk/octave-forge/main/control/devel/__frequency_vector_2__.m 2012-09-14 08:24:31 UTC (rev 11006) @@ -35,44 +35,68 @@ ## Adapted-By: Lukas Reichlin <luk...@gm...> ## Date: October 2009 -## Version: 0.2 +## Version: 0.3 function w = __frequency_vector_2__ (sys_cell, wbounds = "std", wmin, wmax) - if (! iscell (sys_cell)) + 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 (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); + 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 - print_usage (); + error ("frequency_vector: invalid argument 'wbounds'"); 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); + if (! isc) # for __sys2frd__ methods + w = w{1}; + endif - w = logspace (dec_min, dec_max, 500); - w = unique ([w, zp]); # unique also sorts frequency vector - - ## TODO: nyquist diagrams may need individual dec_min and dec_max - ## if curve goes to infinity - - ## TODO: handle FRD models (they have fixed w), maybe frequency_response - ## is a better place for this? - endfunction @@ -88,8 +112,8 @@ 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 + 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, []); @@ -132,8 +156,8 @@ if (isempty (iip) && isempty (iiz)) ## no poles/zeros away from omega = 0; pick defaults - dec_min = 0; # -1 - dec_max = 2; # 3 + 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])))); @@ -141,7 +165,7 @@ ## expand to show the entirety of the "interesting" portion of the plot switch (wbounds) - case "std" # standard + case "std" # standard if (dec_min == dec_max) dec_min -= 2; dec_max += 2; @@ -149,8 +173,8 @@ dec_min--; dec_max++; endif - case "ext" # extended (for nyquist) - if (any (abs (pol) < sqrt (eps))) # look for integrators + case "ext" # extended (for nyquist) + if (any (abs (pol) < sqrt (eps))) # look for integrators ## dec_min -= 0.5; dec_max += 2; else This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |