QR方法求矩阵全部特征值.doc_第1页
QR方法求矩阵全部特征值.doc_第2页
QR方法求矩阵全部特征值.doc_第3页
QR方法求矩阵全部特征值.doc_第4页
QR方法求矩阵全部特征值.doc_第5页
已阅读5页,还剩11页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

数 值 分 析课程设计 QR方法求矩阵全部特征值问题复述用算法求矩阵特征值:(i) (ii)要求:(1) 根据算法原理编制求(i)与(ii)中矩阵全部特征值的程序并输出计算结果(要求误差)(2) 直接用现有的数学软件求(i),(ii)的全部特征值,并与(1)的结果比较。问题分析 QR方法是目前公认为计算矩阵全部特征值的最有效的方法。它适用于任一种实矩。QR方法的原理是利用矩阵的正交分解产生一个与矩阵A相似的矩阵迭代序列,这个序列将收敛于一个上三角阵或拟上三角阵,从而求得原矩阵A的全部特征值。QR是一个迭代算法,每一步迭代都要进行QR分解,再作逆序的矩阵乘法。要是对矩阵A直接用QR方法,计算量太大,效率不高。因此,一个实际的QR方法计算过程包括两个步骤,首先要对矩阵A用初等相似变换约化为上Hessenberg矩阵,再用QR方法求上Hessenberg矩阵的全部特征值。示意如下: 对B矩阵的约化只需将每列次对角线上的元素约化为0。因此常常用平面旋转阵(Givens变换阵)来进行约化。1、 QR方法原理及收敛性设已实现了QR分解,记 其中是正交阵,是上三角阵。因为,用对作正交相似变换有可改写为 显然只是的QR分解因子阵的逆序相乘,而且与原矩阵有相同的特征值。对矩阵再重复以上过程并继续下去,可以得到一个与原矩阵A有相同特征值的矩阵序列。其过程如下: 记 对作正交分解 作矩阵 , 对作正交分解 作矩阵 ,重复以上过程可得一般的形式为对作正交分解 构成矩阵序列 (k=1,2) A 从矩阵A开始得到一个矩阵序列 这个矩阵序列中每一个矩阵都与原矩阵相似,即都有与A相同的特征值。这个矩阵序列在实质上收敛于依次以为对角元的上三角阵。具体可以表示为其中 的极限不一定存在。2、 用正交相似变换约化矩阵为上Hessenberg阵 用Householder变换可以将一个向量指定的某个分量以下的各分量变为0。我们只要求消掉A的次对角线以下的元素,即将A约化为上Hessenberg阵。为了使变换前后矩阵的特征值不变,需要用Householder矩阵对A作相似变换,即用正交阵同时左乘和右乘A时,原来已变为0的元素不再改变。若设是Householder矩阵,用它对A的第一列元素的变换示意如下: 依次对A的各列进行类似的变换,一共要进行次变换,最终可以得到一个与原矩阵A有相同特征值的上Hessenberg阵。 以上约化A为上Hessenberg阵的过程可以用一系列Householder矩阵来实现。其中,对于每一个有经过步约化就可得到一个上Hessenberg阵(A的第列不需要约化) 3、 Hessenberg阵的QR算法 设矩阵,其特征值都是实数。若已用Householder变换约化为上Hessenberg阵 对已得到的上Hessenberg阵可用QR变换,经过迭代过程约化为上三角形矩阵以求出A的特征值。只要A的特征值是实数,将B约化为上三角形矩阵总是可以做到的。 由于B矩阵结构上的特点,对B矩阵的约化只需将每列次对角线上的元素约化为0.可用平面旋转阵(Givens变换阵)来进行约化。n阶方阵为平面旋转阵 。还是一个非对称的正交阵,有,也是一个平面旋转阵。 有以下几种作用: 1、左乘向量只改变x 的第i个和第j个分量。现构造对x作变换使的结果将x的第j个分量约化为0。令,有调整角可使。若记,按下式选取于是有。 2、对非零的n维向量x连续左乘,可将x的第i+1到第n个分量都约化为零;即 其中 3、用对矩阵A作变换得到的结论是 左乘A只改变A的第i,j 行; 右乘A只改变A的第i,j列; 用对A作正交相似变换改变了A的i行和j行以及i列和j列。用一系列连续左乘矩阵A,可以将矩阵A化为上三角阵。 数据结构描述主要数据成员说明double Ann 存放矩阵Adouble Qnn,存放QR分解式的正交矩阵Qdouble Rnn存放QR分解式的上三角阵Rdouble pnnGivens矩阵pdouble InnN阶单位阵double Vnn存放Q矩阵的转置double Tnn初等反射阵Tdouble eps精度double max最大值double det存放行列式的值int count存放迭代次数主要函数成员说明double Det(double Lnn)用高斯列主元方法求行列式int Non_singularMatrix(double Lnn)判断是否是非奇异矩阵void Disp(double Hnn)输出矩阵int IsZero(double a,int j)判断数组是否全为0int sgn(double y)符号函数void Hessenberg(double Ann)将矩阵化为上Hessenberg矩阵int IsHessenberg(double Enn)判断是否是上Hessenberg矩阵void QRAlgorithm(double Ann)QR算法求特征值void SeekEigenvalue(double Ann)判断是否满足QR算法条件,满足则进行QR方法求特征值算法的描述(流程图) 源程序C程序为:#include#include#define n 3#define eps 1E-5double Det(double Lnn)/用高斯列主元方法求行列式double det=1,t;for(int k=0;kn-1;k+)double max=Lkk;int Ik=k;for(int j=k+1;jn;j+)if(maxLjk)max=Ljk;Ik=j;if(max=0) return 0;if(Ik!=k)for(int j=k;jn;j+)t=LIkj;LIkj=Lkj;Lkj=t;det*=-1;for(int i=k+1;in;i+)t=Lik/Lkk;Lik=t;for(int j=k+1;jn;j+)Lij=Lij-t*Lkj;det*=Lkk;if(Ln-1n-1=0) return 0;elseprintf( 矩阵A的行列式为:%.5fn,det*Ln-1n-1);return det*Ln-1n-1;int Non_singularMatrix(double Lnn)/判断是否是非奇异矩阵printf( 判断矩阵A的行列式是否为0?n);if(Det(L)!=0) return 1;return 0;void Disp(double Hnn)/输出矩阵for(int i=0;in;i+)for(int j=0;jn;j+)printf(%.6f ,Hij);printf(n);int IsZero(double a,int j)/判断数组是否全为0for(int i=0;i0) return 1;else if(y=0) return 0;else return -1;void Hessenberg(double Ann)/将矩阵化为上Hessenberg矩阵printf(原矩阵为:n);Disp(A);/输出原矩阵double Tnn,Bnn,Cnn,cn-1,vn-1,un-1,Rn-1n-1,In-1n-1,t,w,s;int i,j,k,m;for(k=0;kn-2;k+)for(i=0;in-k-1;i+)for(j=0;jn-k-1;j+)if(i=j) Iij=1;else Iij=0;/定义单位阵Idouble max=fabs(Ak+1k);/求最大值for(i=0;in-k-1;i+)if(maxfabs(Ai+k+1k)max=fabs(Ai+k+1k);for(i=0;in-k-1;i+)ci=Ai+k+1k/max;/标准化数组if(IsZero(c,n-k-1)/判断数组是否全为0continue;/数组为0,则这一步不需要约化for(i=0,t=0.0;in-k-1;i+)t+=ci*ci;vk=sgn(Ak+1k)*sqrt(t);/u0=c0+vk;for(j=1;jn-k-1;j+)uj=cj;/求矩阵uw=vk*(c0+vk);for(i=0;in-k-1;i+)for(j=0;jn-k-1;j+)Rij=Iij-ui*uj/w;for(i=0;in;i+)for(j=0;jn;j+)if(i=j) Tij=1;else Tij=0;/定义矩阵T为单位阵for(i=0;in-k-1;i+)for(j=0;jn-k-1;j+)Ti+k+1j+k+1=Rij;/初等反射阵Tfor(i=0;in;i+) /矩阵T左乘矩阵Afor(j=0;jn;j+)for(m=0,s=0.0;mn;m+)s+=Tim*Amj;Bij=s;for(i=0;in;i+) /矩阵T右乘矩阵Afor(j=0;jn;j+)for(m=0,s=0.0;mn;m+)s+=Bim*Tmj;Cij=s;for(i=0;in;i+)for(j=0;jn;j+)Aij=Cij;printf(原矩阵化成上Hessenberg矩阵后为:n);Disp(A);int IsHessenberg(double Enn)/判断是否是上Hessenberg矩阵for(int i=2;in;i+)for(int j=0;j+1i;j+)if(Eij!=0)return 0;return 1;int count=1;void QRAlgorithm(double Ann)/QR算法求特征值int i,j,k,m;double pnn,Qnn,Rnn,Fnn,Vnn,c,s,t,y,max;for(i=0;in;i+)/赋Q为单位阵for(int j=0;jn;j+)if(i!=j) Qij=0;else Qij=1;for(m=0;mn-1;m+)/对矩阵A进行QR分解for(i=0;in;i+)/赋p为单位阵for(j=0;jn;j+)if(i!=j) pij=0;else pij=1;c=Amm/sqrt(Amm*Amm+Am+1m*Am+1m);s=Am+1m/sqrt(Amm*Amm+Am+1m*Am+1m);pmm=c;pmm+1=s;pm+1m=-s;pm+1m+1=c;/p为Givens矩阵for(i=0;in;i+)/p矩阵左乘W矩阵,p矩阵左乘Q矩阵for(j=0;jn;j+)t=0;y=0;for(k=0;kn;k+)t+=pik*Akj;y+=pik*Qkj;Rij=t;Fij=y;for(i=0;in;i+)/A,R赋新值for(j=0;jn;j+)Aij=Rij;Qij=Fij;for(i=0;in;i+)/Q转置for(j=0;jn;j+)Vij=Qji;for(i=0;in;i+)for(j=0;jn;j+)Qij=Vij;for(i=0;in;i+)/矩阵A为矩阵R和矩阵Q的乘积for(j=0;jn;j+)t=0;for(k=0;kn;k+)t+=Rik*Qkj;Aij=t;count+;max=fabs(A10);/求A矩阵下三角的绝对值最大值for(i=1;in;i+)for(j=0;jmax)max=fabs(Aij);if(maxeps)/满足精度条件,输出Q矩阵,R矩阵以及特征值printf(在精度%.1e下,QR算法迭代次数为:%d次n输出矩阵A%d:n,eps,count-1,count);Disp(A);/输出A矩阵printf(输出矩阵Q:n);Disp(Q);printf(输出矩阵R:n);Disp(R);printf(输出A矩阵的全部特征值:);for(i=0;in;i+)if(i%3=0) printf(n);printf(a%d=%.6ft,i+1,Aii);printf(n);return;QRAlgorithm(A);void SeekEigenvalue(double Ann)/判断是否满足QR算法条件,满足则进行QR方法求特征值double Znn;for(int i=0;in;i+)for(int j=0;jn;j+)Zij=Aij;printf(判断矩阵A是否是非奇异矩阵?n);if(Non_singularMatrix(Z)=0)printf(矩阵A不是非奇异矩阵!不符合分解条件!n);return;elseprintf(矩阵A是非奇异矩阵!符合分解条件!n);printf(判断矩阵A是否是上Hessenberg矩阵?n);if(IsHessenberg(A)=0)printf(不是上Hessenberg矩阵!将其化为上Hessenberg矩阵.n);Hessenberg(A);/将矩阵A转化为上Hessenberg矩阵else printf(是上Hessenberg矩阵!不需要将其再化为上Hessenberg矩阵!n);printf(QR方法求全部特征值:n);QRAlgorithm(A);/用QR方法求特征值void main()/*double A155=2,3,4,5,6,4,4,5,6,7,0,3,6,7,8,0,0,2,8,9,0,0,0,1,0;用此组数据时#define

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论