23高斯列主元消去法_第1页
23高斯列主元消去法_第2页
23高斯列主元消去法_第3页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

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

文档简介

1、2.3 高斯列主元消去法解线性方程组一:问题的提出我们都知道,高斯列主元素消去法是计算机上常用来求解线性方程组的一种直接的方法。 就是在不考虑舍入误差的情况下, 经过有限步的四则运算可以得到 线性方程组的准确解的一类方法。 实际运算的时候因为只能有限小数去计算, 因 此只能得到近似值。 在实际运算的时候, 我们很多时候也常用高斯消去法。 但是 高斯消去法在计算机中运算的时候常会碰到两个问题。1 一旦遇到某个主元等于 0 ,消元过程便无法进行下去。 2在长期使用中还发现, 即使消元过程能进行下去, 但是当某个主元的绝对值 很小时,求解出的结果与真实结果相差甚远。为了避免高斯消去法消元过程中出现的

2、上述两个问题, 一般采用所谓的选择主元 法。其中又可以分为列选主元和全面选主元两种方法。 目前计算机上常用的按列 选主元的方法。因此我在这里做的也是列选主元高斯消去法。二、算法的基本思想 大家知道,如果一个线性方程组的系数矩阵是上三角矩阵时, 即这种方程组 我们称之为上三角方程组, 它是很容易求解的。 我们只要把方程组的最下面的一 个方程求解出来, 在把求得的解带入倒数第二个方程, 求出第二个解, 依次往上 回代求解。 然而,现实中大多数线性方程组都不是上面所说的上三角方程组, 所 以我们有可以把不是上三角的方程通过一定的算法化成上三角方程组, 由此我们 可以很方便地求出方程组的解。 高斯消元

3、法的目的就是把一般线性方程组简化成三角方程组。 于是高斯消元法的基本思想是: 通过逐次消元将所给的线性方程r >a(1)11a(1)12. . . a(1)1nX1a(1)21a(1)22. . . a(1)2nX2L丿l 丿用(-li1 )乘第一个方程加到第i个方程上,得同解方程组:an-11 an-12. .an-1nb(1)ib(1)2Xn-1b(1)n-1an1an2 . a nnXnb(1)n组化为上三角形方程组,继而通过回代过程求解线性方程组。三、算法的描述1、设有n元线性方程组如下:a11Ka1nXb1MOM M=Man1LannXib2、第一步v:如果an !=0,令li

4、1 = ai1/a11, I=2,3,,n简记为:A x = b (2)其中aj = a j i1 * a1j , I ,j = 2,3,.,nb(2)i = b i -lii * b i , I = 2,3,.,n第二步:如果a22 != 0,令li2= a (2)i2/a (2)22, 1= 3, ,n依据同样的原理,对矩阵进行化间(省略),依次下去,直到完成!最后,得到上三角方程组:r r 冷a11a12.a(1)1nX1b(1)10a22 .a (1)2nX2b(1)2JL JL J0 0.a(n-1)n-1nXn-1b(n-1)n-10 0 .a (n) nnXnb(n)n简记为:A

5、(n)x = b(n)最后从方程组的最后一个方程进行回代求解为:YXn = b (n) / a (n)nnI Xi = ( b(k)k -a(k)kjXj )/a(k)kk以上为高斯消去法的基本过程。但是如前面我们所提到的,存在的问题1.一旦遇到某个主元等于0,消元过程便无法进行下去。2在长期使用中还发现, 即使消元过程能进行下去, 但是当某个主元的绝对值 很小时,求解出的结果与真实结果相差甚远。 为了避免高斯消去法消元过程中出 现的上述两个问题, 一般采用所谓的选择主元法。 其中又可以分为列选主元和全 面选主元两种方法。 目前计算机上常用的按列选主元的方法。 因此我在这里做的 也是列选主元高

6、斯消去法。 他的特点是: 每次在系数矩阵中依次按列在主对角线 及以下的元素中, 选取绝对值最大的元素作为主元, 将她调到主对角线上, 然后 用它消去主对角线以下的元素, 最后化为同解的上三角形方程组去求解。 由于列 主元法相对高斯消元法来说就增加了选主元操作,其他的求解步骤是一样的。 四、程序流程图main()函数入口五、程序描述程序的名称为:zealous.cpp1.程序的结构如下:线性方程组系数矩阵的输入函数高 斯 列 主 元 消 去 法用户查看矩阵系数的函数高斯主元素消去法的实现回代求出结果的函数找主元素并换行的函数主元素消去法后续个行中此列的元素使之为0的函数回代求解,并输出结果的函数

7、回代过程结果输出程序只能最大输入60行60列的系数矩阵。2程序要用到的函数(1、)matrix_getElement(array,n,m);此函数的作用是获得用户输入的线性方程组的系数矩阵。(2、)matrix_outputElement(array,n,m);此函数的作用是显示用户输入的矩阵。(3、)selectMaxElement(array,n,m,row);此函数的作用是选择主元素,并把此时对角线上的那列元素与主元素行交换。(4、)GAUSSProcess(array, n, m, row);此函数的作用是用主元素列进行高斯 消元,把此行以后所有的行的,此列的元素变为0。(5、)GAU

8、SSProcess_result(array, n,m);此函数的作用是显示经过高斯消元 后的矩阵,此时的系数矩阵为一个上下三角矩阵。(&) GAUSSCalculate_result(array, n, m);此函数的作用是对已经消元好的矩 阵,进行回代求解。并将结果输出六、程序代码/*高斯列消去法 *#include<stdio.h>#include<math.h> #include<iostream.h>#include <iomanip.h>const int N=60;/ 最大const int M=61;/60 列,再加上等号

9、右边的一列值/ 输入要计算方程组的矩阵 void matrix_getElement(double ARRAYNM,int n, int m)for(int i=0;i<n;i+)cout<<" 请您输入第 "<<"t"<<(i+1)<<"t"<<"row:"<<endl;for(int j=0;j<m;j+) cin>>ARRAYij;return;/ 输出用户刚才用户输入的矩阵,以便用户检测是否输入正确void ma

10、trix_outputElement(double ARRAYNM, int n, int m)cout<<"your have input the matrix as fllows:n"for(int i=0; i<n;i+)for(int j=0;j<m;j+) cout<<ARRAYij<< "t"<< "t"cout<<endl<<endl;/ 选择主元素,并把主元行与对角线上的那一行交换void selectMaxElement(double

11、 ARRAYNM,int n, int m, int line )double max=0;double t=0;int j=0;int i=line;max=ARRAYlineline;for(i=line+1;i<n;i+)if( fabs(ARRAYiline) > fabs(max) ) max=ARRAYiline;j=i;if(j>line)for(i=0;i<m;i+)t=ARRAYji;ARRAYji=ARRAYlinei;ARRAYlinei=t;/ 用对角线上的元素消去后续行中此列的元素void GAUSSProcess(double ARRAYNM

12、, int n, int m, int row)double ROW1M;for(int t=0;t<(m-row);t+)ROW1t=ARRAYrowrow+t;for(int j=(row+1); j < n; j+)double ROW_CHANGEM;for(int r=0;r<(m-row);r+)double mainElement=ROW10;if( fabs(mainElement) < 1e-7)cout << "Single! press any key return.n"getchar();return;ROW_CH

13、ANGEr=ROW1r*ARRAYjrow/ROW10;for(int h=0; h<(m-row); h+)ARRAYjh+row = ARRAYjh+row-ROW_CHANGEh;/ 用回代的方法求出线性方程组的解 void GAUSSCalculate_result(double ARRAYNM, int n, int m)double aN; an-1=ARRAYn-1m-1/ARRAYn-1n-1;for(int p=n-2; p>=0; p-)for(int q=n-1; q>p; q-)ARRAYpm-1=ARRAYpm-1 - ARRAYpq*aq;ap =

14、 ARRAYqm-1/ARRAYpp;cout<<"the final result asfollows:n"for(int e=0; e<n; e+)cout<< "x"<< e+1 << "=" << ae << endl;/ 输出经过高斯消去法处理后得到的矩阵 -void GAUSSProcess_result(double ARRAYNM, int n, int m) :n"cout<<" 您输入的矩阵经过高斯消去法处

15、理后得到如下形式 for(int i=0; i<n;i+)for(int j=0;j<m;j+) cout<<ARRAYij<<"t"<<"t"cout<<endl<<endl;/main 函数 void main()"<<" 您 所 输 入 的 列 为 :/ 获得矩阵的元素/ 显示输入的矩阵/ 高斯消元法的主体/ 显示消元后的矩阵/ 回代求解并显示解结果double arrayNM;cout<<" 请输入您要运算的矩阵的大小!

16、n" int n=0, m=0;cout<<" 请输入您要运算的矩阵的行数: " cin>>n;cout<<" 请输入您要运算的矩阵的列数: " cin>>m;cout<<" 您 所 输 入 的 行 为 : "<<n<<" "<<m<<endl;matrix_getElement(array,n,m); matrix_outputElement(array,n,m);for(int row=0; r

17、ow<n; row+)selectMaxElement(array,n,m,row ); GAUSSProcess(array, n, m, row);GAUSSProcess_result(array, n,m);GAUSSCalculate_result(array,n,m);cout << "This is the end!"/七、实例本程序可以自己选择在 60 个未知数的方程组,可以自己选择线性方程组的 行数和列数。例子如下:2x1 + x2 5x3 + x4 =8 ;x1 3x2 6x4 = 9;2x2x3 2x4= 5;x1 4x2 7x3 6x4 = 0 ; 输入您要运算的矩阵的大小 !请输入您要运算的矩阵的行数: 4请输入您要运算的矩阵的列数: 5您所输入的行为: 4 您所输入的列为: 5请您输入第 1 row:21-518请您输入第 2 row:1-33 row:4 row:等用户输入以上的数据后,出现结果如下图所示:9请您输入第02-12-5请您输入第14-7602haue input the natr ix as1f L ldus :_51ti1-30-fc92-12'5

温馨提示

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

评论

0/150

提交评论