线性方程组的迭代求解java_第1页
线性方程组的迭代求解java_第2页
线性方程组的迭代求解java_第3页
线性方程组的迭代求解java_第4页
线性方程组的迭代求解java_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

线性方程组的迭代求解摘要迭代法是一种逐次逼近方法,在使用迭代法解方程组时,其系数矩阵在计算过程中始终不变。它利用计算机运算速度快、适合做重复性操作的特点,让计算机对一组指令(或一定步骤)进行重复执行。迭代法具有循环的计算方法,方法简单,适宜解大型稀疏矩阵方程组本文总结了解线性方程组的三个迭代法,Jacobi迭代法,Gauss-Seidel迭代法,SOR迭代法,并且介绍了软件JAVA在这方面的应用。关键词:Jacobi迭代法;Gauss-Seidel迭代法;SOR迭代法;计算SOLUTIONOFLINEAREQUATIONSOFITERATIONWITHTHEEXPERIMENTALABSTRACTIterationisakindofmethodtosolvequestionsbystep-by-stepapproximation.Whenwearegettingthesolutionoflinearequationsbyusingiteration,thecoefficientmatrixisalwaysstayingthesameincomputationprocess.Computercouldoperatefastlysothatitissuitableforoperatingagainandagain.Iterationiseasytooperatetosolvethelargematrixequationsbyusingacalculatemethodcalledcirculation.Thissummaryunderstandingoflinearequationsthreekindofiteration,Jacobiiteration,Gauss-Seideliteration,successiveoverrelaxationmethod,andintroducemodernsoftwareJAVAinthisrespect.Keywords:Jacobiiteration;Gauss-Seideliteration;SuccessiveOverRelaxationmethod;calculating目录1迭代法概述………………..……………….………….11.1迭代法定义……………11.2迭代法基本原理………………………12迭代法解线性方程组……………………...12.1雅克比(Jacobi)迭代法……….………..12.2高斯—赛德尔(Gauss-Seidel)迭代法………..….....42.3超松弛(SOR)迭代法…………….…....73总结………………...9参考文献………….……..10附录…………….……………..111迭代法概述迭代法也称辗转法,是一种逐次逼近方法,在使用迭代法解方程组时,其系数矩阵在计算过程中始终不变。它利用计算机运算速度快、适合做重复性操作的特点,让计算机对一组指令(或一定步骤)进行重复执行,在每次执行这组指令(或步骤)时,都从变量的原值推出它的一个新值。迭代法具有循环的计算方法,方法简单,适宜解大型稀疏矩阵方程组,在用计算机计算时只需存储A的非零元素(或可按一定公式形成系数,这样A就不需要存储)[1]。1.1迭代法定义(1)对于给定的方程组,用式子(1-1)逐步代入求近似解的方法称为迭代法(或称为一阶定常迭代法,这里与B和k无关)(2)如果存在(记作),称此迭代法收敛,显然就是方程组的解,否则称此迭代法发散。1.2迭代法基本定理设有方程组,对于任意初始向量及任意f,解此方程组的迭代法(即)收敛的充要条件是.2迭代法解线性方程组2.1雅克比(Jacobi)迭代法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.2JAVA程序实现Jacobi迭代法编写java程序用Jacobi迭代法解如下方程组:例1:实验结果如下图所示(JAVA程序设计详见附录源程序1):2.2Gauss-Seidel迭代法高斯—赛德尔(Gauss-Seidel)迭代法的定义雅克比迭代法的优点是公式简单,迭代矩阵容易计算。在每一步迭代时,用的全部分量求出的全部分量,因此称为同步迭代法,计算时需保留两个近似解和。但在雅克比迭代过程中,对已经计算出的信息未能充分利用,即在计算第i个分量时,已经计算出的最新分量没有被利用。从直观上看,在收敛的前提下,这些新的分量应比旧的分量更好,更精确一些。因此,如果每计算出一个新的分量便立即用它取代对应的旧分量进行迭代,可能收敛的速度更快,并且只需要储存一个近似解向量即可。据此思想可构造高斯—赛德尔(Gauss-Seidel)迭代法,其迭代公式为(i=1,2,…,n)(2-5)也可以写成矩阵形式仍将系数矩阵A分解为则方程组变为得(2-6)将最新分量代替为旧分量,得即于是有(2-7)所以因为高斯—赛德尔迭代法比雅克比迭代法收敛快,这个结论在多数情况下是成立的,但也有相反的情况,即高斯—赛德尔迭代法比雅克比迭代法收敛慢,甚至还有雅克比迭代法收敛,高斯—赛德尔迭代法发散的情形。JAVA程序实现高斯—赛德尔(Gauss-Seidel)迭代法编写java程序用Gauss-Seidel迭代法解上述例1方程组:实验结果如下图所示(JAVA程序设计详见附录源程序2):2.3超松弛(SOR)迭代法2.3.1超松弛(SOR)迭代法的定义超松弛迭代法(SuccessiveOverRelaxationMethod,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)…①或(i=1,2,…n)…②当=1时,式①即为高斯—赛德尔迭代法;当0<<1时,式①称为低松弛方法,当某些方程组用高斯—赛德尔迭代法不收敛时,可以用低松弛方法获得收敛;当>1时,式①称为超松弛方法,可以用来提高收敛速度。将式②写成矩阵的形式,得:即(2-10)于是得SOR迭代的矩阵表示(2-11)其中2.3.2JAVA程序实现超松弛(SOR)迭代法编写java程序用SOR迭代法解上述例1方程组:实验结果如下图所示(JAVA程序设计详见附录源程序3):3总结在数学课程的学习中,应注重学生数学计算能力和应用能力的培养。利用数学软件来解决课程中的计算和作图问题,提高学习效率,加深学习兴趣。本次课程设计课题是关于我们本学期的课程——数值分析中的迭代求解方程组内容,在数值分析学习中主要使用MATLAB或是C++进行迭代计算,从未使用过JAVA编程进行迭代计算,这次课程设计对我来说也是一项挑战。编程过程其实也是一个学习的过程,加深了我对JAVA的认识,同时也更督促我在JAVA方面下工夫。在编写JAVA程序的过程中,遇到很多问题,比如编写错误,或是难以实现目的等。通过网上查找资料,求助同学帮助一起解决问题。意识到自己很大的不足,进步空间很大,需要多练习编程才能在JAVA学习中更进一步。我们在理解掌握数学理论知识的同时,能借助现代软件利用迭代法简单迅速地计算出繁杂的数学运算结果,大大提高了解题效率和学习效果。参考文献[1]印旻王行言.Java语言与面向对象程序设计(第二版).北京:清华大学出版社,2023.5[2]李庆扬王能超.数值分析(第四版).武汉:华中科技大学出版社,2006.7[3]奥特加JM.数值分析[M].张丽君张乃玲,译.北京:高等教育出版社,1983附录源程序1:packagecn.Test;importjava.util.Scanner;publicclassJacobi{ /** *@雅可比迭代法求线性方程组 */ staticdoublea[][];//矩阵A的值 staticdoubleb[];//矩阵B的值 staticdoublex[];//现在矩阵X的值 staticdoublex2[];//以前矩阵X的值,以便计算精度 staticintn;//元数 staticdoublee;//精度 publicstaticvoidIT(){ intk=0; System.out.println("kx1x2x3"); System.out.print(k+""); for(inti=1;i<=n;i++) { System.out.print(x[i]+""); } System.out.println("\n"); do{ k++; for(inti=1;i<=n;i++) x2[i]=x[i];for(inti=1;i<=n;i++){ x[i]=f_x(i);}System.out.print(k+""); for(inti=1;i<=n;i++) { System.out.print(x[i]+""); } System.out.println("\n"); }while(jisuan()>=e); } publicstaticdoublejisuan(){//计算精度 doublemax=0.0; for(inti=1;i<=n;i++) { doublex3=Math.abs(x[i]-x2[i]); if(x3>max)max=x3; } returnmax; } publicstaticdoublef_x(inti){//算迭代式的值 doublex1=0.0; for(intj=1;j<=n;j++) if(j!=i)x1=x1+a[i][j]*x2[j]; doublex2=(b[i]-x1)/a[i][i]; returnx2; } publicstaticvoidPrint_Jie()//输出方程组的解 { System.out.print("方程组的解为:"); for(inti=1;i<=n;i++) System.out.print("x"+i+"="+x[i]); } publicstaticvoidmain(String[]args){ Scanneras=newScanner(System.in);System.out.println("输入方程组的元数:");n=as.nextInt();a=newdouble[n+1][n+1];b=newdouble[n+1];x=newdouble[n+1];x2=newdouble[n+1];System.out.println("输入方程组的系数矩阵a:");for(inti=1;i<=n;i++) for(intj=1;j<=n;j++) a[i][j]=as.nextDouble();System.out.println("输入方程组矩阵b:");for(inti=1;i<=n;i++) b[i]=as.nextDouble();System.out.println("输入精度e:");e=as.nextDouble();IT();Print_Jie(); }}源程序2:importjava.util.Scanner;publicclassGauss_Seidel{ /** *@高斯-赛德尔迭代法求线性方程组 */ staticdoublea[][]; staticdoubleb[]; staticdoublex[]; staticdoublex2[]; staticintn; staticdoublee; publicstaticvoidIT(){ intk=0; System.out.println("kx1x2x3"); System.out.print(k+""); for(inti=1;i<=n;i++) { System.out.print(x[i]+""); } System.out.println("\n"); do{ k++; for(inti=1;i<=n;i++) x2[i]=x[i];for(inti=1;i<=n;i++){ x[i]=f_x(i);}System.out.print(k+""); for(inti=1;i<=n;i++) { System.out.print(x[i]+""); } System.out.println("\n"); }while(jisuan()>=e); } publicstaticdoublejisuan(){ doublemax=0.0; for(inti=1;i<=n;i++) { doublex3=Math.abs(x[i]-x2[i]); if(x3>max)max=x3; } returnmax; } publicstaticdoublef_x(inti){//算迭代式的值 doublex1=0.0; for(intj=1;j<=n;j++) if(j!=i)x1=x1+a[i][j]*x[j]; doublex2=(b[i]-x1)/a[i][i]; returnx2; } publicstaticvoidPrint_Jie()//输出方程组的解 { System.out.print("方程组的解为:"); for(inti=1;i<=n;i++) System.out.print("x"+i+"="+x[i]); } publicstaticvoidmain(String[]args){ Scanneras=newScanner(System.in);System.out.println("输入方程组的元数:");n=as.nextInt();a=newdouble[n+1][n+1];b=newdouble[n+1];x=newdouble[n+1];x2=newdouble[n+1];System.out.println("输入方程组的系数矩阵a:");for(inti=1;i<=n;i++) for(intj=1;j<=n;j++) a[i][j]=as.nextDouble();System.out.println("输入方程组矩阵b:");for(inti=1;i<=n;i++) b[i]=as.nextDouble();System.out.println("输入精度e:");e=as.nextDouble();IT();Print_Jie(); }}源程序3:importjava.util.Scanner;publicclassSOR{ /** *@高松弛迭代法求线性方程组 */ staticdoublea[][]; staticdoubleb[]; staticdoublex[]; staticdoublex2[]; staticintn; staticdoublee; publicstaticvoidIT(){ intk=0; System.out.println("kx1x2x3"); System.out.print(k+""); for(inti=1;i<=n;i++) { System.out.print(x[i]+""); } System.out.println("\n"); do{ k++; for(inti=1;i<=n;i++) x2[i]=x[i];for(inti=1;i<=n;i++){ x[i]=f_x(i);}System.out.print(k+""); for(inti=1;i<=n;i++) { System.out.print(x[i]+""); } System.out.println("\n"); }while(jisuan()>=e); } publicstaticdoublejisuan(){ doublemax=0.0; for(inti=1;i<=n;i++) { doublex3=Math.abs(x[

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

最新文档

评论

0/150

提交评论