高斯消元法,是线性代数中的一个算法,可用来求解线性方程组,并可以求出矩阵的秩,以及求出可逆方阵的逆矩阵。
高斯消元法的原理是:
若用初等行变换将增广矩阵 化为 ,则AX = B与CX = D是同解方程组。
所以我们可以用初等行变换把增广矩阵转换为行阶梯阵,然后回代求出方程的解。
1、线性方程组
1)构造增广矩阵,即系数矩阵A增加上常数向量b(A|b)
2)通过以交换行、某行乘以非负常数和两行相加这三种初等变化将原系统转化为更简单的三角形式(triangular form)
注:这里的初等变化可以通过系数矩阵A乘上初等矩阵E来实现
3)从而得到简化的三角方阵组,注意它更容易解
4)这时可以使用向后替换算法(Algorithm for Back Substitution)求解得
z=-4/-4=1, y=4-2z=4-2=2, x= (1-y-z)/2=(1-2-1)/2=-1
总结上面过程,高斯消元法其实就是下面非常简单的过程
原线性方程组 ——> 高斯消元法 ——> 下三角或上三角形式的线性方程组 ——> 前向替换算法求解(对于上三角形式,采用后向替换算法)
补充1:
高斯-若尔当消元法(Gauss-Jordan Elimination)

相对于高斯消元法,高斯-若尔当消元法最后的得到线性方程组更容易求解,它得到的是简化行列式。其转化后的增高矩阵形式如下,因此它可以直接求出方程的解,而无需使用替换算法。但是,此算法的效率较低。

例子如下:
解为
个人感觉区别就是对每行进行了归一化处理
补充2:
介绍了最基本的高斯消元法,现在看看应用于实际问题的实用算法
因为实际应用中,我们总是利用计算机来分析线性系统,而计算机中以有限的数来近似无限的实数,因此产生舍入误差(roundoff error),进而对解线性系统产生很多影响。
一个t位(即精度为t)以
为基的浮点数的表达形式为:
,
。对于一个实数x,其浮点近似值
为最接近x的浮点数,必要时进行近似
。
例1:对2位以10为基的浮点算法,
。
例2:同样考虑
,
。
以下面系统为例,看看在高斯消元中采用浮点算法会产生什么效果。

当以精确解法时,通过将第一行乘以m=89/47,并从第二行中减去得到
,进而利用后向替换算法得x=1,y=-1。
当以3位以10为基的浮点算法时,乘子变为
,因为
,因此第一步高斯消元后得
。此时,因为不能将第2行第1列位置变为0,所以不能将其三角化。从而,我们只能接受将这个位置值赋为0,而不管其实际浮点值。因此,3位浮点高斯消元的结果为
,后向算法计算结果为
。
尽管无法消除近似误差的影响,可以采用一些技术来尽量减小这类机器误差。部分主元消元法在高斯消元的每一步,都选择列上最大值为轴(通过行变换将其移动)。
下面给出列主元消去的代码(所谓列主元消去法是在系数矩阵中按列选取元素绝对值得最大值作为主元素,然后交换所在行与主元素所在行的位置,再按顺序消去法进行消元。)
讯享网
讯享网 1 列选主元消元法 2 /* 3 *Gauss.cpp 4 *功能:列选主元消元法 5 */ 6 #include<stdio.h> 7 #include"Gass.h" 8 9 //高斯消元法(列选主元) 10 void Gauss (double a[][MAXNUM],int n) 11 { 12 int i,j; 13 SelectColE(a,n); //列选主元并消元成上三角 14 //回代求解 15 printf("上三角的结果\n"); 16 printM(a,3); 17 for(i=n;i>=1;i--) 18 { 19 for(j=i+1;j<=n;j++) 20 a[i][n+1]-=a[i][j]*a[j][n+1]; 21 a[i][n+1]/=a[i][i]; 22 } 23 return ; 24 } 25 //选择列主元并进行消元 26 void SelectColE(double a[][MAXNUM],int n) 27 { 28 int i,j,k,maxRowE; 29 double temp; //用于记录消元时的因数 30 for(j=1;j<=n;j++) 31 { 32 maxRowE=j; 33 for(i=j;i<=n;i++) 34 if(fabs(a[i][j])>fabs(a[maxRowE][j])) 35 maxRowE = i; 36 if(maxRowE!=j) 37 swapRow(a,j,maxRowE,n); //与最大主元所在行交换 38 //消元 39 for(i=j+1;i<=n;i++) 40 { 41 temp =a[i][j]/a[j][j]; 42 for(k=j;k<=n+1;k++) 43 a[i][k]-=a[j][k]*temp; 44 } 45 printf("第%d列消元后:\n",j); 46 printM(a,3); 47 } 48 return; 49 } 50 void swapRow(double a[][MAXNUM],int m,int maxRowE,int n) 51 { 52 int k; 53 double temp; 54 for(k=m;k<=n+1;k++) 55 { 56 temp = a[m][k]; 57 a[m][k] = a[maxRowE][k]; 58 a[maxRowE][k] = temp; 59 } 60 return ; 61 } 62 63 //测试函数 64 int main() 65 { 66 double a[4][MAXNUM]; 67 68 int i,n,j; 69 70 a[1][1] = 0.001; a[1][2]=2.000;a[1][3]=3.000;a[1][4]=1.000; 71 a[2][1] = -1.000;a[2][2]=3.712;a[2][3]=4.623;a[2][4]=2.000; 72 a[3][1] = -2.000;a[3][2]=1.070;a[3][3]=5.643;a[3][4]=3.000; 73 Gauss (a,3); 74 for(i=1;i<=3;i++) 75 printf("X%d=%f\n",i,a[i][4]); 76 return 0; 77 } 78 //输出矩阵 79 void printM(double a[][MAXNUM], int n) 80 { 81 int i,j; 82 for(i=1;i<=n;i++) 83 { 84 for(j=1;j<=n+1;j++) 85 { 86 printf("%f ,",a[i][j]); 87 } 88 printf("\n"); 89 } 90 }





版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容,请联系我们,一经查实,本站将立刻删除。
如需转载请保留出处:https://51itzy.com/kjqy/127157.html