⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sysmin.m

📁 similer program for matlab
💻 M
字号:
## Copyright (C) 1996, 2000, 2004, 2005, 2006, 2007##               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 3 of the License, 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, see## <http://www.gnu.org/licenses/>.## -*- texinfo -*-## @deftypefn {Function File} {[@var{retsys}, @var{nc}, @var{no}] =} sysmin (@var{sys}, @var{flg})## Returns a minimal (or reduced order) system#### @strong{Inputs}## @table @var## @item sys## System data structure## @item flg## When equal to 0 (default value), returns minimal system,## in which state names are lost; when equal to 1, returns system ## with physical states removed that are either uncontrollable or ## unobservable (cannot reduce further without discarding physical## meaning of states).## @end table## @strong{Outputs}## @table @var## @item retsys## Returned system.## @item nc## Number of controllable states in the returned system.## @item no## Number of observable states in the returned system.## @item cflg## @code{is_controllable(retsys)}.## @item oflg## @code{is_observable(retsys)}.## @end table## @end deftypefn## Author: A. S. Hodel <a.s.hodel@eng.auburn.edu>function [retsys, nc, no, cflg, oflg] = sysmin (sys, flg)  switch (nargin)  case 1    flg = 0;  case 2    jnk = flg;    # dummy operation  otherwise,    print_usage ();  endswitch  dflg = is_digital (sys, 2);  [n, nz, m, p] = sysdimensions (sys);  if (n*nz > 0)    # both continuous and discrete states    [aa, bb, cc, dd, tsam, n, nz, stnam, innam, outnam, yd] = sys2ss (sys);    crng = 1:n;    drng = n+(1:nz);    # get minimal realization of continuous part    Ac  = aa(crng,crng);    Acd = aa(crng,drng);    Adc = aa(drng,crng);    Ad  = aa(drng,drng);    Bc  = bb(crng,:);    Bd  = bb(drng,:);    Cc  = cc(:,crng);    Cd  = cc(:,drng);    cstnam = stnam(crng);    dstnam = stnam(drng);    cinnam = __sysconcat__ (innam, stnam(drng));    coutnam = __sysconcat__ (outnam, stnam(drng));    csys = ss (Ac, [Bc, Acd], [Cc; Adc]);    csys = syssetsignals (csys, "st", cstnam);    csys = syssetsignals (csys, "in", cinnam);    csys = syssetsignals (csys, "out", coutnam);    # reduce continuous system, recombine with discrete part    csys = sysmin (csys, flg);    cn = sysdimensions (csys);    if (cn == 0)      # continuous states are removed; just reduce the discrete part      sys = sysprune (sys, 1:p, 1:m, drng);      retsys = sysmin (sys, flg);    else      # extract updated parameters from reduced continuous system      [caa, cbb, ccc, cdd, ctsam, cn, cnz, cstnam, cinnam, coutnam] ...	  = sys2ss (csys);      crng = 1:cn;      Ac  = caa;      Bc  = cbb(:,1:m);      Acd = cbb(:,m+(1:nz));      Cc  = ccc(1:p,:);      Adc = ccc(p + (1:nz),:);      # recombine to reduce discrete part of the system      dinnam = __sysconcat__ (innam, cstnam);      doutnam = __sysconcat__ (outnam, cstnam);      dsys = ss (Ad, [Bd, Adc], [Cd; Acd], [], tsam);      dsys = syssetsignals (dsys, "st", dstnam);      dsys = syssetsignals (dsys, "in", dinnam);      dsys = syssetsignals (dsys, "out", doutnam);      # reduce discrete subsystem      dsys = sysmin (dsys);      [n1, nz] = sysdimensions (dsys);      if (nz == 0)        # discrete subsystem is not needed        retsys = sysprune (csys, 1:p, 1:m);      else        # combine discrete, continuous subsystems        [Ad, dbb, dcc] = sys2ss (dsys);        dstnam = sysgetsignals (dsys, "st");        Bd  = dbb(:,1:m);        Adc = dbb(:,m+(1:cn));        Cd  = dcc(1:p,:);        Acd = dcc(p+(1:cn),:);        stnam = __sysconcat__ (cstnam, dstnam);        aa = [Ac, Acd; Adc, Ad];        bb = [Bc; Bd];        cc = [Cc, Cd];        retsys = ss ([Ac, Acd; Adc, Ad], [Bc ; Bd], [Cc, Cd], dd, tsam,		     cn, nz, stnam, innam, outnam, find(yd == 1));      endif    endif  else    Ts = sysgettsam (sys);    switch (flg)    case 0      ## reduce to a minimal system      [aa, bb, cc, dd] = sys2ss (sys);      [cflg, Uc] = is_controllable (aa, bb);      if (! cflg)        ## reduce to controllable states        if (! isempty (Uc))          aa = Uc'*aa*Uc;          bb = Uc'*bb;          cc = cc*Uc;        else          aa = bb = cc = [];        endif      endif      if (! isempty (aa))        [oflg, Uo] = is_observable (aa, cc);        if (! oflg)          if (! isempty (Uo))            aa = Uo'*aa*Uo;            bb = Uo'*bb;            cc = cc*Uo;          else            aa = bb = cc = [];          endif        endif      endif      switch (dflg)      case 0        nc = no = nn = columns (aa);        nz = 0;      case 1        nc = no = nz = columns (aa);        nn = 0;      endswitch      innam = sysgetsignals (sys, "in");      outnam= sysgetsignals (sys, "out");      retsys = ss (aa, bb, cc, dd, Ts, nn, nz, [], innam, outnam);    case 1      ## reduced model with physical states      [cflg, Uc] = is_controllable (sys);      xc = find (max (abs (Uc')) != 0);      [oflg, Uo] = is_observable (sys);      xo = find (max (abs (Uo')) != 0);      xx = intersection (xc, xo);      ## signal no states in reduced model      if (isempty (xx))	xx = 0;      endif      retsys = sysprune (sys, [], [], xx);    otherwise      error ("invalid value of flg = %d", flg);    endswitch    if (sysdimensions (retsys, "st") > 0)      [cflg, Uc] = is_controllable (retsys);      nc = columns (Uc);      [oflg, Uo] = is_observable (retsys);      no = columns (Uo);    else      nc = no = 0;    endif  endifendfunction

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -