北航数值分析编程大作业一.docVIP

  • 6
  • 0
  • 约6.74千字
  • 约 9页
  • 2016-12-17 发布于贵州
  • 举报
《数值分析B》大作业一 4系 ZY1104219 许柱山 算法设计方案: 1 .首先应该创建原矩阵,但由于题目所给的矩阵是501*501的大型矩阵,计算机在计算时可能会运行不起来。而我们可以发现原矩阵A是一个带状矩阵,因此可以利用这一特点将其压缩存储。 2.由于λ1?λ2?…?λ501,所以在以所有特征值建立的数轴上,λ1、λ501位于数轴的两端,两者之一必为按模最大。利用幂法,可以求出来按模最大的特征值,但该值可能为λ1也可能为λ501; 3.上步求出按模最大的特征值λM后,将原矩阵平移λM,再利用幂法求一次平移后矩阵的按模最大的特征值,即是数轴上另一端点值λM′。 4.比较λM与λM+λM′的大小,大的为矩阵A的最大特征值,小的为A矩阵的最小的特征值; 5.利用反幂法,求矩阵A的按模最小的特征值。但是反幂法中要用到线性方程组的求解,而原矩阵A又是带状矩阵,采用LU分解。所以在这之前要定义一个LU分解子程序,将A矩阵分解为单位下三角矩阵L和上三角矩阵U的乘积。 6.先利用循环求出k从1到39变化的uk的值。当循环次数为39时,在每次循环时都将压缩后的矩阵A的第三行减去相应的,然后调用LU分解的子程序,利用反幂法求出与uk最接近的特征值,该特征值等于利用反幂法求出的值与uk的和。 7.A的谱范数条件数等于按模最大的特征值的绝对值与按模最小的特征值的绝对值之比,按模最大的特征值与按模最小的特征值已分别在前面求出。 6.A的行列式的值就是矩阵A进行LU分解后U的对角线元素的乘积。先把带状线性矩阵A[501][501]转存为一个矩阵c[5][501]. 源程序 #includestdio.h #includeiostream.h #includestdlib.h #includemath.h #includefloat.h #includeiomanip.h /*****************全局变量、函数声明*************/ #define N 501 #define EPSI 1.0e-12 #define r 2 #define s 2 double c[5][N]; /*A非零元素的压缩存储矩阵*/ double fuzhi(); /*对A赋值函数*/ void LUDet(); /*利用LU分解求解矩阵A的行列式*/ int int_max2(int a,int b); /*求两个数字中最大值的*/ int int_min2(int a,int b); /*求两个数字中最小值的*/ int int_max3(int a,int b,int c);/*求三个数字中最大值的*/ double mifa(); /*幂法计算矩阵A按模最大的特征值*/ double fmifa(); /*反幂法求矩阵A按模最大的特征值*/ //*主程序*// void main() {int i; /*利用幂法计算矩阵A的最大特征值和最小特征值*/ double a1,a2; fuzhi(); a1=mifa(); if (a10) cout矩阵A最小的特征值lambda1:endl; else if(a1=0) cout矩阵A最大的特征值lambda501:endl; coutsetiosflags(ios::scientific) setprecision(12)a1endl; for(i=0;iN;i++) for(i=0;iN;i++) c[2][i]=c[2][i]-a1; a2=mifa()+a1; if (a20) cout矩阵A最小的特征值lambda1:endl; else if(a2=0) cout矩阵A最大的特征值lambda501:endl; coutsetiosflags(ios::scientific) setprecision(12)a2endl; /*利用反幂法计算矩阵A的按模最小特征值*/ double a3; fuzhi(); a3=fmifa(); cout矩阵A按模最小的特征值lambdas:endl; coutsetiosflags(ios::scientific) setprecision(12)a3endl; /*计算最接近特征值*/ fuzhi(); double u[39]={0}; cout与数uk最接近的特征值:endl; for(i=0;i39;i++) { u[i]=a1+(i+1)*(a2-a1)/40; c[2][i]=c[2][i]-u[i]; u[i]=fmifa()+u[i]; c

您可能关注的文档

文档评论(0)

1亿VIP精品文档

相关文档