diff core/tools/uplot.m @ 0:e9a9cd732c1e tip

first hg version after svn
author wolffd
date Tue, 10 Feb 2015 15:05:51 +0000
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/core/tools/uplot.m	Tue Feb 10 15:05:51 2015 +0000
@@ -0,0 +1,195 @@
+function han = uplot(varargin)
+% UPLOT  Plot of double and FRD data.
+%
+% UPLOT([plot_type],SYS1,SYS2,SYS3, ...)
+% UPLOT([plot_type],[1 10],[.1 5],SYS1, ...)
+% UPLOT([plot_type],SYS1,'linetype1',SYS2,'linetype2',...)
+%
+% Plot double and FRD objects.  The syntax is the same as the MATLAB
+% plot command except that all data is contained in SYSi, and the 
+% axes are specified by PLOT_TYPE.
+%
+% The (optional) plot_type argument must be one of:
+%
+%   'iv,d'       matin .vs. independent variable (default option)
+%   'iv,m'       magnitude .vs. independent variable
+%   'iv,lm'      log(magnitude) .vs. independent variable
+%   'iv,p'       phase .vs. independent variable
+%   'liv,d'      matin .vs. log(independent variable)
+%   'liv,m'      magnitude .vs. log(independent variable)
+%   'liv,lm'     log(magnitude) .vs. log(independent variable)
+%   'liv,p'      phase .vs. log(independent variable)
+%   'nyq'        real .vs. imaginary  (parametrized by indep variable)
+%   'nic'        Nichols chart
+%   'bode'       Bode magnitude and phase plots
+%
+%See also: BODE, LOGLOG, PLOT, NICHOLS, NYQUIST, SEMILOGX, SEMILOGY, SIGMA.
+
+% Copyright 2004 The MathWorks, Inc.
+
+nin = nargin;
+if isa(varargin{1},'char')
+   plottype = varargin{1};
+   sidx = 2;
+else
+   plottype = 'iv,d';
+   sidx = 1;
+end
+
+argcell = cell(0,1);
+cnt = 1;
+cflag = 0;
+dflag = 0;
+ydataloc = [];
+for i=sidx:nin
+   arg = varargin{i};
+   switch class(arg)
+   case 'frd'
+      if dflag==1
+         error('Double data must come in pairs');
+      else
+         cflag = 0;
+         szm = size(arg);
+         if length(szm)==2
+            npts = length(arg.Frequency);
+            ydata = reshape(arg.ResponseData,[szm(1)*szm(2) npts]).';
+            xdata = arg.Frequency;
+            argcell = [argcell;{xdata};{ydata}];
+            ydataloc = [ydataloc;cnt+1];
+            cnt = cnt + 2;
+         else
+            nad = length(szm) - 2;
+            npts = length(arg.Frequency);
+            tmp = permute(arg.ResponseData,[1 2 4:4+nad-1 3]);
+            ydata = reshape(tmp,[prod(szm) npts]).';
+            xdata = arg.Frequency;
+            argcell = [argcell;{xdata};{ydata}];
+            ydataloc = [ydataloc;cnt+1];
+            cnt = cnt + 2;
+         end
+      end
+   case 'char'
+      if dflag==1
+         error('Double data must come in pairs');
+      else
+         if cflag==0
+            argcell = [argcell;{arg}];
+            cnt = cnt + 1;
+            cflag = 1;
+         else
+            error('Never have 2 chars in a row');
+         end
+      end
+   case 'double'
+      cflag = 0;
+      if dflag==0 % think xdata
+         argcell = [argcell;{arg}];
+         cnt = cnt + 1;
+         dflag = 1;
+      elseif dflag==1 % think ydata
+         argcell = [argcell;{arg}];
+         ydataloc = [ydataloc;cnt];
+         cnt = cnt + 1;
+         dflag = 0;
+      end
+   otherwise
+      if isuncertain(arg)
+         error('Cannot plot uncertain matrices or systems');
+      else
+         error('Cannot plot this type of data');
+      end
+   end
+end
+xmin = inf;
+xmax = -inf;
+for i=1:length(ydataloc)
+   xmin = min([xmin min(argcell{ydataloc(i)-1})]);
+   xmax = max([xmax max(argcell{ydataloc(i)-1})]);
+end
+for i=1:length(ydataloc)
+   if length(argcell{ydataloc(i)})==1
+      argcell{ydataloc(i)} = [argcell{ydataloc(i)} argcell{ydataloc(i)}];
+      argcell{ydataloc(i)-1} = [xmin xmax];
+   end
+end
+      
+switch plottype
+case 'iv,d'
+   h = plot(argcell{:});
+case 'iv,m'
+   for i=1:length(ydataloc)
+      argcell{ydataloc(i)} = abs(argcell{ydataloc(i)});
+   end
+   h = plot(argcell{:});
+case 'iv,lm'
+   for i=1:length(ydataloc)
+      argcell{ydataloc(i)} = abs(argcell{ydataloc(i)});
+   end
+   h = semilogy(argcell{:});
+case 'iv,p'
+   for i=1:length(ydataloc)
+      argcell{ydataloc(i)} = (180/pi)*angle(argcell{ydataloc(i)});
+   end
+   h = plot(argcell{:});
+case 'liv,d'
+   h = semilogx(argcell{:});
+case 'liv,ld'
+   h = loglog(argcell{:});
+case 'liv,m'
+   for i=1:length(ydataloc)
+      argcell{ydataloc(i)} = abs(argcell{ydataloc(i)});
+   end
+   h = semilogx(argcell{:});
+case 'liv,lm'
+   for i=1:length(ydataloc)
+      argcell{ydataloc(i)} = abs(argcell{ydataloc(i)});
+   end
+   h = loglog(argcell{:});
+case 'liv,p'
+   for i=1:length(ydataloc)
+      argcell{ydataloc(i)} = (180/pi)*angle(argcell{ydataloc(i)});
+   end
+   h = semilogx(argcell{:});
+case {'nyq'}
+   for i=1:length(ydataloc)
+      %x-data, real part
+      argcell{ydataloc(i)-1} = real(argcell{ydataloc(i)});
+      argcell{ydataloc(i)}   = imag(argcell{ydataloc(i)});
+   end
+   h = plot(argcell{:});
+case {'ri'}
+   for i=1:length(ydataloc)
+      %x-data, real part
+      argcell{ydataloc(i)-1} = real(argcell{ydataloc(i)});
+      %y-data, imag part
+      argcell{ydataloc(i)}   = imag(argcell{ydataloc(i)});
+   end
+   h = plot(argcell{:});
+case {'nic'}
+   for i=1:length(ydataloc)
+      %x-data, imag part
+      argcell{ydataloc(i)-1} = 360/(2*pi)*negangle(argcell{ydataloc(i)});
+      %y-data, real part
+      argcell{ydataloc(i)}   = 20*log10(abs(argcell{ydataloc(i)}));
+   end
+   h = plot(argcell{:});
+case 'bode'
+   subplot(2,1,1)
+   magcell = argcell;
+   for i=1:length(ydataloc)
+      magcell{ydataloc(i)} = abs(magcell{ydataloc(i)});
+   end
+   hm = loglog(magcell{:});
+   subplot(2,1,2)
+   for i=1:length(ydataloc)
+      argcell{ydataloc(i)} = (180/pi)*angle(argcell{ydataloc(i)});
+   end
+   hp = semilogx(argcell{:});
+   h = [hm;hp];
+otherwise
+   error('invalid plot type');
+end
+      
+if nargout==1
+   han = h;
+end
\ No newline at end of file