文档详情

数值分析——带双步位移的QR分解求特征值算法.docx

发布:2018-01-13约7.23千字共11页下载文档
文本预览下载声明
数 值 分 析(B) 大 作 业(二) 1、算法设计: ①矩阵的拟上三角化: 对实矩阵A进行相似变换化为拟上三角矩阵,其变换矩阵采用Householder矩阵,变换过程如下: 若,则; 否则,, , , , 。 当时,得,令又是对称正交矩阵,于是成立,因而与 相似。 ②矩阵的QR分解: 矩阵的QR分解过程与拟上三角化过程相似,在这里不再重复其原理。 ③求全部特征值 矩阵拟上三角化后利用带双步位移的QR方法,采用书本Page 63页具体算法实现。为了使编程方便,并体会goto语句使用的灵活性,程序中的跳转均使用goto Loop*实现。 ④求A的相应于实特征值的特征向量 求实特征值对应的特征向量,即是求解线性方程组,。因此,为得到全部实特征值对应的特征向量,解线性方程组的过程要循环n次(n为矩阵阶数)。线性方程组的求解采用列主元素Gauss消去法。 #include stdio.h #include math.h #define ERR 1.0e-12 //误差限 #define N 10 //矩阵行列数 #define L 1.0e5 //最大迭代次数 double A[N][N]={0}; void Init_A() //初始化矩阵 { int i,j; for(i=0;iN;i++) for(j=0;jN;j++) { if(i==j) A[i][j]=1.5*cos((i+1)+1.2*(j+1)); else A[i][j]=sin(0.5*(i+1)+0.2*(j+1)); } } /* void Display_A() { int i,j; for(i=0;iN;i++) { for(j=0;jN;j++) printf(%8.4f,A[i][j]); printf(\n); } } */ int Sgn(double a) { if(a=0) return 1; else return -1; } void On_To_The_Triangle() //矩阵拟上三角化 { int i,j,r,flag=0; double cr,dr,hr,tr,temp; double ur[N],pr[N],qr[N],wr[N]; for(r=1;r=N-2;r++) { flag=0; for(i=r+2;i=N;i++) if(A[i-1][r-1]!=0) { flag=1; break; } if(0==flag) continue; dr=0; for(i=r+1;i=N;i++) dr+=A[i-1][r-1]*A[i-1][r-1]; dr=sqrt(dr); if(0==A[r][r-1]) cr=dr; else cr=-Sgn(A[r][r-1])*dr; hr=cr*cr-cr*A[r][r-1]; for(i=1;i=r;i++) ur[i-1]=0; ur[r]=A[r][r-1]-cr; for(i=r+2;i=N;i++) ur[i-1]=A[i-1][r-1]; for(i=1;i=N;i++) { temp=0; for(j=1;j=N;j++) temp+=A[j-1][i-1]*ur[j-1]; pr[i-1]=temp/hr; } for(i=1;i=N;i++) { temp=0; for(j=1;j=N;j++) temp+=A[i-1][j-1]*ur[j-1]; qr[i-1]=temp/hr; } temp=0; for(i=1;i=N;i++) { temp+=pr[i-1]*ur[i-1]; tr=temp/hr; } for(i=1;i=N;i++) { wr[i-1]=qr[i-1]-tr*ur[i-1]; } for(i=1;i=N;i++) for(j=1;j=N;j++) A[i-1][j-1]=A[i-1][j-1]-wr[i-1]*ur[j-1]-ur[i-1]*pr[j-1]; } } void Get_Roots(double eigenvalue[][2],int m,double ss,double tt) //求一元二次方程的根 { double discriminant=ss*ss-4*tt; // if(discriminant0) { *(*(eigenvalue+m-2)
显示全部
相似文档