home *** CD-ROM | disk | FTP | other *** search
/ OS/2 Shareware BBS: 10 Tools / 10-Tools.zip / octa21eb.zip / octave / SCRIPTS.ZIP / scripts.fat / control / starp.m < prev    next >
Text File  |  1999-04-29  |  3KB  |  120 lines

  1. # Copyright (C) 1996 A. Scottedward Hodel 
  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. # Octave is distributed in the hope that it will be useful, but WITHOUT 
  10. # ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or 
  11. # FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License 
  12. # for more details.
  13. # You should have received a copy of the GNU General Public License 
  14. # along with Octave; see the file COPYING.  If not, write to the Free 
  15. # Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. 
  16.  
  17. function [sys] = starp(P, K, ny, nu);
  18. #
  19. # [sys] = starp(P, K, ny, nu)
  20. #
  21. # Redheffer star product or upper/lower LFT, respectively.
  22. #
  23. #
  24. #               +-------+
  25. #     --------->|       |---------> 
  26. #               |   P   |
  27. #          +--->|       |---+  ny
  28. #          |    +-------+   |
  29. #          +-------------------+
  30. #                           |  |
  31. #          +----------------+  |
  32. #          |                   |
  33. #          |    +-------+      |
  34. #          +--->|       |------+ nu 
  35. #               |   K   |
  36. #     --------->|       |--------->
  37. #               +-------+
  38. #
  39. # If ny and nu "consume" all inputs and outputs of K then the result
  40. # is a lower fractional transformation. If ny and nu "consume" all
  41. # inputs and outputs of P then the result is an upper fractional
  42. # transformation.
  43. #
  44. # ny and/or nu may be negative (= negative feedback)
  45.  
  46. # Written by Kai Mueller May 1998
  47.  
  48.   if((nargin != 2) && (nargin != 4))
  49.     usage("[sys] = starp(P, K, ny, nu)");
  50.   endif
  51.   if (!is_struct(P))
  52.     error("---> P must be in system data structure");
  53.   endif
  54.   if (!is_struct(K))
  55.     error("---> K must be in system data structure");
  56.   endif
  57.  
  58.   P = sysupdat(P, "ss");
  59.   [n, nz, mp, pp] = sysdimen(P);
  60.   np = n + nz;
  61.   K = sysupdat(K, "ss");
  62.   [n, nz, mk, pk] = sysdimen(K);
  63.   nk = n + nz;
  64.   ny_sign = 1;
  65.   nu_sign = 1;
  66.   if (nargin == 2)
  67.     # perform a LFT of P and K (upper or lower)
  68.     ny = min([pp, mk]);
  69.     nu = min([pk, mp]);
  70.   else
  71.     if (ny < 0)
  72.       ny = -ny;
  73.       ny_sign = -1;
  74.     endif
  75.     if (nu < 0)
  76.       nu = -nu;
  77.       nu_sign = -1;
  78.     endif
  79.   endif
  80.   if (ny > pp)
  81.     error("---> P has not enough outputs.");
  82.   endif
  83.   if (nu > mp)
  84.     error("---> P has not enough inputs.");
  85.   endif
  86.   if (ny > mk)
  87.     error("---> K has not enough inputs.");
  88.   endif
  89.   if (nu > pk)
  90.     error("---> K has not enough outputs.");
  91.   endif
  92.   nwp  = mp - nu;
  93.   nzp  = pp - ny;
  94.   nwk  = mk - ny;
  95.   nzk  = pk - nu;
  96.   if ((nwp + nwk) < 1)
  97.     error("---> no inputs left for star product.");
  98.   endif
  99.   if ((nzp + nzk) < 1)
  100.     error("---> no outputs left for star product.");
  101.   endif
  102.  
  103.   # checks done, form sys
  104.   if (nzp)  Olst = [1:nzp];  endif
  105.   if (nzk)  Olst = [Olst, pp+nu+1:pp+pk];  endif
  106.   if (nwp)  Ilst = [1:nwp];  endif
  107.   if (nwk)  Ilst = [Ilst, mp+ny+1:mp+mk];  endif
  108.   Clst = zeros(ny+nu,2);
  109.   for ii = 1:nu
  110.     Clst(ii,:) = [nwp+ii, nu_sign*(pp+ii)];
  111.   endfor
  112.   for ii = 1:ny
  113.     Clst(nu+ii,:) = [mp+ii, ny_sign*(nzp+ii)];
  114.   endfor
  115.   sys = buildssc(Clst,[],Olst,Ilst,P,K);
  116.  
  117. endfunction
  118.