From: <par...@us...> - 2012-09-13 14:34:37
|
Revision: 11002 http://octave.svn.sourceforge.net/octave/?rev=11002&view=rev Author: paramaniac Date: 2012-09-13 14:34:26 +0000 (Thu, 13 Sep 2012) Log Message: ----------- control: handle FRD models in multiplot function Modified 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/multiplot.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 08:09:07 UTC (rev 11001) +++ trunk/octave-forge/main/control/devel/__frequency_response_2__.m 2012-09-13 14:34:26 UTC (rev 11002) @@ -26,32 +26,40 @@ % function [H, w] = __frequency_response__ (sys, w = [], mimoflag = 0, resptype = 0, wbounds = "std", cellflag = false) function [H, w] = __frequency_response_2__ (args, mimoflag = 0, resptype = 0, wbounds = "std", cellflag = false) - sys_idx = cellfun (@isa, args, {"lti"}); # true or false - w_idx = cellfun (@is_real_vector, args); # look for frequency vectors - c_idx = cellfun (@iscell, args); - % args(?) (end) + 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 - -% w_idx(end) - - if (any (c_idx)) - w = args(c_idx){end}; - if (numel (w) == 2 && issample (w{1}) && issample (w{2})) - w = __frequency_vector_2__ (args(sys_idx), wbounds, w{1}, w{2}); + 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)) + elseif (any (w_idx)) # are there any frequency vectors? w = args(w_idx){end}; - else - w = __frequency_vector_2__ (args(sys_idx), wbounds); + else # there are neither frequency ranges nor vectors + w = __frequency_vector_2__ (sys_cell, wbounds); endif -%args{sys_idx} + w = repmat ({w}, 1, numel (sys_cell)); # return cell of frequency vectors + 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); - H = cellfun (@__freqresp__, args(sys_idx), {w}, {resptype}, {cellflag}, "uniformoutput", false); + ## save frequency vectors of FRD models in w + w_frd = cellfun (@get, sys_cell(frd_idx), {"w"}, "uniformoutput", false); + w(frd_idx) = w_frd; +%w +%w = get (sys, "w"); +%args{sys_idx} + %{ ## check arguments if(! isa (sys, "lti")) Modified: trunk/octave-forge/main/control/devel/__frequency_vector_2__.m =================================================================== --- trunk/octave-forge/main/control/devel/__frequency_vector_2__.m 2012-09-13 08:09:07 UTC (rev 11001) +++ trunk/octave-forge/main/control/devel/__frequency_vector_2__.m 2012-09-13 14:34:26 UTC (rev 11002) @@ -46,7 +46,7 @@ idx = cellfun (@(x) isa (x, "lti"), sys_cell); sys_cell = sys_cell(idx); - [dec_min, dec_max, zp] = cellfun (@(x) __frequency_range__ (x, wbounds), sys_cell, "uniformoutput", false); + [dec_min, dec_max, zp] = cellfun (@__frequency_range__, sys_cell, {wbounds}, "uniformoutput", false); if (nargin == 2) dec_min = min (cell2mat (dec_min)); @@ -78,6 +78,14 @@ 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 Modified: trunk/octave-forge/main/control/devel/bode2.m =================================================================== --- trunk/octave-forge/main/control/devel/bode2.m 2012-09-13 08:09:07 UTC (rev 11001) +++ trunk/octave-forge/main/control/devel/bode2.m 2012-09-13 14:34:26 UTC (rev 11002) @@ -67,10 +67,10 @@ if (! nargout) mag_db = cellfun (@(mag) 20 * log10 (mag), mag, "uniformoutput", false); - w_cell = repmat ({w}, 1, numel (H)); + %w_cell = repmat ({w}, 1, numel (H)); - mag_args = vertcat (w_cell, mag_db)(:); - pha_args = vertcat (w_cell, pha)(:); + mag_args = vertcat (w, mag_db)(:); + pha_args = vertcat (w, pha)(:); %if (isct (sys)) xl_str = "Frequency [rad/s]"; Modified: trunk/octave-forge/main/control/devel/multiplot.m =================================================================== --- trunk/octave-forge/main/control/devel/multiplot.m 2012-09-13 08:09:07 UTC (rev 11001) +++ trunk/octave-forge/main/control/devel/multiplot.m 2012-09-13 14:34:26 UTC (rev 11002) @@ -1,3 +1,9 @@ load tfs.dat -bode2 (C_AH, C_opt) \ No newline at end of file +figure (1) +bode2 (C_AH, C_opt) + +figure (2) +bode2 (5*C_AH, frd (C_AH), frd (C_opt)) + +% bode2 (5*C_AH, frd (C_AH, 1:10), frd (C_opt, 11:20)) \ No newline at end of file This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |