1、隐式QR法求实矩阵地全部特征值matlab实现隐式QR法求实矩阵的全部特征值matlab实现要求:用matlab编写通用子程序,利用隐式QR法求实矩阵的全部特征值和特征向量。思想:隐式QR法实质上就是将一个矩阵 Schur化,之后求解特征值就比较方便。而隐式QR法还需要用到household变换,以及上hessenberg变换。最后使用QR迭代,达到Schur化的结果。步骤:1.将矩阵A上hessenberg化(算法6.4.1),送而得到一个上hessenberg形矩阵H;2.可约性判定,也就是判断次对角线元素是否非零,如果次对角线元素非零,则不可约。3.Schur化,也就是通过QR迭代,将矩
2、阵H变化成为某些次对角线元素变成0,同时还要满足,这些元素之间间隔最大为1,那么,所得到的最重的矩阵H就是一个Schur形矩阵。4.假如两个等于0的次对角线元素间隔为0,那么该元素的上面一个元素,也就是H的对角线上的元素,即为其中一个特征值;假如两个等于0的次对角线元素间隔为1,那么在这两个元素之间就形成了一个2*2的矩阵,可以求解一个一元二次方程来得到两个共轭的特征值。实验代码:详见附录2实验结果:(代码相见附录2)(i)设矩阵A如下:求x=0.9, 1.0, 1.1时的特征值和特征向量。X=0.9:r是特征值,V是特征向量矩阵。X=1:r是特征值,V是特征向量矩阵。X=1.1:r是特征值,
3、V是特征向量矩阵。(ii)求的所有根。附录2隐式QR迭代:主程序:function r,V=SchurQR(A)%向量r用来储存特征值%Hessenberg分解:m,m=size(A);for k=1:m-2 v,b=house(A(k+1:m,k); H1= eye(m-k)-b*v*v; H2=eye(m); for i=k+1:m for j=k+1:m H2(i,j)=H1(i-k,j-k); end end if k=1; H=H2; else H=H*H2; end A(k+1:m,k:m)=H1*A(k+1:m,k:m); A(1:m,k+1:m)= A(1:m,k+1:m)*H
4、1;endu=10e-5;for i=2:m; if abs( A(i,i-1)=(abs(A(i,i)+ abs(A(i-1,i-1)*u; A(i,i-1)=0; endend%QR迭代:H22=A;x=Ifreducible(H22);while x=1 H22=Francis(H22); x=Ifreducible(H22);endr,V=EigValue(H22);子程序1:function r,V=EigValue(A)%计算A的特征值,特征向量n,n=size(A);r=zeros(1,n);y=zeros(1,n-1);%y用来储存次对角线元素 for i=1:n-1 y(i)
5、=A(i+1,i);endm=0;for i=1:n-1 if abs(y(i)-0)1e-5 m=m+1; endendif m=0 x=1;elsez=zeros(1,m);%z用来储存值为0的y向量的角标。j=1;i=1;while(in) if abs(y(i)-0)1e-5 z(j)=i; j=j+1; end i=i+1;endend if z(1)=2%次对角线第一个等于0的元素的位置不同,需要2分类讨论 p=1,A(1,1)+A(2,2),A(1,1)*A(2,2)-A(1,2)*A(2,1) r(1:2)=roots(p);%求2*2矩阵的特征值 j=1; while jm
6、if z(j+1)-z(j)=1 r(z(j+1)=A(z(j+1),z(j+1); end if(z(j+1)-z(j)=2) p=1,-(A(z(j+1)-1,z(j+1)-1)+A(z(j+1),z(j+1),A(z(j+1)-1,z(j+1)-1)*A(z(j+1),z(j+1)-A(z(j+1)-1,z(j+1)*A(z(j+1),z(j+1)-1); r(z(j+1)-1):z(j+1)=roots(p); end j=j+1; end if n-z(m)=1 r(n)=A(n,n); else p=1,-(A(n-1,n-1)+A(n,n),A(n-1,n-1)*A(n,n)-A
7、(n-1,n)*A(n,n-1); r(n-1:n)=roots(p); endelse r(1)=A(1,1); j=1; while jm if z(j+1)-z(j)=1 r(z(j+1)=A(z(j+1),z(j+1); end if(z(j+1)-z(j)=2) p=1,-(A(z(j+1)-1,z(j+1)-1)+A(z(j+1),z(j+1),A(z(j+1)-1,z(j+1)-1)*A(z(j+1),z(j+1)-A(z(j+1)-1,z(j+1)*A(z(j+1),z(j+1)-1); r(z(j+1)-1):z(j+1)=roots(p); end j=j+1; end i
8、f n-z(m)=1 r(n)=A(n,n); else p=1,-(A(n-1,n-1)+A(n,n),A(n-1,n-1)*A(n,n)-A(n-1,n)*A(n,n-1); r(n-1:n)=roots(p); end end子程序2:function x=Ifreducible(A)%判断H22是否已经schur形 x=1表示还不是schur形,x=0表示已经是schur形%y用来储存A次对角线元素%z用来储存y元素为零的角标n=size(A);y=zeros(1,n-1);x=1;for i=1:n-1 y(i)=A(i+1,i);endm=0;for i=1:n-1 if abs(
9、y(i)-0)1e-5 m=m+1; endendif m=0 x=1;elsez=zeros(1,m);j=1;i=1;while(in) if abs(y(i)-0)1e-5 z(j)=i; j=j+1; end i=i+1;endi=1;while(i2 x=1; break; end i=i+1; end if i=m x=0;end end子程序3:function H22=Francis(A)%QR迭代H22=A;q,q=size(H22);p=q-1;s=H22(p,p)+H22(q,q);t= H22(p,p)* H22(q,q)- H22(p,q)*H22(q,p);x=H2
10、2(1,1)*H22(1,1)+H22(1,2)*H22(2,1)-s* H22(1,1)+t;y=H22(2,1)*(H22(1,1)+H22(2,2)-s);z=H22(2,1)*H22(3,2);for k=0:q-3; v,b=house(x,y,z); w=max(1,k); H22(k+1:k+3,w:q)=(eye(3)-b*v*v)* H22(k+1:k+3,w:q); r=min(k+4,q); H22(1:r,k+1:k+3)= H22(1:r,k+1:k+3)*(eye(3)-b*v*v); x=H22(k+2,k+1); y=H22(k+3,k+1); if kq-3
11、z=H22(k+4,k+1); endendv,b=house(x,y);H22(q-1:q,q-2:q)=(eye(2)-b*v*v)*H22(q-1:q,q-2:q);H22(1:q,q-1:q)=H22(1:q,q-1:q)*(eye(2)-b*v*v); 子程序4:function v,b=house(x)%house变换n=length(x);m=max(abs(x);x=x/m;q=x(2:n)*x(2:n);v(1)=1;v(2:n)=x(2:n);if q=0 b=0;else a=(x(1)2+q)(1/2); if x(1)=0 v(1)=x(1)-a; else v(1)=-q/(x(1)+a); end b=2*v(1)2/(q+v(1)2); v=v/v(1);endv=v;