实验五线性方程组的迭代法实验一. 实验目的(1)深入理解线性方程组的迭代法的设计思想,学会利用系数矩阵的性质以保证迭代过程的收敛性,以及解决某些实际的线性方程组求解问题。
(2)熟悉Matlab编程环境,利用Matlab解决具体的方程求根问题。
二. 实验要求建立Jacobi迭代公式、Gauss-Seidel迭代公式和超松弛迭代公式,用Matlab软件实现线性方程组求解的Jacobi迭代法、Gauss-Seidel迭代法和超松弛迭代法,并用实例在计算机上计算。
三. 实验内容1. 实验题目(1)分别利用Jacobi迭代和Gauss-Seidel迭代求解下列线性方程组,取x0={0 ,0,0,0,0-,o}t (2)分别取w=1、1.05、1.1、1.25和 1.8,用超松弛法求解上面的方程组,要求精度为510。
2. 设计思想1.Jacobi迭代: Jacobi迭代的设计思想是将所给线性方程组逐步对角化,将一般形式的线性方程组的求解归结为对角方程组求解过程的重复。
2.Gauss-Seidel迭代: Gauss-Seidel迭代的设计思想是将一般形式的线性方程组的求解过程归结为下三角方程组求解过程的重复。
3.超松弛迭代:基于Gauss-Seidel迭代,对i=1,2,…反复执行计算迭代公式,即为超松弛迭代。
3. 对应程序1.Jacobi迭代:function [x,k]=Jacobimethod(A,b,x0,N,emg)%A是线性方程组的左端矩阵,b是右端向量,x0是迭代初始值% N表示迭代次数上限,emg表示控制精度,k表示迭代次数,x是解n=length(A);x1=zeros(n,1);x2=zeros(n,1);x1=x0;k=0;r=max(abs(b-A*x1));while r>emgfor i=1:nsum=0;for j=1:nif i~=jsum=sum+A(i,j)*x1(j);endendx2(i)=(b(i)-sum)/A(i,i);endr=max(abs(x2-x1));x1=x2;k=k+1;if k>Ndisp('迭代失败,返回');return;endendx=x1;2.Gauss-Seidel迭代:function [x,k]=Gaussmethod(A,b,x0,N,emg)%A是线性方程组的左端矩阵,b是右端向量,x0是迭代初始值% N表示迭代次数上限,emg表示控制精度,k表示迭代次数,x是解n=length(A);x1=zeros(n,1);x2=zeros(n,1);x1=x0;r=max(abs(b-A*x1));k=0;while r>emgfor i=1:nsum=0;for j=1:nif j>isum=sum+A(i,j)*x1(j);elseif j<isum=sum+A(i,j)*x2(j);endendx2(i)=(b(i)-sum)/A(i,i);endr=max(abs(x2-x1));x1=x2;k=k+1;if k>Ndisp('迭代失败,返回');return;endendx=x1;3.超松弛(SOR)迭代:function [x,k]=SORmethod(A,b,x0,N,emg,w)%A是线性方程组的左端矩阵,b是右端向量,x0是迭代初始值% N表示迭代次数上限,emg表示控制精度,k表示迭代次数,x是解%w表示松弛因子n=length(A);x1=zeros(n,1);x2=zeros(n,1);x1=x0;r=max(abs(b-A*x1));k=0;while r>emgfor i=1:nsum=0;for j=1:nif j>=isum=sum+A(i,j)*x1(j);elseif j<isum=sum+A(i,j)*x2(j);endendx2(i)=x1(i)+w*(b(i)-sum)/A(i,i); endr=max(abs(x2-x1)); x1=x2; k=k+1; if k>Ndisp('迭代失败,返回'); return; end end x=x1;四. 实验体会 在同等精度下,Gauss-Seidel 迭代法比Jacobi 迭代法收敛速度快。
一般来说,Gauss-Seidel 迭代法比Jacobi 迭代法收敛要快,但有时反而比Jacobi 迭代法要慢,而且Jacobi 迭代法更易于优化。
因此,两种方法各有优缺点,使用时要根据所需适当选取。
当松弛因子为1时,超松弛迭代方法等同于Gauss-Seidel 迭代法,这和理论推导完全相同。
另外,超松弛迭代法的收敛速度完全取决于松弛因子的选取,一个适当的因子能大大提高收敛速度。
实验四 线方程组的直接解法一、问题提出给出下列几个不同类型的线性方程组,请用适当算法计算其解。
1、 设线性方程组123456789104231210000865365010042213210310215131194426167332386857172635021342530116101191734212246271392012400183248631x x x x x x x x x x --⎡⎡⎤⎢⎢⎥--⎢⎢⎥⎢⎢⎥---⎢⎢⎥---⎢⎢⎥⎢⎢⎥---⎢⎢⎥--⎢⎢⎥⎢⎢⎥--⎢⎢⎥---⎢⎥⎢⎥-⎢⎥⎢⎥-----⎣⎦⎣5123234613381921⎤⎡⎤⎥⎢⎥⎥⎢⎥⎥⎢⎥⎥⎢⎥⎥⎢⎥⎥⎢⎥=⎥⎢⎥⎥⎢⎥⎥⎢⎥⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥-⎣⎦⎦(1,1,0,1,2,0,3,1,1,2)T x *=--2、 设对称正定阵系数阵线方程组1234567842402400022121320641141835620021614332321812241039433441114220253101142150633421945x x x x x x x x -⎡⎤⎡⎤⎡⎤⎢⎥⎢⎥⎢⎥---⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥----⎢⎥⎢⎥⎢⎥----⎢⎥⎢⎥⎢⎥=⎢⎥⎢⎥⎢⎥----⎢⎥⎢⎥⎢⎥----⎢⎥⎢⎥⎢⎢⎥⎢⎥⎢---⎢⎥⎢⎥⎢--⎢⎥⎢⎢⎥⎣⎦⎣⎦⎣⎦⎥⎥⎥⎥ (1,1,0,2,1,1,0,2)T x *=--三对角形线性方程组123456789104100000000141000000001410000000014100000000141000000001410000000014100000000141000000001410000000014x x x x x x x x x x -⎡⎤⎡⎤⎢⎥⎢⎥--⎢⎥⎢⎥⎢⎥⎢⎥--⎢⎥⎢⎥--⎢⎥⎢⎥⎢⎥⎢⎥--⎢⎥⎢⎥--⎢⎥⎢⎥⎢⎥⎢⎥--⎢⎥⎢⎥--⎢⎥⎢⎥⎢⎢⎥--⎢⎢⎥⎢⎢⎥-⎣⎦⎣⎦7513261214455⎡⎤⎢⎥⎢⎥⎢⎥-⎢⎥⎢⎥⎢⎥=⎢⎥-⎢⎥⎢⎥⎢⎥-⎢⎥⎥⎢⎥⎥⎢⎥⎥⎢⎥-⎣⎦*(2,1,3,0,1,2,3,0,1,1)Tx =---二、要求1、 对上述三个方程组分别利用Gauss 顺序消去法与Gauss 列主元消去法;平方根法与改进平方根法;追赶法求解(选择其一);2、 应用结构程序设计编出通用程序;3、 比较计算结果,分析数值解误差的原因;4、 尽可能利用相应模块输出系数矩阵的三角分解式。
三、目的和意义1、通过该课题的实验,体会模块化结构程序设计方法的优点;2、运用所学的计算方法,解决各类线性方程组的直接算法;3、提高分析和解决问题的能力,做到学以致用;3、 通过三对角形线性方程组的解法,体会稀疏线性方程组解法的特点。
四、实验学时:2学时 五、实验步骤:1.进入C 或matlab 开发环境; 2.根据实验内容和要求编写程序; 3.调试程序; 4.运行程序;5.撰写报告,讨论分析实验结果.实验五 解线性方程组的迭代法一、问题提出对实验四所列目的和意义的线性方程组,试分别选用Jacobi 迭代法,Gauss-Seidel 迭代法和SOR 方法计算其解。
二、要求1、体会迭代法求解线性方程组,并能与消去法做以比较;2、分别对不同精度要求,如34510,10,10ε---=由迭代次数体会该迭代法的收敛快慢; 3、对方程组2,3使用SOR 方法时,选取松弛因子ω=0.8,0.9,1,1.1,1.2等,试看对算法收敛性的影响,并能找出你所选用的松弛因子的最佳者; 4、给出各种算法的设计程序和计算结果。
三、目的和意义1、通过上机计算体会迭代法求解线性方程组的特点,并能和消去法比较;2、运用所学的迭代法算法,解决各类线性方程组,编出算法程序;3、体会上机计算时,终止步骤(1)k kxx ε+∞-<或k>(给予的迭代次数),对迭代法敛散性的意义;4、 体会初始解0x ,松弛因子的选取,对计算结果的影响。
四、实验学时:2学时 五、实验步骤:1.进入C 或matlab 开发环境;2.根据实验内容和要求编写程序; 3.调试程序; 4.运行程序;5.撰写报告,讨论分析实验结果.例3 例3 用平方根法分解对称正定矩阵⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡--=5375217522541114....A解 5021241121211111.l a l a l -=-=====5021113131.l a l ===22502542212222=-=-=..l a l()51250507522221313232....l l l a l =--=-= 1252250532322313333=--=--=...l l a l于是T LL A =,其中⎥⎥⎥⎦⎤⎢⎢⎢⎣⎡-=151500050002...L由于A 为对称矩阵,因此,在电算时只要存储A 的下三角部分,其需要存储()121+n n 个元素,可用一维数组存放,即(){}nn n n a ,...a ,a ,...,a ,a n n A 212111121=⎥⎦⎤⎢⎣⎡+ 矩阵元素ij a 存放在()⎥⎦⎤⎢⎣⎡+121n n A 的第()j i i +-121个位置,L 的元素存放在A 的相应位置上.另外,平方根法的运算量是开平方 n 次;乘除法 nn n 31236123++次; 加减法 nn n 676123-+次. 当n 比较大时,平方根法的运算量和存贮量约为高斯消元法的二分之一,因此它是求解对称正定矩阵比较好的方法.为了避免开方运算,我们可以采用下面的分解式()24TLDL A =其中L 是单位下三角阵,D 是对角阵,由矩阵乘法,可得L 与D 的计算公式.对于n ,...,,i21=,有()2512111-=∑-=-=i ,...,,k d )l d l a (l k j k kj j ij ik ik()26112,d l a d j i j ij ii i ∑-=-=为了避免重复计算,我们引入()27jij ij d l t =于是上述公式可改写成对于n ,...,,i21=,有()2812111-=∑-=-=i ,...,,k ,l t a t k j kj ij ik ik()2921n,...,,k ,d t l kikik ==()3011,l t a d i j ij ij ii i ∑-=-=计算出LD T=的第i 行元素121-=i ,...,k ,t ik 后,存放在A 的第i 行相应位置,然后再计算L 的第i 行元素ik l 仍然存放在A 的第i 行,即用ik t 冲掉ik a ,再用ik l 冲掉ik t ,D 的对角线元素存放在A 的相应位置上.对称正定矩阵A 按TLDL 的分解和按T LL 分解其计算量差不多,但TLDL 分解不需要开方计算,它称为改进的平方根法. 四 追赶法在计算样条函数,解常微分方程边值问题,解热传导方程等都会要求解系数矩阵呈三对角线形的线性方程组,这时⎥⎥⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎢⎢⎣⎡=------nn nn n n n n n n a a a a a a a a a a A 1111212322211211的LU 分解中,矩阵L 和U 分别取下二对角线和上二对角线形式,设⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡=-nn nn l l l l l L 1222111 , ⎥⎥⎥⎥⎦⎤⎢⎢⎢⎢⎣⎡=-111112n n u u U由LU A =得计算公式1111l a = n ,...,,i ,l a ii ii 3211==-- n ,...,,i ,l u l a ,ii i i ii ii 3211=+=-- 121111-==++n ,...,,i ,u l a ii i ii即1111a l =111212l a u =11--=ii ii a li i ii ii ii u l a l 11---=ii ii ii l a u 11++=n ,...,,i 32=此时,求解b Ax =等价于解两个二对角线方程组()31⎩⎨⎧==yUx b Ly自上而下解方程组b Ly =形象地称为“追”.1111l b y =()323211n,...,i ,l y l b y iii ii i i =-=--自下而上解方程组y Ux =称为“赶”.()3312111,,...,n i ,x u y x y x i ii i i nn -=-==++习惯,上述求解方法称为“追赶法”. 例4 用追赶法解三对角线方程组⎪⎪⎩⎪⎪⎨⎧=+-=-+-=-+-=-120202124343232121x x x x x x x x x x 解 由三对角分解公式有21111==a l21111212-==l a u 12121-==a l2321212212222=-=-=u l a l 2222323-==a u 13232-==a l3423323333=-=u l a l 43333434-==a u 14343-==a l4534434444=-=u l a l而由“追”公式有211111==l b y 312212122=-=l y l b y 413323233=-=l y l b y 14434344=-=l y l b y最后,由“赶”公式得原方程组的解144==y x 143433=-=x u y x 132322=-=x u y x121211=-=x u y x追赶法公式实际上就是把高斯消元法用到求解三对角线方程组上去的结果,这时由于A 特别简单,因此使得求解的计算公式非常简单,而且计算量仅有45-n 次乘除法,33-n 次加减法,仅占25-n 个存贮单元,所以可以在小机器上解高阶三对角线形的线性代数方程组.求解线性方程组的直接解法二 实验部分本章实验内容:实验题目:Gauss 消元法,追赶法,范数。