北航数值分析第一次大作业概述.docVIP

  • 8
  • 0
  • 约6.48千字
  • 约 11页
  • 2016-03-16 发布于湖北
  • 举报
北航数值分析第一次大作业概述.doc

一、算法的设计方案: (一)各所求值得计算方法 1、最大特征值λ501,最小特征值λ1,按模最小特征值λs的计算方法 首先使用一次幂法运算可以得到矩阵的按模最大的特征值λ,λ必为矩阵A的最大或最小特征值,先不做判断。对原矩阵A进行一次移项,即(A-λI),在进行一次幂法运算,可以得到另一个按模最大特征值λ0。比较λ和λ0的大小,较大的即为λ501,较小的即为λ1。 对矩阵A进行一次反幂法运算,即可得到按模最小特征值λs。 2、A与μk值最接近的特征值λik的计算方法 首先计算出k所对应的μk值,对原矩阵A进行一次移项,即(A-μkI),得到一个新的矩阵,对新矩阵进行一次反幂法运算,即可得到一个按模最小特征值λi。则原矩阵A与μk值最接近的特征值 λik=λi+μk。 3、A的(谱范数)条件数cond(A)2的计算方法 其中矩阵A的按模最大和按模最小特征值。 (二)程序编写思路。 由于算法要求A的零元素不存储,矩阵A本身为带状矩阵,所以本题的赋值,LU分解,反幂法运算过程中,均应采用Doolittle分解法求解带状线性方程组的算法思路。 幂法、反幂法和LU分解均是多次使用,应编写子程序进行反复调用。 二、源程序: #includestdio.h #includeiostream #includestdlib.h #includemath.h #includefloat.h #includeiomanip /*头文件*/ /*定义全局变量*/ #define N 502 /*取N为502,可实现从1到501的存储,省去角标变换的麻烦*/ #define epsilon 1.0e-12 /*定义精度*/ #define r 2 /*r,s为带状矩阵的半带宽,本题所给矩阵二者都是2*/ #define s 2 double c[6][N]; /*定义矩阵存储压缩后的带状矩阵*/ double fuzhi(); /*赋值函数*/ void LUfenjie(); /*LU分解程序*/ int max(int a,int b); /*求两个数字中较大值*/ int min(int a,int b); /*求两个数字中较小值*/ double mifa(); /*幂法计算程序*/ double fanmifa(); /*反幂法计算程序*/ double fuzhi() /*赋值程序,按行赋值,行从1到5,列从1到501,存储空间 的第一行第一列不使用,角标可以与矩阵一一对应,方便书写程序*/ { int i,j; i=1; for(j=3;jN;j++) {c[i][j]=-0.064;} i=2; for(j=2;jN;j++) {c[i][j]=0.16;} i=3; for(j=1;jN;j++) {c[i][j]=(1.64-0.024*j)*sin(0.2*j)-0.64*exp(0.1/j);} i=4; for(j=1;jN-1;j++) {c[i][j]=0.16;} i=5; for(j=1;jN-2;j++) {c[i][j]=-0.064;} return(c[i][j]); } int max(int a,int b) { return((ab)?a:b); } int min(int a,int b) { return((ab)?a:b); } void LUfenjie() /*LU分解程序,采用的是带状矩阵压缩存储后的LU分解法*/ { double temp; int i,j,k,t; for(k=1;kN;k++) { for(j=k;j=min(k+s,N-1);j++) { temp=0; for(t=max(1,max(k-r,j-s));t=(k-1);t++) {temp=temp+c[k-t+s+1][t]*c[t-j+s+1][j];} c[k-j+s+1][j]=c[k-j+s+1][j]-temp; } for(i=k+1;i=min(k+r,N-1);i++) { temp=0; for(t=max(1,max(i-r,k-s))

您可能关注的文档

文档评论(0)

1亿VIP精品文档

相关文档