diff scripts/control/base/pzmap.m @ 3432:e39d90787668

[project @ 2000-01-14 04:22:59 by jwe]
author jwe
date Fri, 14 Jan 2000 04:28:06 +0000
parents
children 22bd65326ec1
line wrap: on
line diff
new file mode 100644
--- /dev/null
+++ b/scripts/control/base/pzmap.m
@@ -0,0 +1,86 @@
+## Copyright (C) 1996, 1998 Auburn University.  All rights reserved.
+##
+## This file is part of Octave.
+##
+## Octave 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 2, or (at your option) any
+## later version.
+##
+## Octave 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 Octave; see the file COPYING.  If not, write to the Free
+## Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA.
+
+## -*- texinfo -*-
+## @deftypefn {Function File} {[@var{zer}, @var{pol}]=} pzmap (@var{sys})
+## Plots the zeros and poles of a system in the complex plane.
+## @strong{Inputs}
+## @var{sys} system data structure
+##
+## @strong{Outputs}
+## if omitted, the poles and zeros are plotted on the screen.
+## otherwise, pol, zer are returned as the system poles and zeros.
+## (see sys2zp for a preferable function call)
+## @end deftypefn
+
+function [zer, pol]=pzmap (sys)
+
+  save_emp = empty_list_elements_ok;
+
+  empty_list_elements_ok = 1;
+
+  if(nargin != 1)
+    usage("pzmap(sys) or [zer,pol] = pzmap(sys)");
+  elseif (!is_struct(sys));
+    error("sys must be in system format");
+  endif
+
+  [zer,pol] = sys2zp(sys);
+
+  ## force to column vectors, split into real, imaginary parts
+  zerdata = poldata = [];
+  if(length(zer))
+    zer = reshape(zer,length(zer),1);
+    zerdata = [real(zer(:,1)), imag(zer(:,1))];
+  endif
+  if(length(pol))
+    pol = reshape(pol,length(pol),1);
+    poldata = [real(pol(:,1)), imag(pol(:,1))];
+  endif
+
+  ## determine continuous or discrete plane
+  vars = "sz";
+  varstr = vars(is_digital(sys) + 1);
+
+  ## Plot the data
+  gset nologscale xy;
+  if(is_siso(sys))
+    title(sprintf("Pole-zero map from %s to %s", ...
+       sysgetsignals(sys,"in",1,1), sysgetsignals(sys,"out",1,1) ));
+  endif
+  xlabel(["Re(",varstr,")"]);
+  ylabel(["Im(",varstr,")"]);
+  grid;
+
+  ## compute axis limits
+  axis(axis2dlim([zerdata;poldata]));
+  grid
+  ## finally, plot the data
+  if(length(zer) == 0)
+    plot(poldata(:,1), poldata(:,2),"@12 ;poles (no zeros);");
+  elseif(length(pol) == 0)
+    plot(zerdata(:,1), zerdata(:,2),"@31 ;zeros (no poles);");
+  else
+    plot(zerdata(:,1), zerdata(:,2),"@31 ;zeros;", ...
+      poldata(:,1), poldata(:,2),"@12 ;poles;");
+  endif
+  replot
+
+  empty_list_elements_ok = save_emp;
+
+endfunction