幂法求矩阵最大特征值摘要在物理、力学和工程技术中的很多问题在数学上都归结为求矩阵特征值的问题,而在某些工程、物理问题中,通常只需要求出矩阵的最大的特征值(即主特征值)和相应的特征向量,对于解这种特征值问题,运用幂法则可以有效的解决这个问题。
幂法是一种计算实矩阵A的最大特征值的一种迭代法,它最大的优点是方法简单。
对于稀疏矩阵较合适,但有时收敛速度很慢。
用java来编写算法。
这个程序主要分成了三个大部分:第一部分为将矩阵转化为线性方程组;第二部分为求特征向量的极大值;第三部分为求幂法函数块。
其基本流程为幂法函数块通过调用将矩阵转化为线性方程组的方法,再经过一系列的验证和迭代得到结果。
关键词:幂法;矩阵最大特征值;j ava;迭代POWER METHOD TO CALCULATE THE MAXIMUMEIGENV ALUE MATRIXABSTRACTIn physics, mechanics and engineering technology of a lot of problems in math boil down to matrix eigenvalue problem, and in some engineering, physical problems, usually only the largest eigenvalue of the matrix (i.e., the main characteristics of the value) and the corresponding eigenvectors, the eigenvalue problem for solution, using the power law can effectively solve the problem.Power method is A kind of computing the largest eigenvalue of real matrix A of an iterative method, its biggest advantage is simple.For sparse matrix is right, but sometimes very slow convergence speed.Using Java to write algorithms.This program is mainly divided into three most: the first part for matrix can be converted to linear equations;The second part is the eigenvector of the maximum;The third part is the exponentiation method of function block.Its basic process as a power law function block by calling the method of matrix can be converted to linear equations, then after a series of validation and iteration to get the results.Key words: Power method; Matrix eigenvalue; Java; The iteration目录1幂法 (1)1.1 幂法基本思想 (1)1.2规范化 (2)2概要设计 (3)2.1 设计背景………………..…………………………………………………………. .32.2 运行流程 (3)2.3运行环境 (3)3 程序详细设计 (4)3.1 第一部分:矩阵转化为线性方程组……..………………………………………. .43.2 第二部分:特征向量的极大值 (4)3.3 第三部分:求幂法函数块 (5)4 运行过程及结果 (6)4.1 运行过程.........................................................………………………………………. .64.2 运行结果 (6)4.3 结果分析 (6)5 心得体会 (7)参考文献 (8)附录:源程序 (9)1 幂法设A n 有n 个线性相关的特征向量v 1,v 2,…,v n ,对应的特征值λ1,λ2,…,λn ,满足|λ1| > |λ2| ≥ …≥ |λn |1.1 基本思想因为{v 1,v 2,…,v n }为C n的一组基,所以任给x (0)≠ 0,∑==ni i i v a x 1)0( —— 线性表示所以有])([)(21111111)0(∑∑∑∑====+====ni i i ki kni k k i i ni ik i n i i i kkv a v a v a v A a v a A xA λλλλ若a 1 ≠ 0,则因11<λλi知,当k 充分大时 A (k )x (0) ≈ λ1k a 1v 1 = cv 1 属λ1的特征向量,另一方面,记max(x ) = x i ,其中|x i | = ||x ||∞,则当k 充分大时,111111*********)0(1)0()max()max()max()max()max()max(λλλλλ==≈---v a v a v a v a x A x A k kk k k k若a 1 = 0,则因舍入误差的影响,会有某次迭代向量在v 1方向上的分量不为0,迭代下去可求得λ1及对应特征向量的近似值。
1.2 规范化在实际计算中,若|λ1| > 1则|λ1k a 1| →∞,若|λ1| < 1则| λ1k a 1| → 0都将停机。
须采用“规范化”的方法⎪⎩⎪⎨⎧==+)()1()()()()max(k k k k k Ay xx x y , k = 0,1,2,…定理3.2-1 任给初始向量0)0(≠x有,⎪⎩⎪⎨⎧==∞→∞→特征值特征向量1)(11)()max(lim )max(lim λk k k k x v v y证明:⎭⎬⎫⎩⎨⎧++======∑∑==-------ni i k i i k ni i ki i kk k k k k k k k k k k v a v a v a v a x A x A x x A x x AAy Ay x x y2111121111)22.3()0()0()1()1()1()1()1()1()()()(])([max ])([)max())max(max()max()max()max(λλλλλλΛ )max()max(])([max ])([11111121112111v v v a v a v a v a v a v a k ni i k i i ni i ki i =→⎭⎬⎫⎩⎨⎧++=∞→==∑∑λλλλ 而1111111)1()()max ()max ()max ()max ())max (max ()max ()max (λλ===→=∞→-v v v Av v v A Ay x k k k注:若A 的特征值不满足条件(3.2.1),幂法收敛性的分析较复杂,但若λ1 = λ2 = … =λ r 且|λ1| > |λ r +1| ≥ …≥ |λn |则定理结论仍成立。
此时不同初始向量的迭代向量序列一般趋向于λ1的不同特征向量。
2 概要设计2.1 设计背景用java程序来实现幂法求矩阵最大特征值。
2.2 运行流程本程序分为了几大部分,通过方法间的相互调用,达到求解目的:首先matrixx方法的作用是将矩阵A与向量X相乘,结果存储在Y中,即将方程组呈现出来,slove方法求出各未知数的最大值,程序的主体方法mifa通过do while 循环中调用matrixx方法实现幂法函数。
2.3 运行环境Windows 7 2009JDK 6.03 程序详细设计首先在桌面里新建文件夹,并运行程序J++ 6.0;令一维矩阵u= {3,4,5}; 双精度浮点型初值为 a = 1.0,b = 2.0;整型变量方程组的阶数 n=3;双精度浮点型方程组系数矩阵为 A = {{7,3,-2},{3,4,1},{-2,-1,3}};3.1 第一部分:矩阵转化为线性方程组将二维矩阵A,一维矩阵x,y以及阶数n作为它的形参,通过for循环将Ax相乘得到的结果存储在Y中。
其执行程序如下:public void matrixx(double[][] A,double[] x,double[] y,int n){for(int i=0;i<n;i++){y[i] = 0;for(int j=0;j<n;j++){y[i] += A[i][j]*x[j];}}}3.2 第二部分:特征向量的极大值首先将形参double型一维矩阵x中的元素通过for循环取到最大值,并将最大值赋予max。
其执行程序如下:public double slove(double[] x,int n){double max = 0;for(int i=0;i<n-1;i++){max = x[i]>x[i+1]?x[i]:x[i+1];}return max;}3.3 第三部分:求幂法函数块这个方法有五个形参,二维矩阵A,一维矩阵u,双精度浮点型初值a,b矩阵的阶数n。
该方法的主体部分在do while中,通过循环迭代matrixx方法和solve方法,解出矩阵的特征值并且比较出最大特征值。
通过for循环列出关于该矩阵的线性方程组的所有特征向量。
其执行程序如下:public void mifa(double[][] A,double[] u,double a,double b,int n){double c = 0.0;double c1 = 0.0;int count = 0;double[] temp={0,0,0};do{double[] u1 = u;matrixx(A,u1,u,n);c = slove(u,n);c1 = c;guifanhua(u,n);printfcount(count,u,n);count++;for(int i =0;i<n;i++){temp[i] = Math.abs(u[i]-u1[i]);}}while(slove(temp,n)>a||Math.abs(c1-c)>b);System.out.println("最大特征值为:"+c);System.out.println("特征向量为:");for(int i=0;i<n;i++){System.out.println(u[i]+"");}}4 运行过程及结果4.1 运行过程通过J++ 6.0,用for循环将Ax相乘得到的结果存储在Y中,将形参double型数组x中通过for循环取到最大值,在do while 中调用matrixx方法,及solve方法,并打印最大特征值与特征向量。