home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / octa21fb.zip / octave / SCRIPTS.ZIP / scripts.fat / control / starp.m < prev    next >
Text File  |  1999-12-24  |  4KB  |  126 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 } { outputs =} starp ( inputs ) 
  21. ## @format
  22. ## 
  23. ##  sys = starp(P, K, ny, nu)
  24. ## 
  25. ##  Redheffer star product or upper/lower LFT, respectively.
  26. ## 
  27. ## 
  28. ##                +-------+
  29. ##      --------->|       |---------> 
  30. ##                |   P   |
  31. ##           +--->|       |---+  ny
  32. ##           |    +-------+   |
  33. ##           +-------------------+
  34. ##                            |  |
  35. ##           +----------------+  |
  36. ##           |                   |
  37. ##           |    +-------+      |
  38. ##           +--->|       |------+ nu 
  39. ##                |   K   |
  40. ##      --------->|       |--------->
  41. ##                +-------+
  42. ## 
  43. ##  If ny and nu "consume" all inputs and outputs of K then the result
  44. ##  is a lower fractional transformation. If ny and nu "consume" all
  45. ##  inputs and outputs of P then the result is an upper fractional
  46. ##  transformation.
  47. ## 
  48. ##  ny and/or nu may be negative (= negative feedback)
  49. ## @end format
  50. ## @end deftypefn
  51.  
  52. function sys = starp (P, K, ny, nu);
  53.  
  54.   ## Written by Kai Mueller May 1998
  55.  
  56.   if((nargin != 2) && (nargin != 4))
  57.     usage("sys = starp(P, K, ny, nu)");
  58.   endif
  59.   if (!is_struct(P))
  60.     error("---> P must be in system data structure");
  61.   endif
  62.   if (!is_struct(K))
  63.     error("---> K must be in system data structure");
  64.   endif
  65.  
  66.   P = sysupdat(P, "ss");
  67.   [n, nz, mp, pp] = sysdimen(P);
  68.   np = n + nz;
  69.   K = sysupdat(K, "ss");
  70.   [n, nz, mk, pk] = sysdimen(K);
  71.   nk = n + nz;
  72.   ny_sign = 1;
  73.   nu_sign = 1;
  74.   if (nargin == 2)
  75.     ## perform a LFT of P and K (upper or lower)
  76.     ny = min([pp, mk]);
  77.     nu = min([pk, mp]);
  78.   else
  79.     if (ny < 0)
  80.       ny = -ny;
  81.       ny_sign = -1;
  82.     endif
  83.     if (nu < 0)
  84.       nu = -nu;
  85.       nu_sign = -1;
  86.     endif
  87.   endif
  88.   if (ny > pp)
  89.     error("---> P has not enough outputs.");
  90.   endif
  91.   if (nu > mp)
  92.     error("---> P has not enough inputs.");
  93.   endif
  94.   if (ny > mk)
  95.     error("---> K has not enough inputs.");
  96.   endif
  97.   if (nu > pk)
  98.     error("---> K has not enough outputs.");
  99.   endif
  100.   nwp  = mp - nu;
  101.   nzp  = pp - ny;
  102.   nwk  = mk - ny;
  103.   nzk  = pk - nu;
  104.   if ((nwp + nwk) < 1)
  105.     error("---> no inputs left for star product.");
  106.   endif
  107.   if ((nzp + nzk) < 1)
  108.     error("---> no outputs left for star product.");
  109.   endif
  110.  
  111.   ## checks done, form sys
  112.   if (nzp)  Olst = [1:nzp];  endif
  113.   if (nzk)  Olst = [Olst, pp+nu+1:pp+pk];  endif
  114.   if (nwp)  Ilst = [1:nwp];  endif
  115.   if (nwk)  Ilst = [Ilst, mp+ny+1:mp+mk];  endif
  116.   Clst = zeros(ny+nu,2);
  117.   for ii = 1:nu
  118.     Clst(ii,:) = [nwp+ii, nu_sign*(pp+ii)];
  119.   endfor
  120.   for ii = 1:ny
  121.     Clst(nu+ii,:) = [mp+ii, ny_sign*(nzp+ii)];
  122.   endfor
  123.   sys = buildssc(Clst,[],Olst,Ilst,P,K);
  124.  
  125. endfunction
  126.