Mercurial > hg > octave-nkf
view scripts/control/starp.m @ 3381:69b167451491
[project @ 1999-12-15 20:48:10 by jwe]
author | jwe |
---|---|
date | Wed, 15 Dec 1999 20:48:45 +0000 |
parents | 8dd4718801fd |
children | 10f21f7ccc7f |
line wrap: on
line source
## Copyright (C) 1996 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 } { outputs =} starp ( inputs ) ## @format ## ## [sys] = starp(P, K, ny, nu) ## ## Redheffer star product or upper/lower LFT, respectively. ## ## ## +-------+ ## --------->| |---------> ## | P | ## +--->| |---+ ny ## | +-------+ | ## +-------------------+ ## | | ## +----------------+ | ## | | ## | +-------+ | ## +--->| |------+ nu ## | K | ## --------->| |---------> ## +-------+ ## ## If ny and nu "consume" all inputs and outputs of K then the result ## is a lower fractional transformation. If ny and nu "consume" all ## inputs and outputs of P then the result is an upper fractional ## transformation. ## ## ny and/or nu may be negative (= negative feedback) ## @end format ## @end deftypefn function [sys] = starp(P, K, ny, nu); ## Written by Kai Mueller May 1998 if((nargin != 2) && (nargin != 4)) usage("[sys] = starp(P, K, ny, nu)"); endif if (!is_struct(P)) error("---> P must be in system data structure"); endif if (!is_struct(K)) error("---> K must be in system data structure"); endif P = sysupdate(P, "ss"); [n, nz, mp, pp] = sysdimensions(P); np = n + nz; K = sysupdate(K, "ss"); [n, nz, mk, pk] = sysdimensions(K); nk = n + nz; ny_sign = 1; nu_sign = 1; if (nargin == 2) ## perform a LFT of P and K (upper or lower) ny = min([pp, mk]); nu = min([pk, mp]); else if (ny < 0) ny = -ny; ny_sign = -1; endif if (nu < 0) nu = -nu; nu_sign = -1; endif endif if (ny > pp) error("---> P has not enough outputs."); endif if (nu > mp) error("---> P has not enough inputs."); endif if (ny > mk) error("---> K has not enough inputs."); endif if (nu > pk) error("---> K has not enough outputs."); endif nwp = mp - nu; nzp = pp - ny; nwk = mk - ny; nzk = pk - nu; if ((nwp + nwk) < 1) error("---> no inputs left for star product."); endif if ((nzp + nzk) < 1) error("---> no outputs left for star product."); endif ## checks done, form sys if (nzp) Olst = [1:nzp]; endif if (nzk) Olst = [Olst, pp+nu+1:pp+pk]; endif if (nwp) Ilst = [1:nwp]; endif if (nwk) Ilst = [Ilst, mp+ny+1:mp+mk]; endif Clst = zeros(ny+nu,2); for ii = 1:nu Clst(ii,:) = [nwp+ii, nu_sign*(pp+ii)]; endfor for ii = 1:ny Clst(nu+ii,:) = [mp+ii, ny_sign*(nzp+ii)]; endfor sys = buildssic(Clst,[],Olst,Ilst,P,K); endfunction