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

📄 zp2ss.m

📁 similer program for matlab
💻 M
字号:
## Copyright (C) 1996, 2000, 2002, 2003, 2004, 2005, 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{a}, @var{b}, @var{c}, @var{d}] =} zp2ss (@var{zer}, @var{pol}, @var{k})## Conversion from zero / pole to state space.#### @strong{Inputs}## @table @var## @item zer## @itemx pol## Vectors of (possibly) complex poles and zeros of a transfer## function. Complex values must come in conjugate pairs## (i.e., @math{x+jy} in @var{zer} means that @math{x-jy} is also in @var{zer}).## The number of zeros must not exceed the number of poles.## @item k## Real scalar (leading coefficient).## @end table#### @strong{Outputs}## @table @var## @item @var{a}## @itemx @var{b}## @itemx @var{c}## @itemx @var{d}## The state space system, in the form:## @iftex## @tex## $$ \dot x = Ax + Bu $$## $$ y = Cx + Du $$## @end tex## @end iftex## @ifinfo## @example##      .##      x = Ax + Bu##      y = Cx + Du## @end example## @end ifinfo## @end table## @end deftypefn## Author: David Clem## Created: August 15, 1994function [a, b, c, d] = zp2ss (zer, pol, k)  if (nargin != 3)    print_usage ();  endif  if (! (isvector (zer) || isempty (zer)))    error ("zer(%d,%d) should be a vector", rows (zer), columns (zer));  elseif (! (isvector (pol) || isempty (pol)))    error ("pol(%d,%d) should be a vector", rows (pol), columns (pol));  elseif (! isscalar(k))    error ("k(%d,%d) should be a scalar", rows (k), columns (k));  elseif (k != real (k))    warning ("zp2ss: k is complex")  endif  zpsys = ss (zeros (0, 0), zeros (0, 1), zeros (1, 0), k);  ## Find the number of zeros and the number of poles  nzer = length (zer);  npol = length (pol);  if (nzer > npol)    error ("%d zeros, exceeds number of poles=%d", nzer, npol);  endif  ## Sort to place complex conjugate pairs together  zer = sortcom (zer);  pol = sortcom (pol);  ## construct the system as a series connection of poles and zeros  ## problem: poles and zeros may come in conjugate pairs, and not  ## matched up!  ## approach: remove poles/zeros from the list as they are included in  ## the ss system  while (length (pol))    ## search for complex poles, zeros    cpol = [];    czer = [];    if (! isempty (pol))      cpol = find (imag (pol) != 0);    endif    if (! isempty (zer))      czer = find (imag (zer) != 0);    endif    if (isempty (cpol) && isempty (czer))      pcnt = 1;    else      pcnt = 2;    endif    num = 1;      # assume no zeros left.    switch (pcnt)      case 1	## real pole/zero combination	if (length (zer))	  num = [1, -zer(1)];	  zer = zer(2:length(zer));	endif	den = [1, -pol(1)];	pol = pol(2:length(pol));      case 2	## got a complex pole or zero, need two roots (if available)	if (length (zer) > 1)	  [num, zer] = __zp2ssg2__ (zer);       # get two zeros	elseif (length (zer) == 1)	  num = [1, -zer];                # use last zero (better be real!)	  zer = [];	endif	[den, pol] = __zp2ssg2__ (pol);         # get two poles      otherwise	error ("pcnt = %d", pcnt);      endswitch      ## pack tf into system form and put in series with earlier realization      zpsys1 = tf (num, den, 0, "u", "yy");      ## change names to avoid warning messages from sysgroup      zpsys  = syssetsignals (zpsys, "in", "u1", 1);      zpsys1 = sysupdate (zpsys1, "ss");      nn     = sysdimensions (zpsys);        # working with continuous system      zpsys  = syssetsignals (zpsys, "st", __sysdefioname__ (nn, "x"));      nn1    = sysdimensions (zpsys1);      zpsys1 = syssetsignals (zpsys1, "st", __sysdefioname__ (nn1, "xx"));      zpsys = sysmult (zpsys, zpsys1);    endwhile    [a, b, c, d] = sys2ss (zpsys);endfunction

⌨️ 快捷键说明

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