数值分析作业第一题.doc

  1. 1、本文档共7页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
数值分析作业第一题 算法设计方案 利用带状Dollittle分解,将A[501][501]转存到数组C[5][501],以节省存储空间 1、计算和 首先使用幂法求出矩阵的按模最大的特征值λ0:如果λ00,则其必为按模最大值,因此λ501=λ0,然后采用原点平移法,平移量为λ501,使用幂法迭代求出矩阵A-λ501I的按模最大的特征值,其特征值按从小到大排列应为λ1-λ501、λ2-λ501、……、。因此A-λ501I的按模最大的特征值应为λ1-λ501。又因为λ501的值已求得,由此可直接求出λ1。 2、计算,其中λ1和λn分别是矩阵A的模最大和最小特征值,直接利用上面求得的结果直接计算。 矩阵A的行列式可先对矩阵A进行LU分解后,det(A)等于U所有对角线上元素的乘积。 二、源程序: #includemath.h #includestdio.h #includestdlib.h #includeiostream.h #define s 2 #define r 2 int Max(int v1,int v2); int Min(int v1,int v2); int maxt(int v1,int v2,int v3); void storage(double C[5][501],double b,double c); double mifa(double C[5][501]); void LU(double C[5][501]); double fmifa(double C[5][501]); int Max(int v1,int v2) //求两个数的最大值 { return((v1v2)?v1:v2); } int Min(int v1,int v2) //求两个数最小值 { return ((v1v2)?v1:v2); } int maxt(int v1,int v2,int v3) //求三个数最大值 { int t; if(v1v2) t=v1; else t=v2; if(tv3) t=v3; return(t); } /***将矩阵值转存在一个数组里,以节省存储空间***/ void storage(double C[5][501],double b,double c) { int i=0,j=0; C[i][j]=0,C[i][j+1]=0; for(j=2;j=500;j++) C[i][j]=c; i++; j=0; C[i][j]=0; for(j=1;j=500;j++) C[i][j]=b; i++; for(j=0;j=500;j++) C[i][j]=(1.64-0.024*(j+1))*sin(0.2*(j+1))-0.64*exp(0.1/(j+1)); i++; for(j=0;j=499;j++) C[i][j]=b; C[i][j]=0; i++; for(j=0;j=498;j++) C[i][j]=c; C[i][j]=0,C[i][j+1]=0; } //用于求解最大的特征值,幂法 double mifa(double C[5][501]) { int m=0,i,j; double b2,b1=0,sum; double u[501],y[501]; for (i=0;i501;i++) { u[i] = 1.0; } do { sum=0; if(m!=0)b1=b2; m++; for(i=0;i=500;i++) sum+=u[i]*u[i]; for(i=0;i=500;i++) y[i]=u[i]/sqrt(sum); for(i=0;i=500;i++) { u[i]=0; for(j=Max(i-r,0);j=Min(i+s,500);j++) u[i]=u[i]+C[i-j+s][j]*y[j]; } b2=0; for(i=0;i=500;i++) b2=b2+y[i]*u[i]; } while(fabs(b2-b1)/fabs(b2)=1.0e-12); return b2; } /*****行列式LU分解*****/ void LU(double C[5][501]) { double sum; int k,i,j; for(k=1;k=501;k++) { for(j=k;j=Min(k+s,501

文档评论(0)

kaiss + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档