2022年雅可比迭代实验报告 .pdf
雅可比迭代法求解线性方程组的实验报告一、实验题目分别利用雅可比迭代法和高斯-塞德尔迭代法求解以下线性方程组:使得误差不超过 0.00001 。二、实验引言1.实验目的掌握用迭代法求解线性方程组的基本思想和步骤,熟悉电脑fortran 语言;了解雅可比迭代法在求解方程组过程中的优缺点。2.实验意义雅克比迭代法就是众多迭代法中比较早且较简单的一种,求解方便实用。三、算法设计1.雅可比迭代法原理:设有线性方程组 Ax=b 满足0iia, 将方程组变形为 : x=Bx+f, 则雅可比 (Jacobi)迭代法是指fBxXkk)1(,即 由初始解逐步迭代即可得到方程组的解。算法步骤如下:)0()0(2)0(1,nxxx,精度 e,最大容许迭代次数M,令 k=1。步骤 2.对 i=1,2,n 依次计算)0()1()0()1(11|)n,2, 1,0(/)(iiiiiiiiijnijjijjxxxxeiaaxabx,max1iniee,假设 e,则输出结果)n, 2, 1()0(ixi,停止计算。否则执行步骤 4. 2 .453.82102.7210321321321xxxxxxxxx精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 1 页,共 6 页,1,kkMk转步骤 2 继续迭代。假设,Mk说明迭代失败,停止计算。2.算法流程图四、程序设计program jacobi implicit none integer:i,j integer:k save k integer,parameter:n=3 real:x(n),y(n),b(n) real:D real:a(n,n) open (unit=10,file=1.txt) 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 2 页,共 6 页data a/10,-1,-1,-1,10,-1,-2,-2,5/ write(10,*)*矩阵 A 的形式为 * write(10,(1x,3f6.2,/)a forall(i=1:n) x(i)=0 end forall k=0 100 D=0 do i=1,n y(i)=b(i) do j=1,n if(i/=j) y(i)=y(i)-a(i,j)*x(j) end do y(i)=y(i)/a(i,i) end do do j=1,n D=abs(x(j)-y(j) end do forall(i=1:n) x(i)=y(i) end forall if(D=e) then k=k+1 write(10,*) 迭代次数为: ,k goto 100 else goto 200 end if 200 write(10,*)* write(10,*) 用 jacobi 方法解得的结果Xt 为: write(10,(1x,3f6.2,/)x(:) stop end program 五、结果及讨论精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 3 页,共 6 页1.实验结果*矩阵 A 的形式为 * 迭代次数为:1 迭代次数为:2 迭代次数为:3 迭代次数为:4 迭代次数为:5 迭代次数为:6 迭代次数为:7 * 用 jacobi 方法解得的结果Xt 为:2.讨论分析1误差从上述输出结果中可以看出,当迭代次数k 增大时,迭代值 x1,y1,z1会越来越逼近方程组的精确解x=1.0,y=1.2,z=1.3。2收敛性在此题目中 , 用雅可比迭代法和高斯 -塞德尔迭代法分别求解该线性方程组,得到的近似根是收敛的六、算法评价优点:迭代法算法简单,编制程序比较容易。缺点:迭代法要求方程组的系数矩阵有某种特殊性质譬如是所谓对角占优阵以保证过程的收敛性。高斯塞德尔迭代法比雅可比迭代法收敛快( 到达同样的精度所需迭代次数少), 但这个结论 , 在一定条件下才是对的, 甚至有这样的方程组, 雅可比方法收敛,而高斯塞德尔迭代法却是发散的。在雅可比迭代法求解线性方程组时, 只要误差截断设计的合理, 原则上可以得到很正确的解。而通常我们选取设计误差限或设计最大迭代次数的方法来控制。由于它的准确性, 故在实际应用中比较常见, 对于解一般线性方程组非常有效准确。通过该算法以及编精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 4 页,共 6 页程对求解的过程,我们不难发现,雅克比迭代法的优点明显,计算公式简单,每迭代一次只需计算一次矩阵和向量的乘法,且计算过程中原始矩阵A始终不变,比较容易并行计算。然而这种迭代方式收敛速度较慢, 而且占据的存储空间较大,所以工程中一般不直接用雅克比迭代法,而用其改良方法。附:高斯赛德尔程序program G-S implicit none integer:i,j integer:k save k integer,parameter:n=3 real:x(n),y(n),b(n) real:D real:a(n,n) open (unit=10,file=1.txt) data a/10,-1,-1,-1,10,-1,-2,-2,5/ write(10,*)*矩阵 A 的形式为 * write(10,(1x,3f6.2,/)a forall(i=1:n) x(i)=0 end forall k=0 100 D=0 do i=1,n y(i)=b(i) do j=1,n if(ij) y(i)=y(i)-a(i,j)*y(j) end do y(i)=y(i)/a(i,i) end do do j=1,n D=abs(x(j)-y(j) end do forall(i=1:n) 精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 5 页,共 6 页x(i)=y(i) end forall if(D=e) then k=k+1 write(10,*) 迭代次数为: ,k goto 100 else goto 200 end if 200 write(10,*)* write(10,*) 用 Gauss-seidel 方法解得的结果Xt 为: write(10,(1x,3f6.2,/)x(:) stop end program *矩阵 A 的形式为 * 迭代次数为:1 迭代次数为:2 迭代次数为:3 迭代次数为:4 * 用 Gauss-seidel方法解得的结果Xt 为:精选学习资料 - - - - - - - - - 名师归纳总结 - - - - - - -第 6 页,共 6 页