高斯消元法java语言设计_高斯消元法(Gauss Elimination)【超详解&模板】

高斯消元法是线性代数中的算法,用于求解线性方程组和计算矩阵的逆。该方法通过初等行变换将增广矩阵转化为行阶梯阵,然后回代求解。在编程中,高斯消元法分为多个步骤,包括构造增广矩阵、转换为行阶梯阵和求解。文章提供了详细的算法实现,并举例介绍了如何在不同场景下应用,如求解整数和浮点数线性方程组、处理无穷解和唯一解的情况,以及在编程竞赛中的应用。此外,还讨论了高斯消元法在处理浮点数时的精度问题和如何应对矩阵不可逆的情况。
摘要由CSDN通过智能技术生成

高斯消元法,是线性代数中的一个算法,可用来求解线性方程组,并可以求出矩阵的秩,以及求出可逆方阵的逆矩阵。

高斯消元法的原理是:

若用初等行变换将增广矩阵 化为 ,则AX = B与CX = D是同解方程组。

所以我们可以用初等行变换把增广矩阵转换为行阶梯阵,然后回代求出方程的解。

1、线性方程组

9724a86dcd8c48060bdc70e7464e3b73.png

1)构造增广矩阵,即系数矩阵A增加上常数向量b(A|b)

4581e40d14ea52e730d002b727184cb2.png

2)通过以交换行、某行乘以非负常数和两行相加这三种初等变化将原系统转化为更简单的三角形式(triangular form)

注:这里的初等变化可以通过系数矩阵A乘上初等矩阵E来实现

1aaa269994c0c94b01f0b0dacab210ef.png

3)从而得到简化的三角方阵组,注意它更容易解

711b8d6245152736f812adf036de03fb.png

z=-4/-4=1,  y=4-2z=4-2=2,  x= (1-y-z)/2=(1-2-1)/2=-1

总结上面过程,高斯消元法其实就是下面非常简单的过程

原线性方程组       ——>       高斯消元法     ——> 下三角或上三角形式的线性方程组           ——>  前向替换算法求解(对于上三角形式,采用后向替换算法)

362dcb5959aab792d3df54836b1f69b4.png

补充1:

高斯-若尔当消元法(Gauss-Jordan Elimination)

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

685d5ae098f376605d549c4594b048a7.png

例子如下:

ccdcec1cff05e282cc99a0298d53cabc.png          解为4048b99e2fe1d4e13290f2c43f91e27b.png

个人感觉区别就是对每行进行了归一化处理

补充2:

介绍了最基本的高斯消元法,现在看看应用于实际问题的实用算法

因为实际应用中,我们总是利用计算机来分析线性系统,而计算机中以有限的数来近似无限的实数,因此产生舍入误差(roundoff error),进而对解线性系统产生很多影响。

一个t位(即精度为t)以1c61dc21a72e28ddbabb9ad891e5b5b8.png为基的浮点数的表达形式为:dacf10b0ae54cba219411944969a7195.png79713b574e2ed5fd992c8009459599ac.png。对于一个实数x,其浮点近似值5120dadc08d423417b7d235469c34417.png为最接近x的浮点数,必要时进行近似9da365f2cb6ebb68a20e76d3394ca89e.png

例1:对2位以10为基的浮点算法,6a5d412ae45611cef75d82299073ba26.png

例2:同样考虑1a15e825767059b8bc35145e8b78e793.png2281b61ae8e914d826689da15a377076.png

以下面系统为例,看看在高斯消元中采用浮点算法会产生什么效果。

d18ae6d4d5fcb72c6682ec6f3d852091.png

当以精确解法时,通过将第一行乘以m=89/47,并从第二行中减去得到42f6a08cc68fd4f03e102d9f8adb7790.png,进而利用后向替换算法得x=1,y=-1。

当以3位以10为基的浮点算法时,乘子变为f984b927c577864f39592bdcad2f7934.png,因为a36539cc0e960f62c906ce10e72b6b4a.png,因此第一步高斯消元后得

6a9221cce0cd38700e352f76f180e3a5.png。此时,因为不能将第2行第1列位置变为0,所以不能将其三角化。从而,我们只能接受将这个位置值赋为0,而不管其实际浮点值。因此,3位浮点高斯消元的结果为c266a3f08dc2413b37a84907a1782d81.png,后向算法计算结果为97bba1ce3e9a95403a5655fc144f8bcc.png

尽管无法消除近似误差的影响,可以采用一些技术来尽量减小这类机器误差。部分主元消元法在高斯消元的每一步,都选择列上最大值为轴(通过行变换将其移动)。

下面给出列主元消去的代码(所谓列主元消去法是在系数矩阵中按列选取元素绝对值得最大值作为主元素,然后交换所在行与主元素所在行的位置,再按顺序消去法进行消元。)

1 列选主元消元法2 /*

3 *Gauss.cpp4 *功能:列选主元消元法5 */

6 #include

7 #include"Gass.h"

8

9 //高斯消元法(列选主元)

10 void Gauss (double a[][MAXNUM],intn)11 {12 inti,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],intn)27 {28 inti,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,intn)51 {52 intk;53 doubletemp;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 intmain()65 {66 double a[4][MAXNUM];67

68 inti,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], intn)80 {81 inti,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 }

测试结果:

1366086782_1928.jpg

2、逆矩阵

71fb7a69220f140cad9841184b20c3f5.png

下面来说说高斯消元法在编程中的应用。

首先,先介绍程序中高斯消元法的步骤:

(我们设方程组中方程的个数为equ,变元的个数为var,注意:一般情况下是n个方程,n个变元,但是有些题目就故意让方程数与变元数不同)

1. 把方程组转换成增广矩阵。

2. 利用初等行变换来把增广矩阵转换成行阶梯阵。

枚举k从0到equ – 1,当前处理的列为col(初始为0) ,每次找第k行以下(包括第k行),col列中元素绝对值最大的列与第k行交换。如果col列中的元素全为0,那么则处理col + 1列,k不变。

3. 转换为行阶梯阵,判断解的情况。

① 无解

当方程中出现(0, 0, …, 0, a)的形式,且a != 0时,说明是无解的。

② 唯一解

条件是k = equ,即行阶梯阵形成了严格的上三角阵。利用回代逐一求出解集。

③ 无穷解。

条件是k < equ,即不能形成严格的上三角形,自由变元的个数即为equ – k,但有些题目要求判断哪些变元是不缺定的。

这里单独介绍下这种解法:

首先,自由变元有var - k个,即不确定的变元至少有var - k个。我们先把所有的变元视为不确定的。在每个方程中判断不确定变元的个数,如果大于1个,则该方程无法求解。如果只有1个变元

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
高斯消元法是一种线性代数中求解线性方程组的常用方法,它通过一系列的行变换将增广矩阵转化为上三角矩阵,从而求出方程组的解。 下面我们来详细介绍高斯消元法的步骤: 1. 将增广矩阵写成一个矩阵形式:$$\left[\begin{array}{cccc|c}a_{11} & a_{12} & \cdots & a_{1n} & b_1 \\a_{21} & a_{22} & \cdots & a_{2n} & b_2 \\\vdots & \vdots & \ddots & \vdots & \vdots \\a_{n1} & a_{n2} & \cdots & a_{nn} & b_n \\\end{array}\right]$$ 2. 选择第一列系数最大的行作为第一步的主元素所在的行,将该行移到第一行。 3. 通过消元操作将第一列的其他元素变成零。具体地,对于第 $i$ 行,我们将其乘以一个系数 $m_i$ 加到第一行上,使得第一行的第 $i$ 个元素变成零。需要注意的是,系数 $m_i$ 的取值为:$$m_i = -\frac{a_{i1}}{a_{11}}$$ 4. 将第二列系数最大的行作为第二步的主元素所在的行,将该行移到第二行。 5. 通过消元操作将第二列的其他元素变成零。具体地,对于第 $i$ 行,我们将其乘以一个系数 $m_i$ 加到第二行上,使得第二行的第 $i$ 个元素变成零。需要注意的是,系数 $m_i$ 的取值为:$$m_i = -\frac{a_{i2}}{a_{22}}$$ 6. 重复上述步骤,直到将增广矩阵转化为上三角矩阵。此时,方程组的解可以通过回代得到。 7. 回代过程:从最后一行开始,依次求解每个未知量。具体地,对于第 $i$ 个未知量,我们先将第 $i$ 行的解代入第 $i$ 个方程中,然后依次代入已知的第 $i+1$ 到第 $n$ 个未知量的解,得到第 $i$ 个未知量的解。 下面是高斯消元法的代码实现: ```c++ const double eps = 1e-8; int gauss(vector<vector<double>>& a, vector<double>& b) { int n = a.size(); int m = a[0].size() - 1; vector<int> p(n); for (int i = 0; i < n; i++) { p[i] = i; } for (int k = 0; k < m; k++) { int pivot = k; for (int i = k; i < n; i++) { if (abs(a[i][k]) > abs(a[pivot][k])) { pivot = i; } } swap(a[pivot], a[k]); swap(b[pivot], b[k]); if (abs(a[k][k]) < eps) { return -1; } for (int i = k + 1; i < n; i++) { double f = a[i][k] / a[k][k]; b[i] -= f * b[k]; for (int j = k; j < m; j++) { a[i][j] -= f * a[k][j]; } } } vector<double> x(m); for (int k = m - 1; k >= 0; k--) { x[k] = b[k]; for (int i = k + 1; i < m; i++) { x[k] -= a[k][i] * x[i]; } x[k] /= a[k][k]; } return 0; } ``` 其中,输入参数为一个 $n \times (m+1)$ 的增广矩阵 $A$ 和一个长度为 $n$ 的向量 $b$,输出为 $0$ 或者 $-1$,表示方程组有唯一解或者无解,解存储在长度为 $m$ 的向量 $x$ 中。 需要注意的是,为了防止精度误差,我们在进行消元操作时,如果某个数的绝对值小于一个极小值 $\epsilon$,则将其视为零。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值