北航数值分析实习第二题Word文档下载推荐.docx
《北航数值分析实习第二题Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《北航数值分析实习第二题Word文档下载推荐.docx(17页珍藏版)》请在冰豆网上搜索。
因此,求解时候,需要给特征向量某个元素赋值,本题,将最后一个元素统一赋值为1,即可求出对应于某个特征值的特征向量的基础解系,而全部特征向量为,k取不等于0的任意实数。
2C++程序
#include<
stdio.h>
math.h>
stdlib.h>
time.h>
#definen11
#defineerr1e-12
#defineL2500
voidcaculateA();
//计算矩阵A的系数
voidhessenberg();
//将A拟上三角化
voidQR();
//对矩阵进行QR分解
voidQRshuangbu();
//对矩阵进行带双步位移的QR分解
voidgauss();
//列主元的高斯消元法求解特征向量
inti,j,s,p,k,ik,nR,nC;
doubleA[n][n],q[n][n],r[n][n],rq[n][n],I[n][n];
doubleP[n],W[n],u[n],Q[n];
doubledr,cr,hr,ar,tr;
doubles1,t,x,tzR[n],tzC[2][n],sum,M[n][n],v[n];
voidmain()
{for(i=1;
i<
n;
i++)
{for(j=1;
j<
j++)
{if(i==j)
{I[i][j]=1;
q[i][j]=1;
}
else{I[i][j]=0;
q[i][j]=0;
}}}
caculateA();
hessenberg();
QR();
QRshuangbu();
gauss();
printf("
运行时间为%d\n"
clock());
voidcaculateA()//计算矩阵A的系数
{
for(i=1;
{for(j=1;
{if(j!
=i)
A[i][j]=sin(0.5*i+0.2*j);
else
A[i][j]=1.52*cos(i+1.2*j);
}
voidhessenberg()//将A拟上三角化
for(s=1;
s<
n-2;
s++)
{for(ar=0.0,i=s+2;
ar+=A[i][s]*A[i][s];
if(ar<
=err)
continue;
else{
ar+=A[s+1][s]*A[s+1][s];
dr=sqrt(ar);
if(A[s+1][s]>
0)
cr=-dr;
else
cr=dr;
hr=cr*cr-cr*A[s+1][s];
for(i=1;
=s;
u[i]=0.0;
u[s+1]=A[s+1][s]-cr;
for(i=s+2;
u[i]=A[i][s];
for(j=1;
{for(P[j]=0.0,i=1;
P[j]+=A[i][j]*u[i]/hr;
for(tr=0.0,i=1;
{tr+=P[i]*u[i]/hr;
for(i=1;
{for(Q[i]=0.0,j=1;
Q[i]+=A[i][j]*u[j]/hr;
{W[i]=Q[i]-tr*u[i];
{for(j=1;
A[i][j]-=(W[i]*u[j]+u[i]*P[j]);
}
for(i=1;
{for(j=1;
if(fabs(A[i][j])<
err)
A[i][j]=0.0;
printf("
数值分析计算实习第二次作业\n"
);
A1班\n"
\n"
矩阵A经过拟上三角化后得到的矩阵为:
for(i=1;
{
for(j=1;
j++)
printf("
%1.12e,"
A[i][j]);
printf("
voidQR()//对矩阵进行QR分解
doubleu[n],w[n],F[n];
for(p=1;
p<
p++)
r[s][p]=A[s][p];
n-1;
{
for(dr=0.0,i=s;
dr+=r[i][s]*r[i][s];
dr=sqrt(dr);
if(dr<
continue;
else
{if(A[s][s]>
0)cr=-dr;
elsecr=dr;
hr=cr*cr-cr*r[s][s];
s;
u[i]=0;
u[s]=r[s][s]-cr;
for(i=s+1;
u[i]=r[i][s];
{for(F[i]=0.0,j=1;
F[i]+=r[j][i]*u[j]/hr;
{for(j=1;
r[i][j]=r[i][j]-u[i]*F[j];
for(i=1;
{for(w[i]=0.0,j=1;
w[i]+=q[i][j]*u[j];
i++)
{for(j=1;
q[i][j]-=w[i]*u[j]/hr;
}
}
for(i=1;
{for(j=1;
{for(rq[i][j]=0.0,s=1;
rq[i][j]+=r[i][s]*q[s][j];
}}
A经过QR分解后得到的正交矩阵Q为:
for(i=1;
if(fabs(q[i][j])<
q[i][j]=0.0;
{for(j=1;
q[i][j]);
A经过QR分解后得到的上三角矩阵R为:
if(fabs(r[i][j])<
r[i][j]=0.0;
r[i][j]);
正交矩阵Q乘以上三角矩阵R得到的RQ为:
if(fabs(rq[i][j])<
rq[i][j]=0.0;
rq[i][j]);
voidQRshuangbu()//对矩阵进行带双步位移的QR分解
intK=1,m=10;
nR=0,nC=0;
loop3:
if(fabs(A[m][m-1])<
{nR++;
tzR[nR]=A[m][m];
m--;
gotoloop4;
elsegotoloop5;
loop4:
if(m==1)
{
nR++;
tzR[nR]=A[1][1];
gotoloop9;
elseif(m==2)
{
s1=A[m-1][m-1]+A[m][m];
t=A[m-1][m-1]*A[m][m]-A[m][m-1]*A[m-1][m];
x=s1*s1-4*t;
if(x>
=0)
nR++;
tzR[nR]=(s1+sqrt(x))/2;
tzR[nR]=(s1-sqrt(x))/2;
nC++;
tzC[0][nC]=s1/2;
tzC[1][nC]=sqrt(-x)/2;
tzC[1][nC]=-sqrt(-x)/2;
elsegotoloop3;
loop5:
if(fabs(A[m-1][m-2])<
s1=A[m