幂法求解矩阵主特征值的加速方法所有专业(编辑修改稿)内容摘要:

14 05 13 01 0 2A的主特征值。 计算结果如下表格: K  max kv 1 2 3 10 11 12 13 6 由此得到结果 6. 新的加速算法既可以加快收敛速度而且使结果更接近于真实值。 167。 4 结论 通过用 vc++将几种加速算法实现,并作了一个对比得出以下结论: (1)原点平移加速算法是一个矩阵变换方法。 这种变换容易计算,又不破坏矩阵的稀疏性而且收敛速度比较快,但是参数 p 的选择依赖于对 A 的特征值分布的大致了解,而且设计一个自动选择适当参数 p 的过程比较困难,所以在参数 p 的选择过程中会遇到很多麻烦和困难造成花费很多时间。 (2)Rayleigh 商加速算法 是系统特征值问题中一个非常重要的概念。 该方法适用于求解最大特征值和相应的特征向量,一般情况下收敛速度是二阶,矩阵对称正定时到达三阶。 Rayleigh商加速算法共 19 页 河南理工大学数学与信息科学 学院 本科毕业论文 第 10 页 指 导 教 师 : 牛 海 峰 学 生 : 傅 鹏 的收敛速度与反幂法相同,而且不用选取特定的迭代初值是求解这类问题更出色的一种方 法。 (3)Aitken加速 算 法比原点平移加速收敛得更快,而且它的计算量也不是太大。 但是有时 Aitken加速方法可能会失败,如当迭代向量起伏较大的时候初值和真实值有较大距离时 Aitken加速就可能失败。 ( 4)改进的 Aitken加速 算 法由于 没有达到加速的目的,所以我们现在还不能用此 改进的加速算法。 我们对于 此 改进的加速算法还需完善。 ( 5)新的改进的 Aitken 加速算法既大大减少了计算量又加快了收敛速度和让计算结果更接近于真实值。 总之这几种方法都可以达到使幂法 加速求解矩阵主特征值 的目的,而其中最好的是新的改 进的加速算法,并且我认为这种方 法用于实际问题和其它算法领域的加速当中,相信会有更好的效果。 而本文 介绍的改进的 Aitken加速还需要进一步完善。 附录: 程序( 1) include include int vector_max_ponent(const int n,const double *v) { double max=fabs(v[0])。 for(int i=0,index=0。 in。 i++)if(maxfabs(v[i])){index=i。 max=fabs(v[i])。 } return index。 } double vector_inner_product(const int n,const double *u,const double *v) { double value=0。 for(int i=0。 in。 i++)value+=u[i]*v[i]。 return value。 } double vector_infty_norm(const int n,const double *v) { double value=fabs(v[0])。 for(int i=1。 in。 i++) { if(valuefabs(v[i]))value=fabs(v[i])。 } 共 19 页 河南理工大学数学与信息科学 学院 本科毕业论文 第 11 页 指 导 教 师 : 牛 海 峰 学 生 : 傅 鹏 return value。 } double *matrix_multiply_vector(const intamp。 m,const intamp。 n,double **A,double *v) { double *vector。 vector=new double [m]。 for(int i=0。 im。 i++)vector[i]=vector_inner_product(n,A[i],v)。 return vector。 } double *square_matrix_multiply_vector(const intamp。 n,double **A,double *v) { return matrix_multiply_vector(n,n,A,v)。 } double **matrix_principal_eigen(const int n,double **A) { double *v=new double[n],**eig=new double*[2]。 //先定义两个向量,分别存储乘幂前后的迭代向量。 eig[0]=new double[1]。 //存放主特征值。 eig[1]=new double[n]。 //存放主特征向量。 eig[0][0]=0。 for(int i=0。 in。 i++)eig[1][i]=1+i。 //用( 1,2,...,n)作为初始试探向量 v; double old_lambda。 int index。 //定义一个指标变量,来提取乘幂后的最大分量指标; int step=0。 do{ step++。 old_lambda=eig[0][0]。 //double norm=vector_1_norm(n,eig[1])。 //规范化,防止特征值大的时候计算机存储有溢出; double norm=vector_infty_norm(n,eig[1])。 //规范化,防止特征值大的时候计算机存储有溢出; for(i=0。 in。 i++)v[i]=eig[1][i]/norm。 //更新; eig[1]=square_matrix_multiply_vector(n,A,v)。 //乘幂; index=vector_max_ponent(n,eig[1])。 //提取最大分量指标; 共 19 页 河南理工大学数学与信息科学 学院 本科毕业论文 第 12 页 指 导 教 师 : 牛 海 峰 学 生 : 傅 鹏 eig[0][0]=eig[1][index]/v[index]。 //计算这次乘幂后最大分量与乘幂前该分量的比值; //cout第 step++步,分量 v[index] = v[index], vv[index] = vv[index],主特征值 lambda的近似值为: lambdaendl。 //}while(fabs(vv[index])vector_1_norm(n,vv)amp。 amp。 fabs((lambdaold_lambda)/lambda)1e15amp。 amp。 step10000)。 //x循环终止条件为三选一; }while(fabs((eig[0][0]old_lambda)/eig[0][0])1e8amp。 amp。 step10000)。 //x 循环终止条件为二选一; cout经过 step步乘幂方法计算 ,得到主特征值近似值为 :eig[0][0]endl。 return eig。 } void main() { (16)。 int i,n。 cout请输入矩阵规模 n:endl。 cinn。 double **A=new double*[n]。 cout请输入 n X n 的矩阵元素: endl。 for(i=0。 in。 i++) { A[i]=new double[n]。 for(int j=0。 jn。 j++)cinA[i][j]。 } double **eig=matrix_principal_eigen(n,A)。 cout矩阵主特征值为: eig[0][0]endl。 cout矩阵主特征向量为: endl。 for(i=0。 in。 i++)couteig[1][i]endl。 } 程序( 2) include include int vector_max_ponent(const int n,const double *v) { 共 19 页 河南理工大学数学与信息科学 学院 本科毕业论文 第 13 页 指 导。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。