home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / octa21fb.zip / octave / SCRIPTS.ZIP / scripts.fat / control / zp2ss.m < prev    next >
Text File  |  1999-12-24  |  5KB  |  153 lines

  1. ## Copyright (C) 1996 Auburn University.  All Rights Reserved
  2. ##
  3. ## This file is part of Octave. 
  4. ##
  5. ## Octave is free software; you can redistribute it and/or modify it 
  6. ## under the terms of the GNU General Public License as published by the 
  7. ## Free Software Foundation; either version 2, or (at your option) any 
  8. ## later version. 
  9. ## 
  10. ## Octave is distributed in the hope that it will be useful, but WITHOUT 
  11. ## ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 
  12. ## FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License 
  13. ## for more details.
  14. ## 
  15. ## You should have received a copy of the GNU General Public License 
  16. ## along with Octave; see the file COPYING.  If not, write to the Free 
  17. ## Software Foundation, 59 Temple Place, Suite 330, Boston, MA 02111 USA. 
  18.  
  19. ## -*- texinfo -*-
  20. ## @deftypefn {Function File } {[@var{A}, @var{B}, @var{C}, @var{D}] =} zp2ss (@var{zer}, @var{pol}, @var{k})
  21. ## Conversion from zero / pole to state space.
  22. ## @strong{Inputs}
  23. ## @table @var
  24. ## @item zer, pol
  25. ## vectors of (possibly) complex poles and zeros of a transfer
  26. ## function.  Complex values must come in conjugate pairs
  27. ## (i.e., x+jy in zer means that x-jy is also in zer)
  28. ## @item k
  29. ## real scalar (leading coefficient)
  30. ## @end table
  31. ## @strong{Outputs}
  32. ##  @var{A}, @var{B}, @var{C}, @var{D}
  33. ## The state space system
  34. ## @example
  35. ## .
  36. ## x = Ax + Bu
  37. ## y = Cx + Du
  38. ## @end example
  39. ## is obtained from a vector of zeros and a vector of poles via the
  40. ## function call @code{[a,b,c,d] = zp2ss(zer,pol,k)}.  
  41. ## The vectors @samp{zer} and 
  42. ## @samp{pol} may either be row or column vectors.  Each zero and pole that
  43. ## has an imaginary part must have a conjugate in the list.
  44. ## The number of zeros must not exceed the number of poles.
  45. ## @samp{k} is @code{zp}-form leading coefficient.
  46. ## @end deftypefn
  47.  
  48. function [a, b, c, d] = zp2ss (zer, pol, k)
  49.  
  50.   ## Written by David Clem August 15, 1994
  51.  
  52.   sav_val = empty_list_elements_ok;
  53.   empty_list_elements_ok = 1;
  54.  
  55.   if(nargin != 3)
  56.     error("Incorrect number of input arguments");
  57.   endif
  58.  
  59.   if(! (is_vec(zer) | isempty(zer)) )
  60.     error(["zer(",num2str(rows(zer)),",",num2str(columns(zer)), ...
  61.     ") should be a vector"]);
  62.   elseif(! (is_vec(pol) | isempty(pol) ) )
  63.     error(["pol(",num2str(rows(pol)),",",num2str(columns(pol)), ...
  64.     ") should be a vector"]);
  65.   elseif(! is_scal(k))
  66.     error(["k(",num2str(rows(k)),",",num2str(columns(k)), ...
  67.     ") should be a scalar"]);
  68.   elseif( k != real(k))
  69.     warning("zp2ss: k is complex")
  70.   endif
  71.  
  72.   zpsys = ss2sys([],[],[],k);
  73.  
  74.   ## Find the number of zeros and the number of poles
  75.   nzer=length(zer);
  76.   npol =length(pol);
  77.  
  78.   if(nzer > npol)
  79.     error([num2str(nzer)," zeros, exceeds number of poles=",num2str(npol)]);
  80.   endif
  81.  
  82.   ## Sort to place complex conjugate pairs together
  83.   zer=sortcom(zer);
  84.   pol=sortcom(pol);
  85.  
  86.   ## construct the system as a series connection of poles and zeros
  87.   ## problem: poles and zeros may come in conjugate pairs, and not
  88.   ## matched up!
  89.  
  90.   ## approach: remove poles/zeros from the list as they are included in
  91.   ## the ss system
  92.  
  93.   while(length(pol))
  94.  
  95.     ## search for complex poles, zeros
  96.     cpol=[];    czer = [];
  97.     if(!isempty(pol))
  98.       cpol = find(imag(pol) != 0);
  99.     endif
  100.     if(!isempty(zer))
  101.       czer = find(imag(zer) != 0);
  102.     endif
  103.  
  104.     if(isempty(cpol) & isempty(czer))
  105.       pcnt = 1;
  106.     else 
  107.       pcnt = 2;
  108.     endif
  109.  
  110.     num=1;    # assume no zeros left.
  111.     switch(pcnt)
  112.     case(1)
  113.       ## real pole/zero combination
  114.       if(length(zer))
  115.         num = [1, -zer(1)];  
  116.         zer = zer(2:length(zer));
  117.       endif
  118.       den = [1, -pol(1)];
  119.       pol = pol(2:length(pol));
  120.     case(2)
  121.       ## got a complex pole or zero, need two roots (if available)
  122.       if(length(zer) > 1)
  123.         [num,zer] = zp2ssg2(zer);    # get two zeros
  124.       elseif(length(zer) == 1)
  125.         num = [1, -zer];        # use last zero (better be real!)
  126.         zer = [];
  127.       endif
  128.       [den,pol] = zp2ssg2(pol);        # get two poles
  129.     otherwise
  130.       error(["pcnt = ",num2str(pcnt)])
  131.     endswitch
  132.  
  133.     ## pack tf into system form and put in series with earlier realization
  134.     zpsys1 = tf2sys(num,den,0,"u","yy");
  135.  
  136.     ## change names to avoid warning messages from sysgroup
  137.     zpsys  = syssetsg(zpsys,"in","u1",1);
  138.     zpsys1 = sysupdat(zpsys1,"ss");
  139.     nn     = sysdimen(zpsys);        # working with continuous system
  140.     zpsys  = syssetsg(zpsys,"st", sysdefio(nn,"x"));
  141.     nn1    = sysdimen(zpsys1);
  142.     zpsys1 = syssetsg(zpsys1,"st",sysdefio(nn1,"xx"));
  143.  
  144.     zpsys = sysmult(zpsys,zpsys1);
  145.  
  146.   endwhile 
  147.  
  148.   [a,b,c,d] = sys2ss(zpsys);
  149.  
  150.   empty_list_elements_ok = sav_val;
  151. endfunction
  152.  
  153.