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

📄 pdfst.m

📁 国外经典书籍MULTIVARIABLE FEEDBACK CONTROL-多变量反馈控制 的源码
💻 M
字号:
%   [I, O, XI, XO, err, SI, SO] = pdfst(G, P, SST, NDL)%%   The ``Pole-Direction-From-State'' pdfst-function computes the %   input and output pole directions through the use of Singular %   Value Decomposition of (pI-A) where p is a pole.%   If smallest singular value of (pI-A) is smaller than SST then %   the output pole direction yp can be computed as yp = C*xr,%   where xr is the eigenvektor of A corresponding to p, A*xr = p*xr. %   We note that xr is similar to the input singular vektor %   corresponding to the zero singular value.%   The input pole direction up is computed from the transposed system %   i.e.  up = B.'*xl, where xl is the solution to the eigenvalue %   problem A^T*xl = p*xl, which corresponds to the output singular %   vector with zero singular value of (pI-A).%   To calculate the zero direction in the state space, the function %   uses singular decomposition of (pI-A) and not the the eigen value %   formulation. The pole directions are stored as column vectors in %   I and O when the smallest singular value is less than SST.%   If the smallest singular value is larger than SST, the zero vectors%   are stored in the columns of I and O.%   A warning message is printed if also the second singular value is %   greater than SST. %%   Note! PDFST is numerically more robust than PDSVD.%   %   %   Inputs:  G   - system matrix.%            P   - vector of poles.%            SST - tolerance (optional) for singular values, %                  default value is 1e-12.%            NDL - if the norm of the D matrix is large, the directions%                  computed in PDFST may be wrong. A warning message is%                  displayed if || D ||_2 >= NDL. Default value is %                  1000/SST.%%   Outputs: I   - Matrix containing the input directions, %                  column i corresponds to pole P(i).%            O   - Matrix containing the output directions, %                  column i corresponds to pole P(i).%            XI  - Input state directions.%            XO  - Output state directions.%            err - Error indicator:%                     err =  0, all is OK.%                     err =  1, No state direction with gain smaller than %                               SST.%                     err = -1, One basis vector is not enough to describe %                               the subspace of states with gains smaller %                               than SST.%                     err = -2, One basis vector is not enough%                               to describe the subspace with %                               gains larger than EPP.%            SI  - Scaler used on inputs.%            SO  - Scaler used on outputs.%%   Written by: Kjetil Havre, 30/11-1996, e-mail: kjetil@ife.no%%   See also:  IZDE, OZDE, ZDSVD and PDSVD.%%   Reference: Havre K. and S. Skogestad, 1995, ``Effect of RHP Zeros and%              Poles on Performance in Multivariable Systems''.%   function [I, O, XI, XO, err, SI, SO] = pdfst(G, P, sst, ndl)   I = []; O = []; XI = []; XO = []; err = 0;   [mt,ny,nu, nx] = minfo(G);      if strcmp(mt, 'syst')==0      disp( 'System matrix G is required, usage: [I, O, XI, XO, err] = pdfst(G, P, SST, NDL)' );      return   end   if nargin < 2       P = spoles(G);%      disp( 'Usage: [I, O, XI, XO, err] = pdsvd(G, P, SST, NDL)' );%      return   end      if nargin < 3      sst = 1e-12;   end   if nargin < 4      ndl = 1000/sst;   end   [A, B, C, D] = unpck(G);   if norm(D) > ndl      disp('Warning: Directions may be inaccurate due to large effect from D.');      err = -2;   end      Pc = spoles(G);   Npd = max(size(P));      for i=1:Npd      Ipc = find( abs(Pc-P(i)) < 10*sst );      if isempty(Ipc)         disp(['Warning: Pole: ', num2str(P(i)),' not in system'])      else         [U, S, V] = svd( A-eye(nx)*P(i) );         if S(nx,nx) < 100*sst             if nx > 1                 if S(nx-1,nx-1) < sst                     disp(['Warning: Second smallest singular value is smaller than SST: ', num2str(sst),','])                     disp(['         S(',int2str(nx-1),',',int2str(nx-1),'): ', num2str(S(nx-1,nx-1)),'.'])                     err = -1;                 end             end%	 %            [Vr, Dr] = eig(A);   Lr = diag(Dr)%            [Vl, Dl] = eig(A.'); Ll = diag(Dl)%            Ir = find( abs(Lr-P(i)) < sst)%            Il = find( abs(Ll-P(i)) < sst)%            XO(:,i) = Vr(:,Ir);%            XI(:,i) = conj(Vl(:,Il));%%  Using eigenvalues does not work since EIG returns wrong eigenvectors %  when multiple eigenvalues occures. I have experienced this.%  Kjetil Havre 20/3 - 1996.%            if isreal(P(i))               XO(:,i) = real(V(:,nx));               XI(:,i) = real(U(:,nx));            else               XO(:,i) = V(:,nx);               XI(:,i) = U(:,nx);	            end                      Amp  = A-eye(nx)*P(i);%           Hpv = A*XO(:,i) - P(i)*XO(:,i)           xon  = norm(Amp*XO(:,i));           xin  = norm(XI(:,i)'*Amp);                      if xon > 100*sst               disp('Her')               disp(['Warning: Norm || (A-p*I)*xo ||_2 is larger than 100*sst: ',...                       num2str(xon(1,1)), '.']);           end                      if xin > 100*sst               disp(['Warning: Norm || xi^H*(A-p*I) ||_2 is larger than 10*sst: ',...                       num2str(xin(1,1)), '.']);           end%%   Kjetil Havre 16/12 - 1995.%	            yph = C*XO(:,i); nyph = norm(yph);           if nyph > sst               O(:,i) = yph/norm(yph);               XO(:,i) = XO(:,i)/norm(yph);	                if isreal(O(:,i)) == 0                   inz = find(abs(O(:,i))>sst);                    vh = angle(O(inz(1),i));                   O(:,i) = O(:,i)*exp(-sqrt(-1)*vh);                    XO(:,i)=XO(:,i)*exp(-sqrt(-1)*vh);               end           else               O(:,i) = yph;             end                      uph=B'*XI(:,i); nuph = norm(uph);%%        Comment: Almost always is the B matrix real, however when%                 facorizing first on RHP pole then the B matrix %                 becomes complex if the pole is complex.%        in order that up^H*G^{-1}(p) = 0 we need to define%        u_p = B^H x_p%        This make on a difference when B is complex.%        Kjetil Havre 15/2 - 1996%	       if nuph > sst               I(:,i) = uph/norm(uph);                XI(:,i)=XI(:,i)/norm(uph);               if isreal(I(:,i)) == 0                   inz=find(abs(I(:,i))>sst);                    vh = angle(I(inz(1),i));                   I(:,i)=I(:,i)*exp(-sqrt(-1)*vh);                    XI(:,i)=XI(:,i)*exp(-sqrt(-1)*vh);               end           else               I(:,i) = uph;           end                      wp = P(i)/sqrt(-1)+max(10*eps,0.01*sst);           Gp = frsp(G, wp);           ypn = vnorm( mmult(vpinv(Gp), O(:,i)) );           upn = vnorm( mmult(I(:,i)',vpinv(Gp)) );                      if ypn(1,1) > 100*sst               disp(['Warning: Norm || G^{-1}(p)*yp ||_2 is larger than 100*sst: ',...                       num2str(ypn(1,1)), '.']);           end                      if upn(1,1) > 100*sst               isrB = isreal(B);               if isrB                   %	          disp('B is real')               else                    disp('B is not real')                   B = B               end                              disp(['Warning: Norm || up^H*G^{-1}(p) ||_2 is larger than 100*sst: ',...                       num2str(upn(1,1)), '.']);           end                  else           disp(['Error:   Matrix (I*p-A) is not singular for i=',...                   int2str(i),', P(i)=', num2str(P(i)), '.'] );           disp(['         Smallest singular value is: ', num2str(S(nx,nx)),'. Storing zero vectors.'] );           O  = [O zeros(ny,1)];            I  = [I zeros(nu,i)];           XO(:,i) = zeros(nx,1);             XI(:,i) = zeros(nx,1);              err = 1;       end   endend   

⌨️ 快捷键说明

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