asymp.m

来自「基于MATLAB的辅助设计 简述了矩阵分析的重要性」· M 代码 · 共 100 行

M
100
字号
	
function md = asymp(num,den,mx,wrang)
%
%ASYMP  ASYMP(NUM,DEN,MX,WRANG) is the function which is used to
%       calculate the asymptotic information for a given system
%       expressed by transfer function  [NUM,DEN].  Argument
%       MX is the log magnitude of the system over the frequency
%       range WRANG.
%

%    Author:  Ole Barup Sorensen, Rapid Data Ltd 

%    Copyright (c) 1989-94 by Rapid Data Ltd
%    Revision 10:36  07/02/94
	
[zer,pol,gain] = tf2zp(num,den);
zchk = exist('zer');
[nr,n0] = size(pol);
if zchk ~= 0, [nc,n0] = size(zer); end
[n0,nw] = size(wrang);
i1=1;
k=0;
w0 = -99;
for i = 1:nr
   nx = imag(pol(i));
   if nx > 1d-12
      w0 = abs(pol(i));
      k1 = -2;
   end
   if abs(nx) <= 1d-12
      w0 = abs(pol(i));
      k1 = -1;
   end
   if w0 ~= -99
      if w0 <= wrang(1)
         k = k + k1;
      elseif w0 < wrang(nw)
         i1 = i1 + 1;
         mata(i1,1) = w0;
        mata(i1,2) = k1;
      end
   end
   w0 = -99;
end
if zchk ~= 0
   for i=1:nc
      ny = imag(zer(i));
      if ny > 1d-12
         w0 = abs(zer(i));
        k1 = 2;
      end
      if abs(ny) <= 1d-12
         w0 = abs(zer(i));
         k1 = 1;
      end
      if w0 ~= -99
         if w0 <= wrang(1)
            k1 = k1 + 1;
         elseif w0 <= wrang(nw)
            i1 = i1 + 1;
            mata(i1,1) = w0;
            mata(i1,2) = k1;
         end
      end
      w0 = -99;
     end
   end
end
mata(1,1) = wrang(1);
mata(1,2) = k;
i1 =i1 + 1;
mata(i1,1) = wrang(nw);
mata(i1,2) = 0;
for i = 1 : i1
   for j = i+1 : i1
      if mata(i,1) > mata(j,1);
         mtemp = mata(i,1);
         mata(i,1) = mata(j,1);
         mata(j,1) = mtemp;
         mtemp = mata(i,2);
         mata(i,2) = mata(j,2);
         mata(j,2) = mtemp;
      end
   end
end
mata(1,3) = 2 * mx(1) - mx(2);
mata(1,2) = 20 * k;
for i = 2 : i1-1
   mata(i,2) = mata(i-1,2) + 20*mata(i,2);
   mata(i,3) = mata(i-1,3)+mata(i-1,2)*log10(mata(i,1)/mata(i-1,1));
end
k0 = 1;
for j = 1 : nw
   if wrang(j) > mata(k0+1,1)
      k0 = k0 + 1;
   end
   md(j) = mata(k0,3) + mata(k0,2) * log10(wrang(j)/mata(k0,1));
end
	

⌨️ 快捷键说明

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