view scripts/control/zp2sys.m @ 3398:0f515bc98460

[project @ 1999-12-18 04:21:28 by jwe]
author jwe
date Sat, 18 Dec 1999 04:21:52 +0000
parents 1a8e2c0d627a
children 18366d37e7dd
line wrap: on
line source

## 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{sys} =} zp2sys (@var{zer},@var{pol},@var{k}@{,@var{tsam},@var{inname},@var{outname}@})
##  Create system data structure from zero-pole data
## 
## @strong{Inputs}
## @table @var
## @item   zer
##  vector of system zeros
## @item   pol
##  vector of system poles
## @item   k
##  scalar leading coefficient
## @item   tsam
##  sampling period. default: 0 (continuous system)
## @item   inname, outname
##  input/output signal names (lists of strings)
## @end table
## 
## @strong{Outputs}
##  sys: system data structure
## 
## @strong{Example}
## @example
## octave:1> sys=zp2sys([1 -1],[-2 -2 0],1);
## octave:2> sysout(sys)
## Input(s)
##         1: u_1
## Output(s):
##         1: y_1
## zero-pole form:
## 1 (s - 1) (s + 1)
## -----------------
## s (s + 2) (s + 2)
## @end example
## @end deftypefn
 
## Modified by John Ingram  July 20, 1996  

function outsys = zp2sys (zer, pol, k, tsam, inname, outname)

  ## Test for the correct number of input arguments
  if ((nargin < 3) || (nargin > 6))
    usage("outsys = zp2sys(zer,pol,k[,tsam,inname,outname])");
  endif

  ## check input format 
  if( ! (is_vector(zer) | isempty(zer) ) )
    error("zer must be a vector or empty");
  endif
  if(!isempty(zer))
    zer = reshape(zer,1,length(zer));		# make it a row vector
  endif

  if( ! (is_vector(pol) | isempty(pol)))
    error("pol must be a vector");
  endif
  if(!isempty(pol))
    pol = reshape(pol,1,length(pol));
  endif

  if (! is_scalar(k))
     error('k must be a scalar');
  endif

  ## Test proper numbers of poles and zeros.  The number of poles must be 
  ## greater than or equal to the number of zeros.
  if (length(zer) >  length(pol))
    error(["number of poles (", num2str(length(pol)), ...
	") < number of zeros (", num2str(length(zer)),")"]);
  endif

  ## Set the system transfer function
  outsys.zer = zer;
  outsys.pol = pol;
  outsys.k = k;

  ## Set the system vector:  active = 1, updated = [0 1 0];
  outsys.sys = [1, 0, 1, 0];

  ## Set defaults
  outsys.tsam = 0;
  outsys.n = length(pol);
  outsys.nz = 0;
  outsys.yd = 0;	# assume (for now) continuous time outputs

  ## Set the type of system
  if (nargin > 3)
    if( !is_scalar(tsam) )
      error("tsam must be a nonnegative scalar");
    endif
    if (tsam < 0)
      error("sampling time must be positve")
    elseif (tsam > 0)
      [outsys.n,outsys.nz] = swap(outsys.n, outsys.nz);
      outsys.yd = 1;		# discrete-time output
    endif

    outsys.tsam = tsam;
  endif

  outsys.inname = sysdefioname(1,"u");
  outsys.outname = sysdefioname(1,"y");
  outsys.stname = sysdefstname(outsys.n,outsys.nz);

  ## Set name of input
  if (nargin > 4)
    ## make sure its a string
    if(!isempty(inname))
      if(!is_list(inname))  inname = list(inname); endif
      if(!is_signal_list(inname))
        error("inname must be a single signal name");
      endif
      outsys.inname = inname(1);
    endif
  endif

  ## Set name of output
  if (nargin > 5)
    if(!isempty(outname))
      if(!is_list(outname))        outname = list(outname);    endif
      if(!is_signal_list(outname))
        error("outname must be a single signal name");
      endif
      outsys.outname = outname(1);
    endif
  endif 

endfunction