- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
数值分析第二次 SY1107214 王宽
第PAGE 17页
题目分析
使用带双步位移的QR分解法求矩阵的全部特使用带双步位移的QR分解法求矩阵的全部特征值,并对其中的每一个实特征值求相应的特征向量。已知: (i,j=1,2,……,10)
算法设计
按照题目给出的矩阵定义对矩阵A赋初值:对应的函数为initA();
为了减少求特征值和特征向量过程中的计算量,在对矩阵进行QR分解前先进行拟上三角化:对应的函数为nssj();
对拟上三角化后的矩阵A使用带双步位移的QR分解法逐次迭代(最大迭代次数L=500),逐个求出其特征值,对应的函数为tezhengzhi();这个过程中包含着两个子程序:QR()和qmk(),分别用来对矩阵Mk进行QR分解并得到Ak+1和计算mk的值;
使用带原点平移的反幂法求出其对应的特征向量,对应的函数为:fmifa(),这个过程中求解线性方程时用到列主元的高斯消元法,对应的函数为:gauss(double );
根据数值分析课本的相关知识,步骤3中带双步位移的QR分解法的流程图如下:
本次作业所使用的编译环境为:Visual c++6.0
程序源代码
#includestdio.h
#includemath.h
double A[10][10],rr[10][10],qq[10][10],rq[10][10],uk[10][10];
double xy[10],x[10]={0}; //反幂法中
double tzr[10]={0},tzi[10]={0}; //定义矩阵的特征值数组,r实部、i虚部
//对矩阵A进行初始化,赋值
void initA()
{
int i,j;
for(i = 1; i = 10; i++)
{
for(j= 1; j= 10;j++)
A[i-1][j-1]=sin(0.5*i+0.2*j);
}
for(i= 1; i= 10;i++)
A[i- 1][i- 1]=cos(i+1.2*i)*1.5;
}
//定义函数对矩阵A进行拟上三角化
void nssj()
{
int r,i,j;
int sgn(double a);
double d,c,h,t,tr,u[10],p[10],q[10],w[10];
double sum=0,tmp=0;
//开始循环
for (r=0;r8;r++)
{
t= 0;
for(i= r+2;i10;i++) t= t+(A[i][r]==0);
if (t==8- r) continue;
else
{
sum=0;
for (i=r+1;i10;i++)
sum=sum+ A[i][r]*A[i][r];
d= sqrt(sum);
c= -1*sgn(A[r+1][r])*d;
h= c*c- c*A[r+1][r];
//step (3)
for (i=0;i10;i++) u[i]= 0;
for (i=r+2;i10;i++) u[i]= A[i][r];
u[r+1]= A[r+1][r]- c;
//step (4)
for(i= 0;i 10; i++)
{
tmp= 0;
sum= 0;
for(j= 0;j 10; j++)
{
tmp= tmp+A[j][i]* u[j];
sum= sum+A[i][j]* u[j];
}
p[i]= tmp/h;
q[i]= sum/h;
}
sum=0;
for(i= 0;i 10; i++) sum= sum+ p[i]*u[i];
tr= sum/h;
for(i= 0;i 10; i++)
w[i]= q[i]- tr*u[i];
for(i= 0;i 10;i++)
{
for(j= 0;j 10;j++)
{
A
原创力文档


文档评论(0)