Mercurial > hg > octave-nkf
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