北航研究生数值分析作业第二题.docx
- 文档编号:5014155
- 上传时间:2022-12-12
- 格式:DOCX
- 页数:18
- 大小:20.59KB
北航研究生数值分析作业第二题.docx
《北航研究生数值分析作业第二题.docx》由会员分享,可在线阅读,更多相关《北航研究生数值分析作业第二题.docx(18页珍藏版)》请在冰豆网上搜索。
北航研究生数值分析作业第二题
北航研究生数值分析作业第二题:
一、算法设计方案
1.按照题目给出的矩阵定义对矩阵A赋初值:
对应的函数为a_init();
2.对矩阵A进行householder变换,使其拟上三角化:
对应的函数为householder();
3.输出拟上三角化后的A:
对应的函数为aout(int);
4.对拟上三角化后的矩阵A使用带双步位移的QR分解法逐次迭代(最大迭代次数L=500),逐个求出其特征值,对应的函数为eigen_a();中间包含两个子程序:
calc_mk()和qr_analyze(),分别用来计算矩阵Mk和对Mk进行QR分解并得到Ak+1;
5.输出QR分解过程完毕后的A及求得的特征向量:
对应的函数为aout()和eigenvalout();
6.对于在第三步中求得的每个实特征值,使用带原点平移的反幂法求出其对应的特征向量,对应的函数为eigenvec();其中包含一个解方程(A-μI)=yk-1的程序段。
这部分也用迭代完成,仍然将最大迭代次数L设置为500;
7.输出矩阵A的特征向量,结束计算:
对应的函数为eigenvecout()。
算法编译环境:
vlsualc++6.0
二、源程序如下:
#include
#include
#defineN10//矩阵阶数;
#defineEPSL1.0e-12//迭代的精度水平;
#defineL500//迭代最大次数;
#defineOUTPUTMODE1//输出格式:
0--输出至屏幕,1--输出至文件
doublea[N][N],a2[N][N],eigen[N][N];//声明矩阵A;
doublesa_re[N]={0},sa_im[N]={0};//声明矩阵的特征值数组;
doubleu_init[N]={2,1,2,1,2,1,2,1,2,1};//定义反幂法中使用的初始向量u;
//主程序开始;
intmain()
{
FILE*p;
voida_init();
voidhouseholder();
voidequal_zero(doublematrix[N][N],int);
voideigenvec();
inteigen_a();
voidaout(int);
voideigenvalout(int);
voideigenvecout(int);
if(OUTPUTMODE)
{
p=fopen("Result.txt","w+");
fprintf(p,"计算结果:
\n");
fclose(p);
}
a_init();//对矩阵A进行初始化;
householder();//对矩阵A进行拟上三角化;
equal_zero(a,N);//对矩阵A的元素进行归零处理,消除误差;
aout(OUTPUTMODE);//输出A;
if(eigen_a())printf("迭代超过最大次数,特征值求解结果可能不正确。
\n");//求矩阵A的特征值;
equal_zero(a,N);//对矩阵A的元素进行归零处理,消除误差;
aout(OUTPUTMODE);//输出A;
eigenvalout(OUTPUTMODE);//输出矩阵的特征值;
eigenvec();//求矩阵A的特征向量;
eigenvecout(OUTPUTMODE);//输出矩阵A的特征向量;
getchar();
}
voida_init()
{
inti,j;
for(i=1;i<=N;i++)
{
for(j=1;j<=N;j++)
a2[i-1][j-1]=a[i-1][j-1]=sin(0.5*i+0.2*j);
}
for(i=1;i<=N;i++)
a2[i-1][i-1]=a[i-1][i-1]=cos(i+1.2*i)*1.5;//这里使用if语句反而更慢,所以赋值赋了两次。
}
voidhouseholder()//对矩阵进行拟上三角化;
{
intr,i,j;
doubletmp_ir,tmp_dr,tmp_pr,tmp_qr,tmp_tr,dr,cr,hr,tr;
doubleur[N]={0},pr[N]={0},qr[N]={0},wr[N]={0};
intsgn2(double);
for(r=0;r { //第一步; tmp_ir=0; for(i=r+2;i if(tmp_ir==N-2-r)continue; else { //第二步; tmp_dr=0; for(i=r+1;i dr=sqrt(tmp_dr); cr=-1.0*sgn2(a[r+1][r])*dr; hr=cr*cr-cr*a[r+1][r]; //第三步; for(i=0;i for(i=r+2;i ur[r+1]=a[r+1][r]-cr; //第四步; for(i=0;i { tmp_pr=0; tmp_qr=0; for(j=0;j { tmp_pr=tmp_pr+a[j][i]*ur[j]; tmp_qr=tmp_qr+a[i][j]*ur[j]; } pr[i]=tmp_pr/hr; qr[i]=tmp_qr/hr; } tmp_tr=0; for(i=0;i tr=tmp_tr/hr; for(i=0;i for(i=0;i { for(j=0;j { a[i][j]=a[i][j]-wr[i]*ur[j]-ur[i]*pr[j]; } } } //第五步: (继续) } } intsgn2(doublea)//求cr时用到的sgn子程序 { if(a>=0)return1; elsereturn-1; } voidequal_zero(doublematrix[N][N],intrank)//对矩阵进行归零处理; { inti,j; for(i=0;i { for(j=0;j } } inteigen_a()//计算A的特征值; { intsnum=N-1,m=N-1,flag=0,flag_7to4=0,step4_cont=0,k=1; doublemk[N][N],det_dk,stmpb,s1_re,s1_im,s2_re,s2_im,ms,mt,b24ac; voidcalc_mk(doublemk[N][N],int,double,double); voidqr_analyze(doublemk[N][N],int); while (1) { //第三步;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 北航 研究生 数值 分析 作业 第二