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

📄 anasolv.m

📁 用MATLAB的脚本语言M语言编写的
💻 M
字号:
function [S,Rts,K]=anasolv(G,cc,dd,x0)
G=ss(G); [Ga,xa]=augment(G,cc,dd,x0);
vec=ones(1,length(Ga.a));
[Aj,T,K,Rts]=jordan_m(Ga.a,vec); 
B=inv(T)*xa;  F=[]; G0=[]; j=1; 
for i=1:length(K), 
   if (imag(Rts(j))>1e-5), 
      F1=[B(j),B(j+1); B(j+1),-B(j)]; 
      G1=diag([1,1]); j=j+2;
   else
      Xx=B(j:j+K(i)-1)'; F1=Xx; E=1;
      for k=2:K(i)
         E(k)=E(k-1)/(k-1);
         Xx=[Xx(2:K(i)),0]; F1=[F1; Xx];
      end
      G1=diag(E); j=j+K(i); 
   end
   mm=size(F1); nn=length(F); 
   F=[F,zeros(nn,mm(2));zeros(mm(1),nn),F1];
   E=[E,zeros(nn,mm(2));zeros(mm(1),nn),G1];
end
S=T*F*G;
%jordan_m is a sub function to anasolv()
function [AJ,T,JJ,Rt]=jordan_m(A,V0,Eps)
if nargin==2, Eps=1e-5; end
Rt=eig(A); Rt=sort(Rt);
Rt=Rt(length(Rt):-1:1);  
Nd=length(Rt); M=V0; k=0; JJ=[]; V=[]; 
for i=2:Nd, M=[M; M(i-1,:)*A]; end
while k<Nd,
   k=k+1; K=0; key=1; 
   Rt0=Rt(k); Rt1=Rt(k);
   if (abs(imag(Rt0))>Eps), 
      key=2; K=K+1; k=k+2;
   else
      while (k<=Nd & abs(Rt0-Rt1)<1e-5),
        k=k+1; K=K+1; key=0;
        if k<=Nd, Rt1=Rt(k); end   
   end, end
   if key~=1, JJ=[JJ K]; k=k-1; end
end
K=0;
for i=1:length(JJ),  
   V0=[]; Rt0=Rt(K+1); j=(1:Nd)';
   if (abs(imag(Rt0))<eps),K=K+JJ(i);
      V0=[V0, real(Rt0).^j];
      if JJ(i)>1, V1=V0; 
         for k=2:JJ(i), V2=zeros(Nd,1);
            for j=k:Nd
               V2(j)=V1(j-1)*(j-1)/(k-1);
            end
            V0=[V0 V2]; V1=V2;
      end, end
   else, K=K+2; 
      VV=Rt0.^j; V0=[V0,real(VV),imag(VV)];
   end
   V=[V V0];
end
T=inv(M)*V; AJ=inv(T)*A*T; AJ(abs(AJ)<Eps)=0;

⌨️ 快捷键说明

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