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

📄 __bodquist__.m

📁 similer program for matlab
💻 M
字号:
## Copyright (C) 1996, 1998, 2000, 2002, 2003, 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/>.## Undocumented internal function.## -*- texinfo -*-## @deftypefn {Function File} {[@var{f}, @var{w}, @var{rsys}] =} __bodquist__ (@var{sys}, @var{w}, @var{out_idx}, @var{in_idx})## Used internally by @command{bode}, @command{nyquist}; compute system frequency response.#### @strong{Inputs}## @table @var## @item sys## input system structure## @item w## range of frequencies; empty if user wants default## @item out_idx## @itemx in_idx## names or indices of output/input signal names; empty if user wants all## @item rname## name of routine that called __bodquist__ ("bode", "nyquist", or "nichols")## @end table## @strong{Outputs}## @table @var## @item w## list of frequencies## @item f## frequency response of sys; @math{f(ii) = f(omega(ii))}## @item rsys## system with selected inputs and outputs## @end table#### @code{bode}, @code{nichols}, and @code{nyquist} share the same ## introduction, so the common parts are## in __bodquist__.  It contains the part that finds the number of arguments,## determines whether or not the system is @acronym{SISO}, and computes the frequency## response.  Only the way the response is plotted is different between the## these functions.## @end deftypefnfunction [f, w, rsys] = __bodquist__ (sys, w, outputs, inputs, rname)  ## check number of input arguments given  if (nargin != 5)    print_usage ();  endif  ## check each argument to see if it's in the correct form  if (! isstruct (sys))    error ("sys must be a system data structure");  endif  ## let __freqresp__ determine w if it's not already given  USEW = freqchkw (w);  ## get initial dimensions (revised below if sysprune is called)  [nn, nz, mm, pp] = sysdimensions (sys);  ## check for an output vector and to see whether it`s correct  if (! isempty (outputs))    if (isempty (inputs))      inputs = 1:mm;                    # use all inputs      warning ("%s: outputs specified but not inputs", rname);    elseif (is_signal_list (inputs) || ischar (inputs))      inputs = sysidx (sys, "in", inputs);    endif    if (is_signal_list (outputs) || ischar (outputs))      outputs = sysidx (sys, "out", outputs);    endif    sys = sysprune (sys, outputs, inputs);    [nn, nz, mm, pp] = sysdimensions (sys);  endif  ## for speed in computation, convert local copy of  ## SISO state space systems to zero-pole  form  if (is_siso (sys) && strcmp (sysgettype (sys), "ss"))    [zer, pol, k, tsam, inname, outname] = sys2zp (sys);    sys = zp (zer, pol, k, tsam, inname, outname);  endif  ## get system frequency response  [f, w] = __freqresp__ (sys, USEW, w);  phase = arg(f)*180.0/pi;  if (! USEW)    ## smooth plots    pcnt = 5;           # max number of refinement steps    dphase = 5;         # desired max change in phase    dmag = 0.2;         # desired max change in magnitude    while (pcnt)      pd = abs (diff (phase));                    # phase variation      pdbig = find (pd > dphase);      ## relative variation      lp = length (f);      lp1 = lp-1;      fd = abs (diff (f));      fm = max (abs ([f(1:lp1); f(2:lp)]));      fdbig = find (fd > fm/10);      bigpts = union (fdbig, pdbig);      if (isempty (bigpts))        pcnt = 0;      else        pcnt = pcnt - 1;        wnew = [];        crossover_points = find (phase(1:lp1).*phase(2:lp) < 0);        pd(crossover_points) = abs (359.99+dphase - pd(crossover_points));        np_pts = max (3, ceil(pd/dphase)+2);              # phase points        nm_pts = max (3, ceil(log(fd./fm)/log(dmag))+2);  # magnitude points        npts = min (5, max(np_pts, nm_pts));        w1 = log10 (w(1:lp1));        w2 = log10 (w(2:lp));        for ii = bigpts          if (npts(ii))            wtmp = logspace (w1(ii), w2(ii), npts(ii));            wseg(ii,1:(npts(ii)-2)) = wtmp(2:(npts(ii)-1));          endif        endfor        wnew = vec(wseg)'; # make a row vector        wnew = wnew(find (wnew != 0));        wnew = sort (wnew);        wnew = create_set (wnew);        if (isempty (wnew))   # all small crossovers          pcnt = 0;        else	  ## get new freq resp points, combine with old, and sort.          [fnew, wnew] = __freqresp__ (sys, 1, wnew);          w = [w, wnew];          f = [f, fnew];          [w, idx] = sort (w);          f = f (idx);          phase = arg(f)*180.0/pi;        endif      endif    endwhile  endif  ## ensure unique frequency values  [w, idx] = sort (w);  f = f(idx);  w_diff = diff (w);  w_dup = find (w_diff == 0);  w_idx = complement (w_dup, 1:length(w));  w = w(w_idx);  f = f(w_idx);  ## set rsys to pruned system  rsys = sys;endfunction

⌨️ 快捷键说明

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