北航数值分析大作业一资料.docx

  1. 1、本文档共10页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
北航数值分析大作业一资料

数值分析大作业一 1、 算法设计方案 由于算法要求所有零元素都不存储,因此采用带状矩阵来存储矩阵,主要子程序为LU分解子程序、求解方程组子程序、带偏移量幂法求特征值子程序、带偏移量反幂法求特征值子程序具体算法设计思路如下: ①利用幂法求按模最大的特征值 ②使用带原点平移的幂法求的按模最大的特征值,则为另外一特征值 ③比较与的大小,较大值即为,较小者即为 ④使用反幂法求的按模最小的特征值,利用LU分解求取每一次迭代后的 ⑤使用带偏移量的反幂法,偏移量分别为,即可求得分别与之相距最近的特征值 ⑥为非奇异的是对称矩阵,因此,其中和分别为按模最大的特征值和按模最小的特征值 ⑦本题中LU分解采用doolittle方法,分解后所得矩阵即为对A进行初等行列式变换后所得矩阵,切变换过程中行列式值不变,因此 2、 源程序 #include math.h #include stdio.h #include stdlib.h #define N 501 //矩阵为501*501的矩阵 #define s 2 //上半带宽 #define r 2 //下半带宽 3个宏定义为方便LU分解及求解方程组过程 /**********全局变量定义**********************/ double A[5][501]; double u[501],y[501]; double lambda[41];//lambda[0]为λ1及最小特征值,lambda[40]为λ501及最大特征值 double lambda_s,lambda_m; //按模最小(大)的特征值; double LU[5][501]; /********子函数声明**************************/ void init_A(double A[][501]); //初始化A矩阵 double module_value_u(double tt[]); //求u[501]的模值 void init_u(double tt[]); //初始化迭代初始向量u0 double power_method(double offset);//带原点偏移的幂法,返回值为特征值 double inverse_power_method(double offset);//带原点偏移的反幂法,返回值为特征值,子函数中打印出偏移量,求得的特征值,误差,迭代次数 void LU_decomposition(double c[][501]); //参数c为矩阵LU[5][501]首地址,程序进行完后,保存分解后的L和U缩减后的矩阵 void solve(double c[][501],double b[],double x[]); ////第1个参数为LU分解完的LU矩阵,第2个参数b为已知的右端值,第3个参数x为求得的解向量存储位置 int max_2(int a,int b); int max_3(int a,int b,int c); int min_2(int a,int b); void main() //主程序 { int i; double uk; //偏移量 double det; //A的行列式的值 init_A(A); //初始化矩阵A lambda_m=power_method(0); //求按模最大的特征值 lambda[40]=power_method(lambda_m); //求相反方向另一个端点的特征值 if(lambda_mlambda[40]) //若大小反向,则交换两个元素中的值,得到λ1和λ501 { lambda[0]=lambda[40]; lambda[40]=lambda_m; } else { lambda[0]=lambda_m; } lambda_s=inverse_power_method(0); det=1; for(i=0;iN;i++) det=det*LU[s][i]; for(i=1;i40;i++) { uk=lambda[0]+(lambda[40]-lambda[0])*i/40; lambda[i]=inverse_power_method(uk); } printf(-----------The results are as follows-------------\n); printf(λ[1]=%1.11e \nλ[501]=%1.11e\n,lambda[0],lambda[40]); printf(λs=%1.11e\n,lambda_s); printf

文档评论(0)

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

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

1亿VIP精品文档

相关文档