- 1、本文档共12页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
北航数分析第一次大作业
一、算法的设计方案:(一)各所求值得计算方法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的计算方法 其中 QUOTE 矩阵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 2double 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));t=(k-1);t++) {temp=temp+c[i-t+s+1][t]*c[t-k+s+1][k];}
文档评论(0)