1、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
2、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 val
3、idation and iteration to get the results. Key words: Power method; Matrix eigenvalue; Java; The iteration1 幂法.1 1.1 幂法基本思想.11.2规范化.22 概要设计.3 2.1 设计背景. .3 2.2 运行流程 .32.3运行环境.33 程序详细设计 .4 3.1 第一部分:矩阵转化为线性方程组. .4 3.2 第二部分:特征向量的极大值.4 3.3 第三部分:求幂法函数块.54 运行过程及结果 .6 4.1 运行过程. .6 4.2 运行结果.6 4.3 结果分析.65 心得体会
4、 .7参考文献.8附录:源程序.9 1 幂法设An有n个线性相关的特征向量v1,v2,vn,对应的特征值 1, 2, n,满足| 1| | 2| | n|1.1 基本思想因为v1,v2,vn为Cn的一组基,所以任给x(0) 0, 线性表示所以有若a1 0,则因知,当k充分大时 A(k)x(0) 1ka1v1 = cv1 属 1的特征向量,另一方面,记max(x) = xi,其中|xi| = |x|,则当k充分大时,若a1 = 0,则因舍入误差的影响,会有某次迭代向量在v1方向上的分量不为0,迭代下去可求得 1及对应特征向量的近似值。1.2 规范化在实际计算中,若| 1| 1则| 1ka1| ,
5、若| 1| | r +1| | n|则定理结论仍成立。此时不同初始向量的迭代向量序列一般趋向于 1的不同特征向量。2 概要设计2.1 设计背景用java程序来实现幂法求矩阵最大特征值。2.2 运行流程本程序分为了几大部分,通过方法间的相互调用,达到求解目的:首先matrixx方法的作用是将矩阵A与向量X相乘,结果存储在Y中,即将方程组呈现出来,slove方法求出各未知数的最大值,程序的主体方法mifa通过do while 循环中调用matrixx方法实现幂法函数。2.3 运行环境 Windows 7 2009 JDK 6.03 程序详细设计首先在桌面里新建文件夹,并运行程序J+ 6.0;令一维
6、矩阵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;in;i+) yi = 0; for(int j=0;jxi+1?xi:xi+1; return max;3.3 第三部分:求
7、幂法函数块这个方法有五个形参,二维矩阵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
8、,u,n); c = slove(u,n); c1 = c; guifanhua(u,n); printfcount(count,u,n); count+; for(int i =0; tempi = Math.abs(ui-u1i); while(slove(temp,n)a|Math.abs(c1-c)b); System.out.println(最大特征值为:+c);特征向量为:); System.out.println(ui+4 运行过程及结果4.1 运行过程通过J+ 6.0,用for循环将Ax相乘得到的结果存储在Y中,将形参double型数组x中通过for循环取到最大值,在do wh
9、ile 中调用matrixx方法,及solve方法,并打印最大特征值与特征向量。4.2 运行结果经多次调试程序,不再报错,结果如下图:4.3 结果分析该程序运行结果无误,其最大特征值为35.0,是实际运算结果。5 心得体会由于这次课程设计题目是由老师选的,一开始我认为非常难,不知道从哪里下手。并且题目内容还是这学期学的数值分析上的内容。内容也一知半解,但是最后在同学的帮助下我还是完成了这次课程设计,通过这次课程设计收获很多,在该实验中,我学会了为具体操作选择最合适的循环语句及for、while、do.while语句的相互转换使用。最重要的是,明白了JAVA程序中,定义方法中的局部变量时一定要赋
10、初始值,否则编译不能通过会报错;但类中的成员变量则不一定需要。同时通过这次课程设计让我意识到自己的java的基础还是很薄弱,有很多基本的知识都一知半解,不会合理利用学过的东西,在设计的过程中不时地翻阅资料,有时花费一天时间就只能完成一个功能。程序代码完成之后,要进行运行调试,刚开始由于没有调试经验和方法效率很低,同时发现了许多错误,最后同学的帮助下,终于顺利完成了,自己也从中学到了不少东西。更重要的是,在测试过程中的往往发现自己粗心大意犯了很多不必要的错误,通过这次课题,也使我认识到了认真在学习中的重要。以后我要更认真努力的学习java。参考文献1 李庆扬 王能超 以大义数值分析华中科技大学出
11、版社 第四版2 李兴华 Java从入门到精通 人民邮电出版社 2010-4-1版3 臧萌 编著 Java入门123清华大学出版社2010-5-1版4 朱福喜.Java语言程序设计(第二版).科学出版社5 李辉 打通经脉 Java 基础入门编程详解中国铁道出版社2010-11-01版6 陈国君等.Java程序设计基础(第二版).清华大学出版社7 Deitel.Java大学基础教程(第六版).电子工业出版社 8 MaryCampione.Java语言导学(第四版).机械工业出版社9 Y.Daniel Liang.Java语言程序设计基础篇(第六版).机械工业出版社10 Kathy Sierra.H
12、ead First Java(第二版).东南大学出版社11 喻桃阳 Java快速入门与商用项目培训清华大学出版社2011-03-01版12 温沿书 Java入门与实战教程人民邮电出版社2010-03-01版13 李钟尉 Java范例完全自学手册人民邮电出版社2009-10-114 印旻编著,Java语言与面向对象程序设计,清华大学出版社15 耿详义编著,Java2程序设计实用教程,清华大学出版社16 辛运帏 Java程序设计(第二版) 清华大学出版社源程序public class MifaSolve public static void main(String args) / TODO Aut
13、o-generated method stub MifaSolve mifaSolve = new MifaSolve(); double u = 3,4,5; double a = 1.0; double b = 2.0; int n=3; double A = 7,3,-2,3,4,1,-2,-1,3; mifaSolve.mifa(A,u,a,b,n); /将矩阵A与向量X相乘,结果存储在Y中(用for循环将Ax相乘得到的结果存储在Y中) public void matrixx(double A,double x,double y,int n) /求最大值(将形参double型数组x中通
14、过for循环取到最大值) /规范化函数 public void guifanhua(double x,int n) double temp = slove(x,n); xi/=temp; /幂法函数(在do while 中调用matrixx方法,及solve方法,并打印最大特征值与特征向量) public void mifa(double A,double u,double a,double b,int n) public void printfcount(int count,double u,int n) System.out.println(count); System.out.println(ui);