题目:使用带双步位移的qr分解法求矩阵的全部特征值,并对其中的每一个实特征值求相应的特征向量。已知: (i,j=1,2,……10)
一、 算法的设计方案:
一)、总体方案设计:
构造矩阵 a,先利用householder矩阵对矩阵a作相似变换,把a化为拟上三角矩阵a(n-1),然后进行带双步位移的qr分解求解矩阵的全部特征值,然后对实特征值利用列主元高斯消元法求解其对应的特征向量。
题目要求输出矩阵a(n-1)qr分解得到的矩阵q、r以及乘积矩阵rq,可用单独的qr分解法进行计算输出。
二)具体算法设计:
1、对矩阵赋值:即为下述程序中的double fuzhi()子程序。
2、对上述生成的矩阵进行拟上三角化:即为下述程序中的void nssjh()子程序,输出矩阵a(n-1)。
3、对拟上三角化后的矩阵进行qr分解:程序中用void qr()子程序来对拟上三角化过后的a阵进行qr分解,并输出q阵、r阵和乘积矩阵rq阵。
4、对拟上三角化后的矩阵进行带双步位移的qr分解。
子程序void doubleqr()实现对拟上三角化后的a阵进行带双步位移的qr分解,得出特征值并输出。
5、求解每一个实特征值相应的特征向量:用子程序void tzxl()对其中的实数特征值进行求解,得出对应的特征向量并输出。
二、源程序:
#include<>
#include
#include<>
#include<>
#include<>
#include头文件*/
*定义全局变量*/
#define epsilon 1e-12 /*定义精度*/
#define n 11取n为11,可实现从1到10的存储,方便计算*/
#define n 10 /*为了方便计算取n*/
#define l 1000 /*规定迭代次数*/
double a[n][n];
double lambda[n][2];
double fuzhi();赋值函数*/
void nssjh();拟上三角化函数*/
void qrqr分解函数*/
void doubleqr();带双步位移的qr分解函数*/
void tzxl();求取实特征根对应特征向量的函数*/
double fuzhi() 赋值函数,存储行列均为1-10*/
int i,j;
for(i=1;i
return a[i][j];
void nssjh() 拟上三角化函数*/,qr[n]=,ur[n],wr[n]=;
fuzhi();
for(r=1;r<=n-2;r++)
dr=sqrt(temp求解dr*/
if(a[r+1][r]>0)
cr=-dr;
else cr=dr求解cr*/
hr=cr*cr-cr*a[r+1][r]; 求解hr
for(i=1;i<=r;i++)
ur[r+1]=a[r+1][r]-cr;
for(i=r+2;i<=n;i++)
ur[i]=a[i][r]; 生成ur[n]*/
for(i=1;i<=n;i++)
/*求解pr[n]*/
for(i=1;i<=n;i++)
/*求解qr[n]*/
for(i=1;i<=n;i++)
for(i=1;i<=n;i++)
for(i=1;i<=n;i++)
printf("%对a进行拟上三角化得到的矩阵a(n-1):");
for(i=1;i<=n;i++)
printf("",a[i][j]);输出拟上三角化后的a(n-1)*/
void qr() qr分解函数*/
int i,j,k,r;
double dr,cr,hr,temp,sum;
double q[n][n]=,wr[n]=,ur[n]=,pr[n]=,a[n][n]=,b[n]=;
for(i=1;i<=n;i++)
生成q[n]*/
nssjh();
for(r=1;rsum=0;
for(i=r+1;i<=n;i++)
sum=sum+a[i][r]*a[i][r];}
if(sum==0)
continue;/*如果a[i][r](i=r+1,……n)全为零,r++,继续循环*/
elsesum=sum+a[r][r]*a[r][r];
dr=sqrt(sum); 求解dr*/
if(a[r][r]>0)
cr=-dr;
else cr=dr; /求解cr*/
hr=cr*cr-cr*a[r][r]; 求解hr*/
for(i=1;iur[i]=0;}
ur[r]=a[r][r]-cr;
for(i=r+1;i<=n;i++)
ur[i]=a[i][r];}生成ur[n]*/
for(i=1;i<=n;i++)
temp=0;
for(j=1;j<=n;j++)
wr[i]=temp; /求解wr[n]*/
for(i=1;i<=n;i++)
求解q[n],即为所求矩阵q*/
for(i=1;i<=n;i++)
pr[i]=temp; /求解pr[n]*/
for(i=1;i<=n;i++)
求解a[n][n],即为所求r矩阵*/
for(i=1;i<=n;i++)
a[i][j]=temp;
求解a[n],即为所求乘积矩阵rq*/
printf("%对a进行qr得到的矩阵q:");输出q、r、rq*/
for(i=1;i<=n;i++)
printf("");
printf("%对a进行qr得到的矩阵r:");
for(i=1;i<=n;i++)
printf("");
printf("%对a进行qr得到的乘积矩阵rq:");
for(i=1;i<=n;i++)
printf("");
void doubleqr() 带双步位移的qr分解函数*/
int i,j,k,m,r,l;
double b,c,d,s,t,m[n][n]=,i[n][n]=;
double cr,dr,hr,tr,temp,sum;
double pr[n]=,qr[n]=,ur[n]=,wr[n]=,vr[n]=;
北航数值分析第二次大作业 QR分解
数值分析a 计算实习题目二。2012年10月。一 算法设计方案。整个程序主要分为四个函数,主函数,拟上三角化函数,qr分解函数以及使用双步位移求解矩阵特征值 特征向量的函数。因为在最后一个函数中也存在qr分解,所以我没有采用参考书上把矩阵m进行的qr分解与矩阵ak的迭代合并的方法,而是在该函数中调用...
北航数值分析大作业第二次
数值分析 计算实习作业。第二题 算法设计方案 1 对矩阵a赋值,取计算精度 1 10 12 2 对矩阵a进行拟上三角化,得到a n 1 并输出a n 1 对矩阵a的拟上三角化,通过直接调用子函数inftrianglize a 来实现 拟上三角化得到的矩阵a n 1 输出至文件中。3 对a n 1 进...
第二次大作业
一 填空题。是指人们关于基本价值的立场 取向 态度 信念 理想系统。是指一种哲学思想或道德标准,用来辨别行为的善与恶,即这会关系中判断行为的一种道德标准。是指风俗习惯及社会传统,它是调节和约束人们行为的一种社会规范。社会工作伦理困境是指由于社会工作者所秉承的 之间的不一致而产生的困顿局面。社会工作专...