《线性方程组的数值解法.ppt》由会员分享,可在线阅读,更多相关《线性方程组的数值解法.ppt(119页珍藏版)》请在三一办公上搜索。
1、第4章 线性方程组的数值解法,4.1 引言,在工程技术和科学研究中,很多科学计算的问题往往直接或间接地归结为求解线性代数方程组。常见的线性代数方程组是方程个数和未知量个数相同的阶线性方程组,它的一般形式是 其中,、为常数,为待求的未知量,(4.1),用矩阵形式表示是 其中:一般。当系数矩阵 非奇异(行列式不为零),即 时,方程组(4.1)有惟一解。,对于线性代数方程组的解法大致可分为两类,即直接解法和迭代解法。直接解法是指在假设没有舍入误差的条件下,经过有限次算数运算就能求得方程组精确解的方法。然而实际计算中由于舍入误差的影响,这类方法也只能求得近似解;迭代解法就是从一个已知的初始近似值开始,
2、按一定的法则逐步求出解的各个更准确的近似值的方法,它是用某种极限过程去逐步逼近精确解的方法。在本章中主要介绍高斯消去法、列主元高斯消去法、约当消去法、三角分解法等直接解法以及雅可比、高斯赛德尔和超松弛等迭代解法。,4.2 高斯(Gauss)消去法,4.2.1 高斯消去法的基本思想 高斯消去法是最古老的求解线性代数方程组的方法之一,高斯消去法是消去法的一种特殊形式,它包括消元与回代两个过程。,设,对行计算乘数用 乘以第 个方程后加到第 个方程到第 个方程中,消去 第个方程到第 个方程的未知数,得到,只要设 就可以继续进行消元,直到经过 次消元后,将线性方程组(4.1)化为(4.2)所示上三角方程
3、组(以上计算过程称为消元过程)。(4.2)消元过程结束后,只要设,对上三角方程组就可以自下而上逐步回代,依次求得,即,4.2.2 实现高斯消去法的基本步骤(1)输入方程组的阶数 n,系数矩阵A和右端常数矩阵b。(2)消元过程:设,对,计算:(3)回代过程(4)输出方程组的解。(5)结束。,例4.1 用高斯消去法求解线性方程组,式中,#define N 3/*N为方程组系数矩阵的阶数*/int Gauss(float aNN,float bN)int i,j,k,flag=1;float t;for(i=0;iN-1;i+)if(aii=0)flag=0;break;else for(j=i+1
4、;jN;j+)/*消元过程开始*/t=-aji/aii;bj=bj+t*bi;for(k=i;kN;k+)ajk=ajk+t*aik;return(flag);,void zg_matric(float aNN,float bN)/*输出增广矩阵*/int i,j;for(i=0;iN;i+)for(j=0;jN;j+)printf(%10f,aij);printf(%10f,bi);printf(n);printf(n);,main()static float aNN=0.1,0.3,0.5,3.0,1.0,-1.0,3.0,5.0,4.0;float bN=1.0,5.0,3.0;floa
5、t xN=0,0,0;int i,j,flag;zg_matric(a,b);flag=Gauss(a,b);if(flag=0)/*无解*/printf(Gauss method does not run.);else/*回代过程开始*/xN-1=bN-1/aN-1N-1;for(i=N-2;i=0;i-)xi=bi;for(j=i+1;jN;j+)xi=xi-aij*xj;xi=xi/aii;for(i=0;iN;i+)/*输出方程组的解*/printf(x%d=%11.7fn,i+1,xi);,程序运行结果:0.100000 0.300000 0.500000 1.000000 3.00
6、0000 1.000000-1.000000 5.000000 3.000000 5.000000 4.000000 3.000000 x1=5.4583359 x2=-6.5416689 x3=4.8333344,4.3 列主元高斯消去法,4.3.1 列主元高斯消去法的基本思想 高斯消去法,一直是在假设 的情况下进行的,并且是按照方程组中各方程所给定的顺序进行的,所以这种方法又称为顺序消去法。但当 时,消元过程就无法进行。另外,即使,但其绝对值很小时,用它作除数时,根据数值运算中“用绝对值很小的数做除数,舍入误差会增大,而且严重影响计算结果的精度”的原则,这种方法在一定程度上也具有局限性。为
7、了克服这一局限性,产生了列主元高斯消去法。这种消去法在高斯消去法每次进行消元之前先选取绝对值最大的元素作为主元素(位于主对角线上的在消去过程中用作除数的元素称为主元素,简称主元)进行消去。,列主元高斯消去法,是在高斯消去法的消去过程中,第 步()增加选主元操作,成为:首先在第 列中,从 中选出绝对值最大的元素,经过行交换(把绝对值最大者所在的行与第 行交换)把绝对值最大的元素交换到 的单元中;然后作Gauss消去法的消去过程中第 步,初等变换产生第 列的 个零元素。回代过程与Gauss消去法的回代过程相同。以上就是列主元高斯消去法的操作步骤。由于,可证明,中至少有一个元素不为零,从理论上保证了
8、列主元高斯消去法的可行性。,4.3.2 实现列主元高斯消去法的基本步骤(1)输入方程组的阶数n,系数矩阵A和右端常数矩阵b。(2)列主元素 对,从 中选出绝对值最大的元素,将 行和 行交换后,再作第 次消元操作。(3)消元过程:对,计算:,(4)回代过程:(5)输出方程组的解。(6)结束,例 4.2 用列主元高斯消去法求解线性方程组,式中,void ColGauss(float aNN,float bN)float t,max_fab;int i,j,k,l;for(i=0;imax_fab)l=j;max_fab=fabs(aji);if(il)/*交换i、l两行*/t=bi;bi=bl;b
9、l=t;for(j=i;jN;j+)t=aij;aij=alj;alj=t;for(j=i+1;jN;j+)/*消元过程开始*/t=-aji/aii;bj=bj+t*bi;for(k=i;kN;k+)ajk=ajk+t*aik;,void zg_matric(float aNN,float bN)/*输出增广矩阵*/int i,j;for(i=0;iN;i+)for(j=0;jN;j+)printf(%10f,aij);printf(%10f,bi);printf(n);printf(n);,#include#define N 4/*N为方程组系数矩阵的阶数*/main()float aNN=
10、1.003,0.333,1.504,-0.333,-2.011,1.455,0.506,2.956,4.329,-1.952,0.006,2.087,5.113,-4.004,3.332,-1.112;float bN=3.005,5.407,0.136,3.772;float xN=0,0,0,0;int i,j;zg_matric(a,b);ColGauss(a,b);xN-1=bN-1/aN-1N-1;/*回代过程开始*/for(i=N-2;i=0;i-)xi=bi;for(j=i+1;jN;j+)xi=xi-aij*xj;xi=xi/aii;for(i=0;iN;i+)/*输出方程组的
11、解*/printf(x%d=%11.7fn,i+1,xi);,程序运行结果:1.003000 0.333000 1.504000-0.333000 3.005000-2.011000 1.455000 0.506000 2.956000 5.407000 4.329000-1.952000 0.006000 2.087000 0.136000 5.113000-4.004000 3.332000-1.112000 3.772000 x1=-0.325438 x2=0.327990 x3=2.372718 x4=1.040163,列主元高斯消去法,虽然保证了当前的主元素 是第 列中 以下元素中的
12、绝对值最大者,但还不能保证它是同一行(既第 行)中的绝对值最大者。因此,经过列选主元后,虽然避免了 的情况发生,但其计算过程还是不稳定的,不适于求解较大规模的线性方程组,因而这种方法在一定程度上也具有局限性。为了克服这一局限性,产生了全主元高斯消去法。列主元高斯消去法当变换到第 步时,从系数矩阵的右下角 阶子矩阵中选取绝对值最大的元素,然后通过行变换与列变换将它交换到主元素 的位置上。回代过程与Gauss消去法的回代过程相同,请读者参考有关书籍。,4.4 约当(Jordan)消去法,4.4.1 约当消去法的基本思想 约当(Jordan)消去法是一种无回代过程的求解线性方程组的直接解法,基本思想
13、是,将线性方程组的系数矩阵通过初等变换,化为一个等价的对角阵(只有主对角线上的元素不为0,其余元素均为0),从而方便地求出方程组的解。,假如我们将此增广矩阵通过次初等变换,化成下列等价形式(式中每个元素右上角圆括号内的数字表示消去计算的次数)由此可立即求得方程组的解:,4.4.2 实现约当消去法的基本步骤,例 4.3 用约当消去法求解线性方程组,式中,,,#define N 3/*N为方程组的系数矩阵的阶数*/int joydan(float aNN+1)float r;int i,j,k,flag=1;for(k=0;kN;k+)if(akk=0)/*当akk为0时,约当消去法不能进行*/f
14、lag=0;break;else for(i=0;iN;i+)r=aik/akk;if(i!=k)if(aik!=0)for(j=0;j=N;j+)aij=aij-r*akj;return(flag);,void print_matric(float aNN+1)/*输出增广矩阵*/int i,j;for(i=0;iN;i+)for(j=0;j=N;j+)printf(%12f,aij);printf(n);printf(n);,main()float aNN+1=1,-1,1,-4,5,-4,3,-12,2,1,1,11;float xN;int i,k;clrscr();print_mat
15、ric(a);/*输出增广矩阵的初始数据*/k=joydan(a);if(k=1)/*当k=1时约当消去法正常进行*/print_matric(a);/*输出初等变换后的增广矩阵*/for(i=0;iN;i+)xi=aiN/aii;printf(x%d=%11.6fn,i+1,xi);/*输出方程组的解*/else/*当k=0时输出约当消去法不能进行的信息*/printf(Joydan method does not run!n);,程序运行结果:1.000000-1.000000 1.000000-4.000000 5.000000-4.000000 3.000000-12.000000 2
16、.000000 1.000000 1.000000 11.000000 1.000000 0.000000 0.000000 3.000000 0.000000 1.000000 0.000000 6.000000 0.000000 0.000000 5.000000-5.000000 x1=3.000000 x2=6.000000 x3=-1.000000 约当消取法能否进行,取决于每一步能否满足,否则约当消取法将无法进行。另外,即使,但其绝对值很小时,仍用它作除数时,就会导致舍入误差增大,严重影响计算结果的精度。为解决这一问题,可以采用选主元的技术进行计算,具体算法可参考有关书籍。,4.5
17、 三角分解法,三角分解法是高斯消去法的一种变形解法。用高斯消去法去解 阶线性方程组,经过 次消元之后,得出一个等价的上三角形方程组,对上三角形方程组用逐步回代的方法就可以求出解来。上述消元过程也可以通过矩阵分解来实现。,4.5.1 三角分解法的基本思想 设 阶线性方程组(4.1)的系数矩阵 非奇异,并且系数矩阵,能分解为两个三角形矩阵之积,即(4.3)其中 为一个下三角阵,为一个上三角阵,那么方程组 就化为(4.4)从而使问题转化为求解两个简单的三角形方程组:(4.5),矩阵 分解为两个矩阵、之积,一般不是惟一的,但规定了、的形式之后,由矩阵的乘法运算法则知,这种分解便是惟一的。由于 和、的形
18、式不同,就得到矩阵的不同解法,相应地就有解线性代数方程组的几种解法.本节介绍直接三角分解法、乔里斯基(Cholesky)分解法、追赶法和对称高斯法(分解法)。,4.5.2 直接三角分解法 设线性方程组(4.1)的系数矩阵非奇异,并且系数矩阵,能分解为同阶的单位下三角形矩阵和同阶的上三角矩阵之积,或能分解为同阶的下三角形矩阵和同阶的单位上三角矩阵之积,即写成矩阵元素的形式如下:,或 则称为直接三角分解法。将矩阵 分解为 时,当 是单位下三角形矩阵,是上三角矩阵时,称为Dolittle分解;当 是下三角形矩阵,是单位上三角矩阵时,称为Courant分解。Dolittle分解法和Courant分解法
19、的基本思想相同,本章只介绍Courant分解法。,4.5.3 实现Courant分解法的基本步骤,#define N 3/*N为方程组系数矩阵的阶数*/void Lu(float aNN,float LNN,float UNN)/*LU分解*/int i,j,k;for(k=0;kN;k+)for(i=k;iN;i+)/*计算L矩阵的第k列元素*/Lik=aik;for(j=0;j=k-1;j+)Lik-=(Lij*Ujk);for(j=k+1;jN;j+)/*计算U矩阵的第k列元素*/Ukj=akj;for(i=0;i=k-1;i+)Ukj-=(Lki*Uij);Ukj/=Lkk;,void
20、 solve(float bN,float LNN,float UNN,float xN)int j,k;float yN;for(k=0;k=0;k-)/*计算Ux=y中的x*/xk=yk;for(j=k+1;jN;j+)xk=xk-Ukj*xj;,void zg_matric(float aNN,float bN)/*输出增广矩阵*/int i,j;for(i=0;iN;i+)for(j=0;jN;j+)printf(%10f,aij);printf(%10f,bi);printf(n);printf(n);,main()static float aNN=1,2,-1,1,-1,5,4,1
21、,-2;float bN=3,0,2;float xN=0,0,0;float UNN=1,0,0,0,1,0,0,0,1;float LNN;int i;zg_matric(a,b);Lu(a,L,U);solve(b,L,U,x);for(i=0;iN;i+)/*输出方程组的解*/printf(x%d=%11.7fn,i+1,xi);,程序运行结果:1.000000 2.000000-1.000000 3.000000 1.000000-1.000000 5.000000 0.000000 4.000000 1.000000-2.000000 2.000000 x1=0.2500000 x
22、2=1.5000000 x3=0.2500000,在直接三角分解法中计算时,如果分母(甚至可能为零)绝对值很小,仍用它作除数时,就会导致舍入误差增大,严重影响计算结果的精度。为解决这一问题,可以配合按列选主元的技术进行计算,具体算法可参考有关书籍。,4.5.4 乔里斯基(Cholesky)分解法 在工程和科学计算中,有时归结为求一个特殊的线性代数方程组,例如系数矩阵是一个对称正定矩阵,为此,这里介绍系数矩阵为对称正定矩阵的方程组的三角解法乔里斯基分解法。,对 阶线性方程组,当系数矩阵 为对称正定时可以惟一地分解为,其中 为上三角矩阵。即写成矩阵元素的形式如下:且。,4.5.5 实现乔里斯基分解
23、法的基本步骤,实现乔里斯基分解法的NS图,例 4.5 用乔里斯基分解法求解线性方程组,式中,#include#define N 4/*N为方程组系数矩阵的阶数*/void chodec(float aNN,float lNN)int i,j,k;float s;for(i=0;iN;i+)li0=ai0/sqrt(a00);for(i=1;iN;i+)s=0.0;for(k=0;k=i-1;k+)s=s+lik*lik;lii=sqrt(aii-s);for(j=i+1;jN;j+)s=0.0;for(k=0;k=i-1;k+)s=s+ljk*lik;lji=(aji-s)/lii;,void
24、 solve(float aNN,float bN,float xN)int i,j,k;float s;for(k=0;k=0;k-)s=bk;for(j=k+1;jN;j+)s-=ajk*xj;xk=s/akk;,void zg_matric(float aNN,float bN)/*输出增广矩阵*/int i,j;for(i=0;iN;i+)for(j=0;jN;j+)printf(%10f,aij);printf(%10f,bi);printf(n);printf(n);,main()static float aNN=1,2,1,-3,2,5,0,-5,1,0,14,1,-3,-5,1
25、,15;float lNN;float bN=1,2,16,8;float xN=0,0,0,0;int i;zg_matric(a,b);Chodec(a,l);/*分解过程*/Solve(l,b,x);/*回代求方程组的解*/for(i=0;iN;i+)/*输出方程组的解*/printf(x%d=%11.7fn,i+1,xi);,程序运行结果:1.000000 2.000000 1.000000-3.000000 1.000000 2.000000 5.000000 0.000000-5.000000 2.000000 1.000000 0.000000 14.000000 1.00000
26、0 16.000000-3.000000-5.000000 1.000000 15.000000 8.000000 x1=1.0000000 x2=1.0000000 x3=1.0000000 x4=1.0000000,4.5.6 追赶法 许多实际问题中,如在船体数学放样中建立的三次样条函数等,往往遇到求解 形式的线性方程组,其中系数矩阵 称为三对角阵,它的特点是其非零元素集中分布在主对角线及其相邻两条次对角线上,除此之外的其余元素全部为零。写成矩阵元素的形式如下:为此,这里介绍系数矩阵为三对角矩阵的方程组的解法追赶法。实际上,追赶法是高斯消去法的一种简化形式,同样分为消元和回代两个过程。,4
27、.5.7 实现追赶法的基本步骤(1)消去过程,其中:,2)回代过程 方程组(4.6)实际上是一组递推关系式,求出 就能求出,由 可求出,直至求出 即(4.7),实现追赶法的NS图,例 4.6 用追赶法求解线性方程组,式中,#define N 4/*N为方程组系数矩阵的阶数*/void zhuigan(a,b,c,d,r,y)float a,b,c,d,r,t y;float q;int i;r0=c0/b0;y0=d0/b0;for(i=1;iN;i+)q=bi-ri-1*ai;ri=ci/q;yi=(di-yi-1*ai)/q;,void solve(float rN,float yN,fl
28、oat xN)int i;xN-1=yN-1;for(i=N-2;i=0;i-)xi=yi-ri*xi+1;,main()float aN=0.0,90.860,-67.590,46.260;/*主对角线左下方元素*/float bN=136.01,98.81,132.01,177.17;/*主对角线元素*/float cN=90.860,-67.590,46.260,0.0;/*主对角线右上方元素*/float dN=-33.254,49.709,28.067,-7.3244;/*右端常数项元素*/float rN,yN;/*存放中间变量数组*/float xN;/*存放方程组的解向量的数组
29、*/int i;clrscr();zhuigan(a,b,c,d,r,y);solve(r,y,x);for(i=0;iN;i+)printf(x%d=%13.6fn,i+1,xi);,程序运行结果:x1=-2954.868164x2=4422.830078x3=2492.836426x4=-650.933777,4.5.8 对称高斯法(分解法)许多实际问题中,往往遇到求解系数矩阵 为对称的线性方程组,写成矩阵元素的形式如下:为此,这里介绍系数矩阵为对称的方程组的解法对称高斯法。对称高斯法的基本思想是将分解为的形式,即 L 是对角元素为1的单位下三角阵,然后再进行分解和回代过程求解。,4.5.
30、9 实现对称高斯法的基本步骤(1)输入方程组的阶数N,系数矩阵A和右端常数矩阵b。(2)分解过程 对 对,(3)回代过程 对(4)结束。,对称高斯法的N-S图描述,例 4.7 用对称高斯法求解线性方程组,式中,#include#define N 5/*N为方程组系数矩阵的阶数*/void sgaus(float aNN,float bN)float q;int i,j,k;for(k=0;kN-1;k+)for(i=k+1;iN;i+)q=aik/akk;for(j=k+1;j=i;j+)aij-=q*ajk;bi-=q*bk;,void solve(float aNN,float bN,fl
31、oat xN)float s;int j,k;xN-1=bN-1/aN-1N-1;for(k=N-2;k=0;k-)s=bk;for(j=k+1;jN;j+)s-=ajk*xj;xk=s/akk;,void zg_matric(float aNN,float bN)/*输出增广矩阵*/int i,j;for(i=0;iN;i+)for(j=0;jN;j+)printf(%10f,aij);printf(%12f,bi);printf(n);printf(n);,main()float aNN=5,7,6,5,1,7,10,8,7,2,6,8,10,9,3,5,7,9,10,4,1,2,3,4,
32、5;float bN=96,136,144,140,60;float xN;int i;clrscr();zg_matric(a,b);/*输出增广矩阵*/sgaus(a,b);/*分解过程*/solve(a,b,x);/*回代求解方程组的的解*/for(i=0;iN;i+)/*输出方程组的解*/printf(x%d=%11.7fn,i+1,xi);,程序运行结果:5.000000 7.000000 6.000000 5.000000 1.000000 96.0000007.000000 10.000000 8.000000 7.000000 2.000000 136.0000006.0000
33、00 8.000000 10.000000 9.000000 3.000000 144.0000005.000000 7.000000 9.000000 10.000000 4.000000 140.0000001.000000 2.000000 3.000000 4.000000 5.000000 60.000000 x1=4.0000572x2=3.9999673x3=3.9999847x4=4.0000057x5=4.0000057,4.6 线性方程组的迭代解法,4.6.1 迭代法的基本思想 迭代法的基本思想是,对于给定的线性方程组,我们可以用不同的方法把它变为与之等价的,形为 的方程组
34、。将上式改写成迭代式 选定初始值,反复不断地使用迭代式校正方程组根的近似值,并在此过程中求取符合计算精度要求的方程组的近似值。在求解阶数较高且零系数较多的大型稀疏线性代数方程组时,迭代法是很有效的。本节介绍常用的雅可比迭代法、高斯赛德尔迭代法,以及超松弛迭代法。,4.6.2 雅可比(Jacobi)迭代法 设 n 阶方程组的系数矩阵A非奇异,主对角元素,并且绝对值相对来说比较大,从方程组的第 i个方程中解出,得到等价的方程组(4.8)由(4.8)构造迭代公式(4.9)初始值 任取。称式(4.9)为雅可比迭代公式。,4.6.3 实现雅可比迭代法的基本步骤(1)输入方程组的阶数n,系数矩阵A,右端常
35、数矩阵b,最大迭代次数 MAX_N以及容许误差;(2)k=0;(3)对,计算:(4),成立转(6),否则继续;(5)成立,转(3);否则输出失败信息,转(7);(6)输出;(7)结束。,雅可比迭代法的流程图描述,例 4.8 用雅可比迭代法求解线性方程组,式中#include#include#define N 3/*N为方程组系数矩阵的阶数*/#define MAX_N 100/*最大迭代次数*/#define epsilon 1e-6/*容许误差*/,int yacobi(float aNN,float bN,float xN)float d,s,max,yN;int i,j,k,flag;k
36、=0;for(i=0;i=MAX_N)/*当k=MAX_N时反馈失败信息,结束迭代*/flag=0;break;return(flag);,void zg_matric(float aNN,float bN)/*输出增广矩阵*/int i,j;for(i=0;iN;i+)for(j=0;jN;j+)printf(%10f,aij);printf(%12f,bi);printf(n);printf(n);,main()float aNN=10,1,-2,-2,10,-1,1,-2,5;float bN=9,7,4;float xN;int i,k;clrscr();zg_matric(a,b);
37、k=yacobi(a,b,x);if(k=1)for(i=0;iN;i+)/*输出方程组的解*/printf(x%d=%11.7fn,i+1,xi);else printf(The Method is disconvergent!n);/*输出失败信息*/,程序运行结果:10.000000 1.000000-2.000000 9.000000-2.000000 10.000000-1.000000 7.000000 1.000000-2.000000 5.000000 4.000000 x1=1.0000002 x2=0.9999999 x3=0.9999996,4.6.4 高斯赛德尔(Gau
38、ss-Seidel)迭代法 高斯赛德尔迭代法的基本思想与雅可比迭代法相似。它们的区别是:在雅可比迭代法中,每次迭代时只用到上次的值,而高斯赛德尔迭代法中充分利用了最新得到的迭代值。即在雅可比迭代公式中,计算 的第 个分量时,所用的全是 的各个分量,对于新算出的分量 并没有利用。若迭代收敛,我们设想把 算出后立即代替 用于后面分量的计算,当 算出后立即代替 用于后面分量的计算期望这样会收敛得快些。根据这种思想得到如下所示的高斯赛德尔迭代公式:,4.6.5 实现高斯赛德尔迭代法的基本步骤 实现高斯赛德尔迭代法的基本步骤,与实现雅可比迭代法的基本步骤基本相同,请参阅雅可比迭代法的基本步骤和流程图4.
39、8。例 4.9 用高斯赛德尔迭代法求解线性方程组,式中,#include#include#define N 4/*N为方程组系数矩阵的阶数*/#define MAX_N 100/*最大迭代次数*/#define epsilon 1e-6/*给定精度要求*/,int seidel(float aNN,float bN,float xN)float d,s,max,temp;int i,j,k,flag;k=0;for(i=0;i=MAX_N)flag=0;break;return(flag);,void zg_matric(float aNN,float bN)/*输出增广矩阵*/int i,j
40、;for(i=0;iN;i+)for(j=0;jN;j+)printf(%10f,aij);printf(%12f,bi);printf(n);printf(n);,main()float aN=5,-1,-1,-1,-1,10,-1,-1,-1,-1,5,-1,-1,-1,-1,10;float bN=-4,12,8,34;float xN;int i,k;clrscr();zg_matric(a,b);k=seidel(a,b,x);if(k=1)/*输出方程组的解*/for(i=0;iN;i+)printf(x%d=%11.7fn,i+1,xi);else printf(The Meth
41、od is disconvergent!n);/*输出失败信息*/,程序运行结果:5.000000-1.000000-1.000000-1.000000-4.000000-1.000000 10.000000-1.000000-1.000000 12.000000-1.000000-1.000000 5.000000-1.000000 8.000000-1.000000-1.000000-1.000000 10.000000 34.000000 x1=1.0000000 x2=2.0000000 x3=3.0000000 x4=4.0000000,超松弛(SQR)迭代法 超松弛迭代法是高斯赛德
42、尔迭代法的一种改进,其目的是尽量使迭代的收敛速度加快,减少迭代的次数。超松弛迭代法的基本思想是:在高斯赛德尔迭代公式的基础上做一些修改,计算第 个分量 时,将高斯赛德尔迭代公式(4.10)的结果记为,再引进实数 作为参数,令 得到迭代公式为,其中,参数 叫做松弛因子。高斯赛德尔迭代法是取松弛因子 的特殊情形。可以证明,为了保证迭代过程收敛,必须要求。由于迭代值 通常比 精确,在迭代公式中加大 的比重,以尽可能扩大它的效果,为此取松弛因子,即采用所谓超松弛迭代法。松弛因子 的取值对迭代公式的收敛速度影响极大,在实际应用时,可以根据方程组的系数矩阵的性质,或结合实践计算的经验来选定合适的松弛因子。
43、,4.6.7 实现超松弛迭代法的基本步骤实现超松弛迭代法的基本步骤如下。(1)输入方程组的阶数n,系数矩阵A,右端常数矩阵b,松弛因子 以及容许误差;(2)初始化解向量。(3)对,计算:(4)(5)对,计算,(6)对,计算(7)。(8)对 成立,(9)对:(10)成立转(12),否则继续。(11)成立,转(4),否则输出失败信息转(13)。(12)输出。(13)结束。,例 4.10 用超松弛迭代法求解线性方程组,式中精度要求取,松弛因子w=1.1。#include#include#define N 5/*N为方程组系数矩阵的阶数*/#define MAX_N 100/*最大迭代次数*/#def
44、ine epsilon 1e-5/*容许误差*/,void zg_matric(float aNN,float bN)/*输出增广矩阵*/int i,j;for(i=0;iN;i+)for(j=0;jN;j+)printf(%12f,aij);printf(%12f,bi);printf(n);printf(n);,int sqr(float w,float aNN,float bN,float xN)float erro;float dN,gN,cNN;int i,j,k,flag=0;for(i=0;iN;i+)gi=bi/aii;for(j=0;jN;j+)cij=-aij/aii;fo
45、r(i=1;i=MAX_N;i+)for(j=0;jN;j+)dj=gj;for(j=0;jN;j+)for(k=0;kj;k+)dj=dj+cjk*dk;for(k=j+1;kN;k+)dj=dj+cjk*xk;dj=(1-w)*xj+w*dj;erro=0.0;for(j=0;jN;j+)if(errofabs(dj-xj)erro=fabs(dj-xj);for(j=0;jN;j+)xj=dj;if(erroepsilon)flag=1;break;return(flag);,main()float aNN=4,-1,0,-1,0,-1,4,-1,0,-1,0,-1,4,-1,0,-1,
46、0,-1,4,-1,0,-1,0,-1,4;float bN=2,1,2,1,2;float xN=0,0,0,0,0;float w;int i,k;while(1)printf(input the w value:);scanf(%f,/*输出失败信息*/,程序运行结果:input the w value:1.1 4.000000-1.000000 0.000000-1.000000 0.000000 2.000000-1.000000 4.000000-1.000000 0.000000-1.000000 1.000000 0.000000-1.000000 4.000000-1.000
47、000 0.000000 2.000000-1.000000 0.000000-1.000000 4.000000-1.000000 1.000000 0.000000-1.000000 0.000000-1.000000 4.000000 2.000000 x1=0.9999989x2=0.9999990 x3=0.9999994x4=0.9999993x5=0.9999996,本 章 小 结,目前线性代数方程组的解法大致可分直接法和迭代法两类。直接法是指在假设没有舍入误差的条件下,经过有限次算数运算就能求得方程组精确解的方法;迭代法是从一个已知的初始近似值开始,按一定的法则逐步求出解的各个
48、更准确的近似值的方法,它是用某种极限过程去逐步逼近精确解的方法。在本章中直接法主要介绍了高斯消去法、列主元高斯消去法、约当消去法、Courant分解法、乔里斯基分解法、追赶法及对称高斯法;迭代法主要介绍了雅可比、高斯赛德尔法以及超松弛迭代法。,本章要求 高斯消去法是解线性方程组的最基本的方法,而且高斯消去法程序也是具有代表性的数值计算方法程序,读者应从程序总体结构和程序设计方法上重点掌握。同时为了保证高斯消去法的顺利进行并提高解的精度,必须采用主元消去法,这是也是本章重点掌握的内容之一。,在本章要了解的主要内容有:1)了解高斯消去法由消去过程和回代过程组成;2)了解列主元高斯消去法有两个用途:
49、(1)为保证算法顺利进行,避免对角线上的元素为0。(2)为减小舍入误差的产生,避免对角线上的元素为很小。4)了解当系数矩阵为三对角阵时,用追赶法求解线性方程组是非常简单的;3)了解如果需要重复地求解系数矩阵相同,而右端常数项不同的线性方 程组时,三角分解法是很有效的;5)了解高斯赛德尔迭代法与雅可比迭代法的区别,即在雅可比迭代法 中,每次迭代时只用到上次的值,而高斯赛德尔迭代法中充分利用 了最新得到的迭代值。这也是迭代法中常用的一种技巧。6)理解超松弛迭代法的意义。松弛因子 的取值对迭代公式的收敛速度 影响极大,在实际应用时,可以根据方程组的系数矩阵的性质,或结 合实践计算的经验来选定合适的松弛因子。,习 题,4.1 用高斯消去法求解线性方程组,4.2 用列主元高斯消去法求解线性方程组,4.3 用约当消去法求解线性方程组,4.4 用Courant分解法求解线性方程组,4.5 用乔里斯基分解法求解线性方程组,4.6 用追赶法求解实三对角线性方程组,4.7 用对称高斯法求解线性方程组,4.8 用雅可比迭代法求解线性方程组,4.9 用高斯赛德尔迭代法求解线性方程组,4.10 用雅可比迭代法及高斯赛德尔迭代法求解线性方程组,式中 4.11 用超松弛迭代法求解线性方程组,要求当 时迭代终止。,(松弛因子),(松弛因子),(松弛因子),
链接地址:https://www.31ppt.com/p-5008350.html