线性方程组的迭代求解java.docx

上传人:doc321 文档编号:13378737 上传时间:2021-12-24 格式:DOCX 页数:22 大小:582.70KB
返回 下载 相关 举报
线性方程组的迭代求解java.docx_第1页
第1页 / 共22页
线性方程组的迭代求解java.docx_第2页
第2页 / 共22页
线性方程组的迭代求解java.docx_第3页
第3页 / 共22页
线性方程组的迭代求解java.docx_第4页
第4页 / 共22页
线性方程组的迭代求解java.docx_第5页
第5页 / 共22页
点击查看更多>>
资源描述

《线性方程组的迭代求解java.docx》由会员分享,可在线阅读,更多相关《线性方程组的迭代求解java.docx(22页珍藏版)》请在三一文库上搜索。

1、 线性方程组的迭代求解线性方程组的迭代求解摘要迭代法是一种逐次逼近方法,在使用迭代法解方程组时,其系数矩阵在计算过程中始终不变。它利用计算机运算速度快、适合做重复性操作的特点,让计算机对一组指令(或一定步骤)进行重复执行。迭代法具有循环的计算方法,方法简单,适宜解大型稀疏矩阵方程组本文总结了解线性方程组的三个迭代法,Jacobi迭代法,Gauss-Seidel迭代法,SOR迭代法,并且介绍了软件JAVA在这方面的应用。关键词:Jacobi迭代法;Gauss-Seidel迭代法;SOR迭代法;计算SOLUTION OF LINEAR EQUATIONS OF ITERATION WITH THE

2、 EXPERIMENTALABSTRACTIteration is a kind of method to solve questions by step-by-step approximation. When we are getting the solution of linear equations by using iteration, the coefficient matrix is always staying the same in computation process. Computer could operate fastly so that it is suitable

3、 for operating again and again. Iteration is easy to operate to solve the large matrix equations by using a calculate method called circulation. This summary understanding of linear equations three kind of iteration, Jacobi iteration, Gauss-Seidel iteration, successive over relaxation method ,and in

4、troduce modern software JAVA in this respect. Key words: Jacobi iteration; Gauss-Seidel iteration; Successive Over Relaxation method ; calculating目 录 1 迭代法概述.1 1.1迭代法定义11.2迭代法基本原理12 迭代法解线性方程组.12.1雅克比(Jacobi)迭代法.12.2 高斯赛德尔(Gauss-Seidel)迭代法.42.3超松弛(SOR)迭代法.73 总结.9参考文献.10附录.11 1 迭代法概述迭代法也称辗转法,是一种逐次逼近方法

5、,在使用迭代法解方程组时,其系数矩阵在计算过程中始终不变。它利用计算机运算速度快、适合做重复性操作的特点,让计算机对一组指令(或一定步骤)进行重复执行,在每次执行这组指令(或步骤)时,都从变量的原值推出它的一个新值。迭代法具有循环的计算方法,方法简单,适宜解大型稀疏矩阵方程组,在用计算机计算时只需存储A的非零元素(或可按一定公式形成系数,这样A就不需要存储) 1。1.1 迭代法定义(1)对于给定的方程组,用式子 (1-1)逐步代入求近似解的方法称为迭代法(或称为一阶定常迭代法,这里与B和k无关)(2)如果存在(记作),称此迭代法收敛,显然就是方程组的解,否则称此迭代法发散。1.2 迭代法基本定

6、理设有方程组,对于任意初始向量及任意f,解此方程组的迭代法(即)收敛的充要条件是.2 迭代法解线性方程组2.1 雅克比(Jacobi)迭代法 2.1.1 Jacobi迭代法的定义设有方程组 (),记作 (2-1) A为非奇异阵且。将A分裂为,其中,。将式(2-1)第i()个方程用去除再移项,得到等价方程组 (), (2-2)简单记作 ,其中, 对方程组(2-2)应用迭代法,得到(2-1)的迭代公式 (2-3)其中为第k次迭代向量,设已经算出,由式(2-3)可计算下一次迭代向量。显然迭代公式(2-3)的矩阵形式为 (2-4)其中称为Jacobi方法迭代矩阵。2.1.2 JAVA程序实现Jacob

7、i迭代法编写java程序用Jacobi迭代法解如下方程组:例1:实验结果如下图所示(JAVA程序设计详见附录源程序1):2.2 Gauss-Seidel迭代法2.2.1 高斯赛德尔(Gauss-Seidel)迭代法的定义雅克比迭代法的优点是公式简单,迭代矩阵容易计算。在每一步迭代时,用 的全部分量求出的全部分量,因此称为同步迭代法,计算时需保留两个近似解和。 但在雅克比迭代过程中,对已经计算出的信息未能充分利用,即在计算第i个分量时,已经计算出的最新分量没有被利用。从直观上看,在收敛的前提下,这些新的分量应比旧的分量更好,更精确一些。因此,如果每计算出一个新的分量便立即用它取代对应的旧分量进行

8、迭代,可能收敛的速度更快,并且只需要储存一个近似解向量即可。据此思想可构造高斯赛德尔(Gauss-Seidel)迭代法,其迭代公式为 (i=1,2,n) (2-5) 也可以写成矩阵形式 仍将系数矩阵A分解为 则方程组变为 得 (2-6) 将最新分量代替为旧分量,得 即 于是有 (2-7)所以 因为高斯赛德尔迭代法比雅克比迭代法收敛快,这个结论在多数情况下是成立的,但也有相反的情况,即高斯赛德尔迭代法比雅克比迭代法收敛慢,甚至还有雅克比迭代法收敛,高斯赛德尔迭代法发散的情形。2.2.2 JAVA程序实现高斯赛德尔(Gauss-Seidel)迭代法编写java程序用Gauss-Seidel迭代法解

9、上述例1方程组:实验结果如下图所示(JAVA程序设计详见附录源程序2):2.3 超松弛(SOR)迭代法2.3.1 超松弛(SOR)迭代法的定义超松弛迭代法(Successive Over Relaxation Method, SOR方法)是高斯赛德尔迭代法的一种改进,是解大型稀疏方程组的有效方法之一。设已知第k次迭代向量,及第k+1次迭代向量的前i-1个分量,(j=1,2,i-1),现在研究如何求向量的第i个分量。 首先,有高斯赛德尔迭代法求出一个值,记为 (i=1,2,n) (2-8)再将第k次迭代向量的第i个分量与进行加权平均,得,即: (2-9)于是的SOR迭代公式 (i=1,2,n)

10、或 (i=1,2,n) 当=1时,式即为高斯赛德尔迭代法;当0<<1时,式称为低松弛方法,当某些方程组用高斯赛德尔迭代法不收敛时,可以用低松弛方法获得收敛;当>1时,式称为超松弛方法,可以用来提高收敛速度。将式写成矩阵的形式,得: 即 (2-10) 于是得SOR迭代的矩阵表示 (2-11) 其中 2.3.2 JAVA程序实现超松弛(SOR)迭代法编写java程序用SOR迭代法解上述例1方程组:实验结果如下图所示(JAVA程序设计详见附录源程序3): 3 总结在数学课程的学习中,应注重学生数学计算能力和应用能力的培养。利用数学软件来解决课程中的计算和作图问题,提高学习效率,加深

11、学习兴趣。本次课程设计课题是关于我们本学期的课程数值分析中的迭代求解方程组内容,在数值分析学习中主要使用MATLAB或是C+进行迭代计算,从未使用过JAVA编程进行迭代计算,这次课程设计对我来说也是一项挑战。编程过程其实也是一个学习的过程,加深了我对JAVA的认识,同时也更督促我在JAVA方面下工夫。在编写JAVA程序的过程中,遇到很多问题,比如编写错误,或是难以实现目的等。通过网上查找资料,求助同学帮助一起解决问题。意识到自己很大的不足,进步空间很大,需要多练习编程才能在JAVA学习中更进一步。我们在理解掌握数学理论知识的同时,能借助现代软件利用迭代法简单迅速地计算出繁杂的数学运算结果,大大

12、提高了解题效率和学习效果。参考文献1 印旻 王行言Java语言与面向对象程序设计(第二版)北京:清华大学出版社,2012.52 李庆扬 王能超数值分析(第四版)武汉:华中科技大学出版社,2006.73 奥特加J M数值分析M张丽君 张乃玲,译北京:高等教育出版社,1983附录源程序1:package .Test;import java.util.Scanner;public class Jacobi /* * 雅可比迭代法求线性方程组 */static double a; /矩阵A的值static double b; /矩阵B的值static double x; /现在矩阵X的值static

13、double x2; /以前矩阵X的值,以便计算精度static int n; /元数static double e; /精度public static void IT()int k=0;System.out.println("k x1 x2 x3");System.out.print(k+" ");for(int i=1;i<=n;i+)System.out.print(xi+" ");System.out.println("n");dok+;for(int i=1;i<=n;i+)x2i=xi; f

14、or(int i=1;i<=n;i+) xi=f_x(i); System.out.print(k+" "); for(int i=1;i<=n;i+) System.out.print(xi+" "); System.out.println("n");while(jisuan()>=e);public static double jisuan() /计算精度 double max=0.0;for(int i=1;i<=n;i+)double x3=Math.abs(xi-x2i);if(x3>max)

15、max=x3;return max;public static double f_x(int i)/算迭代式的值double x1=0.0;for(int j=1;j<=n;j+)if(j!=i) x1=x1+aij*x2j;double x2=(bi-x1)/aii;return x2;public static void Print_Jie()/输出方程组的解System.out.print("方程组的解为:");for(int i=1;i<=n;i+)System.out.print("x"+i+" = "+xi);

16、public static void main(String args) Scanner as=new Scanner(System.in); System.out.println("输入方程组的元数:"); n=as.nextInt(); a=new doublen+1n+1; b=new doublen+1; x=new doublen+1; x2=new doublen+1; System.out.println("输入方程组的系数矩阵a:"); for(int i=1;i<=n;i+) for(int j=1;j<=n;j+) aij

17、=as.nextDouble(); System.out.println("输入方程组矩阵b:"); for(int i=1;i<=n;i+) bi=as.nextDouble(); System.out.println("输入精度e:"); e=as.nextDouble(); IT(); Print_Jie();源程序2:import java.util.Scanner;public class Gauss_Seidel /* * 高斯-赛德尔迭代法求线性方程组 */static double a;static double b;static

18、double x;static double x2;static int n;static double e;public static void IT()int k=0;System.out.println("k x1 x2 x3");System.out.print(k+" ");for(int i=1;i<=n;i+)System.out.print(xi+" ");System.out.println("n");dok+;for(int i=1;i<=n;i+)x2i=xi; for(int i

19、=1;i<=n;i+) xi=f_x(i); System.out.print(k+" "); for(int i=1;i<=n;i+) System.out.print(xi+" "); System.out.println("n");while(jisuan()>=e);public static double jisuan()double max=0.0;for(int i=1;i<=n;i+)double x3=Math.abs(xi-x2i);if(x3>max) max=x3;return m

20、ax;public static double f_x(int i)/算迭代式的值double x1=0.0;for(int j=1;j<=n;j+)if(j!=i) x1=x1+aij*xj;double x2=(bi-x1)/aii;return x2;public static void Print_Jie()/输出方程组的解System.out.print("方程组的解为:");for(int i=1;i<=n;i+)System.out.print("x"+i+" = "+xi);public static vo

21、id main(String args) Scanner as=new Scanner(System.in); System.out.println("输入方程组的元数:"); n=as.nextInt(); a=new doublen+1n+1; b=new doublen+1; x=new doublen+1; x2=new doublen+1; System.out.println("输入方程组的系数矩阵a:"); for(int i=1;i<=n;i+) for(int j=1;j<=n;j+) aij=as.nextDouble()

22、; System.out.println("输入方程组矩阵b:"); for(int i=1;i<=n;i+) bi=as.nextDouble(); System.out.println("输入精度e:"); e=as.nextDouble(); IT(); Print_Jie();源程序3:import java.util.Scanner;public class SOR /* * 高松弛迭代法求线性方程组 */static double a;static double b;static double x;static double x2;st

23、atic int n;static double e;public static void IT()int k=0;System.out.println("k x1 x2 x3");System.out.print(k+" ");for(int i=1;i<=n;i+)System.out.print(xi+" ");System.out.println("n");dok+;for(int i=1;i<=n;i+)x2i=xi; for(int i=1;i<=n;i+) xi=f_x(i); Sy

24、stem.out.print(k+" "); for(int i=1;i<=n;i+) System.out.print(xi+" "); System.out.println("n");while(jisuan()>=e);public static double jisuan()double max=0.0;for(int i=1;i<=n;i+)double x3=Math.abs(xi-x2i);if(x3>max) max=x3;return max;public static double f_x(

25、int i)/算迭代式的值double x1=0.0;double x3=0.0;for(int j=1;j<=n;j+)x1=x1+aij*xj;x3=x2i+1.3*(bi-x1)/aii;return x3;public static void Print_Jie()/输出方程组的解System.out.print("方程组的解为:");for(int i=1;i<=n;i+)System.out.print("x"+i+" = "+xi);public static void main(String args) S

26、canner as=new Scanner(System.in); System.out.println("输入方程组的元数:"); n=as.nextInt(); a=new doublen+1n+1; b=new doublen+1; x=new doublen+1; x2=new doublen+1; System.out.println("输入方程组的系数矩阵a:"); for(int i=1;i<=n;i+) for(int j=1;j<=n;j+) aij=as.nextDouble(); System.out.println("输入方程组矩阵b:"); for(int i=1;i<=n;i+) bi=as.nextDouble(); System.out.println("输入精度e:"); e=as.nextDouble(); IT(); Print_Jie();第 19 页 共 19 页

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 社会民生


经营许可证编号:宁ICP备18001539号-1