高斯消元法解线性方程组
高斯消元法简化线性方程组

高斯消元法简化线性方程组线性方程组是数学中常见的问题,其解决方法多种多样。
其中,高斯消元法是一种常用且有效的方法,可以用于简化线性方程组的求解过程。
本文将介绍什么是高斯消元法,以及如何应用它来解决线性方程组。
一、高斯消元法的原理高斯消元法是一种通过行变换将线性方程组转化为更简单形式的方法。
假设有一个线性方程组,包括n个未知数和n个方程:a11x1 + a12x2 + ... + a1nxn = b1a21x1 + a22x2 + ... + a2nxn = b2...an1x1 + an2x2 + ... + annxn = bn通过一系列的行变换,可以将线性方程组转化为上三角矩阵或者简化行阶梯形矩阵的形式。
二、高斯消元法的步骤1. 首先,将方程组表示为增广矩阵的形式,即将系数矩阵和常数向量合并在一起。
得到增广矩阵[A|B],其中A为系数矩阵,B为常数向量。
2. 选取一个主元素,一般选择第一列的第一个非零元素。
在每一行中,通过行变换将主元素所在列的其他元素消为零。
这一步骤称为“消元”。
3. 重复上述步骤,将主元素向下和向右移动,直到矩阵转化为上三角形或简化行阶梯形。
4. 如果出现主元素为零的情况,则需要通过交换行来选取一个非零元素作为主元素,以确保程序正确运行。
5. 进行回代求解,从最后一行开始,依次将已知数值代入方程组中,求解出未知数的值。
三、应用实例下面以一个具体的实例来说明高斯消元法的应用:假设有以下线性方程组:x + 2y - z = 52x - y + 3z = 93x + y - 2z = 1首先,将方程组表示为增广矩阵形式:[1 2 -1 | 5][2 -1 3 | 9][3 1 -2 | 1]选取第一列的第一个非零元素1作为主元素,进行消元操作:[1 2 -1 | 5][0 -5 5 | -1][0 -5 1 | -14]选取第二列的第一个非零元素-5作为主元素,继续进行消元操作:[1 2 -1 | 5][0 1 -1 | 1/5][0 0 -4 | -13/5]此时,矩阵已经转化为上三角形的形式。
高斯消元法解线性方程组

高斯消元法解线性方程组线性方程组是数学中常见的问题,其中包含多个线性方程,求解线性方程组即为找到满足所有方程的解。
高斯消元法是一种常用的方法,可以有效地解决线性方程组。
本文将介绍高斯消元法的原理和步骤,并通过一个具体的例子来演示其应用。
一、高斯消元法原理高斯消元法是通过一系列的行变换来将线性方程组转化为上三角形式,进而求解方程组。
具体步骤如下:1. 将线性方程组写成增广矩阵形式,其中每一行表示一个方程,最后一列为常数项。
2. 选择一个主元,通常选择第一列的第一个非零元素作为主元。
3. 将主元所在行的所有元素除以主元,使主元变为1。
4. 将主元所在列的其他行元素通过适当的倍数加到相应行,使得主元所在列的其他元素都变为0。
5. 重复步骤2-4,直到将矩阵转化为上三角形式。
6. 从最后一行开始,通过回代法求解每个未知数的值。
二、高斯消元法步骤示例为了更好地理解高斯消元法的步骤,下面以一个具体的线性方程组为例进行演示。
假设有如下线性方程组:2x + y - z = 1-3x - y + 2z = -2-2x + y + 2z = 3首先,将线性方程组写成增广矩阵形式:[ 2 1 -1 | 1 ][-3 -1 2 | -2 ][-2 1 2 | 3 ]选择第一列的第一个非零元素2作为主元,将主元所在行的所有元素除以主元,使主元变为1,得到:[ 1 0 -0.5 | 0.5 ][-3 -1 2 | -2 ][-2 1 2 | 3 ]然后,将主元所在列的其他行元素通过适当的倍数加到相应行,使得主元所在列的其他元素都变为0,得到:[ 1 0 -0.5 | 0.5 ][ 0 -1 1.5 | -0.5 ][ 0 1 3 | 4 ]接下来,选择第二列的第二个非零元素-1作为主元,将主元所在行的所有元素除以主元,使主元变为1,得到:[ 1 0 -0.5 | 0.5 ][ 0 1 -1.5 | 0.5 ][ 0 1 3 | 4 ]再次进行行变换,将主元所在列的其他行元素通过适当的倍数加到相应行,使得主元所在列的其他元素都变为0,得到:[ 1 0 -0.5 | 0.5 ][ 0 1 -1.5 | 0.5 ][ 0 0 4.5 | 3 ]将矩阵转化为上三角形式后,从最后一行开始,通过回代法求解每个未知数的值。
用高斯消元法解线性方程组

用高斯消元法解线性方程组高斯消元法是一种常用的解线性方程组的方法。
它通过一系列的行变换将线性方程组转化为一个简化的行阶梯形式,从而可以方便地求解方程组。
基本步骤使用高斯消元法解线性方程组的基本步骤如下:1. 构造增广矩阵:将线性方程组的系数矩阵和常数向量按照方程的顺序组合成一个增广矩阵。
2. 初等行变换:通过初等行变换操作,将增广矩阵转化为行阶梯形或行最简形。
3. 回代求解:从最后一行开始,反向代入得到方程组的解。
详细步骤以下是用高斯消元法解线性方程组的详细步骤:1. 将线性方程组的系数矩阵和常数向量按照方程的顺序组合成一个增广矩阵,如下所示:[a11 a12 ... a1n | b1][a21 a22 ... a2n | b2][... ... ... ... | ...][an1 an2 ... ann | bn]2. 选择第一个非零元素所在的列,记为第 k 列。
3. 通过初等行变换操作,将第 k 列除了第 k 行之外的所有元素变为零。
首先,将第 k 行的第 k 个元素系数标准化为 1,即将第 k 行的所有元素除以第 k 个元素的值。
然后,对第 i 行(i ≠ k)进行以下操作:将第 i 行的第 k 个元素的系数变为零,即将第 i 行减去第 k 行的 k 个元素乘以第 i 行的第 k 个元素的系数。
4. 重复步骤 2 和步骤 3,直至所有列都处理完毕。
5. 如果最后一行的所有元素都为零,则该线性方程组无解。
6. 如果最后一行的最后一个非零元素所在的列号为 m,则 m+1 到 n 列的所有元素均为自由变量。
7. 从最后一行开始,反向代入求解自由变量。
示例假设有以下线性方程组:2x + 3y - z = 13x + 2y + z = 2x + 3y + 2z = 3将该方程组转化为增广矩阵的形式:[2 3 -1 | 1][3 2 1 | 2][1 3 2 | 3]通过高斯消元法的步骤,可以得到以下的行阶梯形式:[1 3/2 1/2 | 3/2][0 7/2 -3/2 | -3/2][0 0 17/7 | 17/14]根据行阶梯形式,可以得到方程组的解为:x = 1/2y = -1/2z = 2/7总结高斯消元法是一种简单而有效的方法,用于解线性方程组。
线性方程组的几种求解方法

线性方程组的几种求解方法1.高斯消元法高斯消元法是求解线性方程组的一种常用方法。
该方法的基本思想是通过对方程组进行一系列简化操作,使得方程组的解易于求得。
首先将方程组表示为增广矩阵,然后通过一系列的行变换将增广矩阵化为行简化阶梯形,最后通过回代求解出方程组的解。
2.列主元高斯消元法列主元高斯消元法是在高斯消元法的基础上进行改进的方法。
在该方法中,每次选取主元时不再仅仅选择当前列的第一个非零元素,而是从当前列中选取绝对值最大的元素作为主元。
通过选取列主元,可以避免数值稳定性问题,提高计算精度。
3.LU分解法LU分解法是一种将线性方程组的系数矩阵分解为一个下三角矩阵L 和一个上三角矩阵U的方法。
首先进行列主元高斯消元法得到行阶梯形矩阵,然后对行阶梯形矩阵进行进一步的操作,得到L和U。
最后通过回代求解出方程组的解。
4.追赶法(三角分解法)追赶法也称为三角分解法,适用于系数矩阵是对角占优的三对角矩阵的线性方程组。
追赶法是一种直接求解法,将系数矩阵分解为一个下三角矩阵L和一个上三角矩阵U,然后通过简单的代数运算即可求得方程组的解。
5.雅可比迭代法雅可比迭代法是一种迭代法,适用于对称正定矩阵的线性方程组。
该方法的基本思想是通过不断迭代求解出方程组的解。
首先将方程组表示为x=Bx+f的形式,然后通过迭代计算不断逼近x的解。
6.高斯-赛德尔迭代法高斯-赛德尔迭代法是雅可比迭代法的改进方法。
该方法在每一次迭代时,使用已经更新的解来计算新的解。
相比于雅可比迭代法,高斯-赛德尔迭代法的收敛速度更快。
7.松弛因子迭代法松弛因子迭代法是一种对高斯-赛德尔迭代法的改进方法。
该方法在每一次迭代时,通过引入松弛因子来调节新解与旧解之间的关系。
可以通过选择合适的松弛因子来加快迭代速度。
以上是一些常用的线性方程组求解方法,不同的方法适用于不同类型的线性方程组。
在实际应用中,根据问题的特点和要求选择合适的求解方法可以提高计算的效率和精度。
数学公式知识:高斯消元法解线性方程组

数学公式知识:高斯消元法解线性方程组高斯消元法是一种常用于解决线性方程组的方法,其基本思想是通过一系列的行变换,将原始的线性方程组转化为一个三角形形式的线性方程组,从而求解出方程组的解析解或数值解。
本文将介绍高斯消元法的过程、原理以及应用。
一、高斯消元法的基本过程高斯消元法的基本过程可以分为以下几步:1.构造增广矩阵:将原始的线性方程组写成增广矩阵的形式,即将系数矩阵和常数向量合并在一起。
2.基本行变换:通过一系列基本行变换(例如交换两行、将某一行乘以一个非零常数、将某一行加上另一行的若干倍),将增广矩阵转化为上三角矩阵。
3.回带求解:通过向上回带的方式,求解出上三角矩阵对应的线性方程组的解。
二、高斯消元法的原理在执行高斯消元法的过程中,关键是在第一步构造增广矩阵时,如何选取主元。
主元通常被选为系数矩阵中对应行的主对角线元素,其基本原理是以该元素为基础,通过一系列行变换,将其他元素全部消为0,从而得到一个上三角矩阵。
但是,在实际应用中,可能会出现主元为0或非常小的情况,导致计算误差或求解失败。
因此,在程序实现时,通常需要先通过部分选主元(例如选取绝对值最大的元素作为主元),再进行行变换,从而提高计算精度。
此外,在执行高斯消元法的过程中,需要注意一些细节问题,例如主元为0或非常小的情况、矩阵奇异性等,以避免出现计算错误或无解的情况。
三、高斯消元法的应用高斯消元法广泛应用于各种科研和工程问题中,例如线性控制、图像识别、计算机视觉等领域。
其主要应用场景包括:1.求解线性方程组:高斯消元法可以直接求解线性方程组的解析解或数值解,为工程和科研计算提供了重要的基础工具。
2.矩阵求逆:通过将方程组的系数矩阵变为单位矩阵,可以使用高斯消元法求解矩阵的逆,从而可以直接计算出矩阵的行列式、特征值等重要参数。
3.最小二乘法:在拟合曲线或曲面时,通常会将问题转化为线性方程组的形式,然后采用高斯消元法求解最小二乘问题的解。
C++ 数学与算法系列之高斯消元法求解线性方程组

C++ 数学与算法系列之高斯消元法求解线性方程组1. 前言什么是消元法?消元法是指将多个方程式组成的方程组中的若干个变量通过有限次地变换,消去方程式中的变量,通过简化方程式,从而获取结果的一种解题方法。
消元法主要有代入消元法、加减消元法、整体消元法、换元消元法、构造消元法、因式分解消元法、常数消元法、利用比例性质消元法等。
对方程式消元时,是基于如下的初等行变换规则:•改变方程组中方程式的顺序,或者说无论先求解方程组中哪一个方程式,不影响方程组的解。
•对一个方程式中的所有系数乘以或除以某一个非零数,不影响方程组的解。
•方程式之间可以倍乘后相加或相减,不影响解。
其中最常用的为代入消元法和加减消元法,简要介绍一下。
代入消元法如求解2x+3y=10和x+y=4; 2个方程式中的x ,y变量时。
可以把第2个方程式变换成x=4-y。
然后代入到第1个方程中,2(4-y)+3y=10。
可求解出y=2,x=2。
加减消元法还是求解如上的方程组。
可以把第2个方程式乘以2后再去减第1个方程式,或者说让第1个方程式减去第2个方程式乘以2。
2x+3y-2x-2y=10-8。
可以求解y=2。
本文主要和大家聊聊高斯消元法,高斯(Gauss)消元法也称为简单消元法,是求解一般线性方程组的经典算法。
2. 高斯消元法在理解高斯消元化之前,先理解几个基本概念:什么是增广矩阵?增广矩阵是线性代数中的概念,如下线性方程组:使用每个方程式的系数构建的矩阵,称为系数矩阵,表示为:用方程式的系数和结果构建的矩阵称为方程组的增广矩阵。
如下图所示:当方程组中的每一个方程的结果都为0时, 即b1=b2=b3=b4……bm=0,称这样的方程组为齐次线性方程组。
2.1 高斯消元法的思想高斯消元的基本思想:•对于一个有n个变量、有n个方程式的方程组。
•把方程组中除了第1个方程式外的其它方程式中的x1消去,同理,再把除了第2个方程式以下的方程组中其它方程式中的x2消去,依次类推,直到最后1个方程式中只留下xn。
高斯消元法在解线性方程组中的应用

高斯消元法在解线性方程组中的应用高斯消元法是一种非常实用的算法,能够对线性方程组进行求解。
因此,它在数学、物理、化学、工程学等领域都得到了广泛
的应用。
高斯消元法是将线性方程组的系数矩阵转化为所要求的矩阵,
使用一些简单的变换来达到简化方程组的目的。
具体来说,首先
可以通过交换两个方程或多个方程来使系数矩阵的主对角线上的
元素变为非零元。
然后,通过将系数矩阵的某一行乘以一个非零
常数或将某一行加上或减去另一行来使主对角线以下的元素为0。
最终,得到一个上三角矩阵,可以通过回代求解得到方程组的解。
高斯消元法的优缺点:
优点:高斯消元法计算简单,求解速度较快,可在一定范围内
获得较高的精度。
缺点:高斯消元法在某些情况下可能会产生有限或无限多的解,这可能是由于线性方程组中的约束条件不充分或矛盾导致的。
此外,随着线性方程组大小的增加,高斯消元法求解的复杂性会显
著增加。
在大型的稀疏线性方程组中,高斯消元法往往不是最好的选择。
高斯消元法的应用场景:
高斯消元法可以用于求解各种问题,如求解矩阵方程、求解线性方程组变型、线性回归、最小二乘法等。
这些问题的求解都可以转化为求解线性方程组的问题,因此高斯消元法是解决这些问题的关键算法。
总之,高斯消元法是一种重要的数学工具,在各个领域都能够得到广泛的应用。
无论是通过纸笔计算还是计算机程序实现,高斯消元法都应该是每个使用线性代数的科学家和工程师的基本工具之一。
高斯消元法求解线性方程组

高斯消元法求解线性方程组线性方程组是数学中重要的概念,它描述了一组线性方程的集合。
解决线性方程组的问题在科学和工程领域中具有广泛的应用。
高斯消元法是一种常用的方法,用于求解线性方程组。
本文将介绍高斯消元法的原理和步骤,并通过实例演示其应用。
一、高斯消元法的原理高斯消元法是一种基于矩阵变换的方法,用于将线性方程组转化为简化的行阶梯形式。
其基本思想是通过一系列的行变换,将方程组中的系数矩阵化为上三角矩阵,从而简化求解过程。
具体而言,高斯消元法的步骤如下:1. 将线性方程组的系数矩阵和常数向量写成增广矩阵的形式。
2. 选取一个主元素,通常选择第一列的第一个非零元素作为主元素。
3. 通过行变换,将主元素下方的所有元素化为零。
4. 选取下一个主元素,并重复步骤3,直到将矩阵化为上三角形式。
5. 通过回代法,求解得到线性方程组的解。
二、高斯消元法的步骤为了更好地理解高斯消元法的步骤,我们以一个具体的线性方程组为例进行演示。
假设我们有以下线性方程组:```2x + 3y - z = 14x - y + z = -2x + 2y + 3z = 3```首先,我们将其写成增广矩阵的形式:```[2, 3, -1 | 1][4, -1, 1 | -2][1, 2, 3 | 3]```接下来,我们选取第一列的第一个非零元素2作为主元素,并通过行变换将主元素下方的元素化为零。
具体步骤如下:1. 将第二行乘以2,然后与第一行相减,得到新的第二行:`[0, -7, 3 | -4]`2. 将第三行乘以0.5,然后与第一行相减,得到新的第三行:`[0, 0.5, 2.5 | 1.5]`此时,得到的矩阵为:```[2, 3, -1 | 1][0, -7, 3 | -4][0, 0.5, 2.5 | 1.5]```接下来,我们选取第二列的第二个非零元素-7作为主元素,并通过行变换将主元素下方的元素化为零。
具体步骤如下:1. 将第三行乘以14,然后与第二行相加,得到新的第三行:`[0, 0, 35 | 7]`此时,得到的矩阵为:```[2, 3, -1 | 1][0, -7, 3 | -4][0, 0, 35 | 7]```最后,我们通过回代法求解得到线性方程组的解。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
高斯消元法解线性方程组C++实验报告2015年6月一、完成人王婧婷张子承郗滢二、问题描述线性方程组问题是大学阶段经常研究的问题,为了进一步熟悉理解高斯消元法的解题思路并且掌握编程语言在数学方面的应用。
且为解决线性方程组问题提供便利,要求给出线性方程组的矩阵,能够输出线性方程组的解。
三、解决方案设计基本程序流程为:(1)输入矩阵(2)运用初等行变换将其化为阶梯型矩阵(3)调用一个函数:r()求其秩(有解时)及其无解情况实验原理为:(1)系数矩阵及其增广矩阵经过初等行变换所得到的矩阵对应的方程与原方程同解(2)化为阶梯型矩阵过程(输入增广矩阵后,运用初等行变换,使其a[i][i]以下全为零,若a[i][i]为零,运用行变换交换使其不为零)(3)输出阶梯型矩阵(4)判断解情况并输出(解情况)(5)输出解四、模块及代码组织设计其基本模块分为三大部分,7小部分。
第一部分为输入矩阵阶段,用for语句实现。
第二部分是对矩阵进行一系列的处理以求得线性方程组的解,先运用初等行变换化为阶梯型,并输出化简矩阵;然后以线性方程组的秩判断其是否有解(规定无解时秩为零)。
第三部分是输出线性方程组的解情况及其解,如果无解即输出无解。
五、关键代码(1)实现化为阶梯型的代码实现此功能的代码是整个程序的重要内容,其需要进行的初等变换以实现校园的目的,使线性方程组得到简化。
其实现如下: for( i=0; i<=n-1&&i<m; i++ ){if(a[i][i]!=0){m1=a[i][i];for( j=i+1; j<=m-1; j++){m2=a[j][i];for( k=0; k<=n; k++ ){a[j][k]=a[j][k]-a[i][k]*m2/m1;}}}else if(a[i][i]==0){for( j=i+1; j<=m-1; j++){if(a[j][i]!=0){for(k=0; k<=n; k++)//交换i,j两行使a[i][i]!=0{b=a[i][k];a[i][k]=a[j][k];a[j][k]=b;}break;}}m1=a[i][i];for( j=i+1; j<=m-1; j++){m2=a[j][i];for( k=0; k<=n; k++ ){a[j][k]=a[j][k]-a[i][k]*m2/m1;}}}}(2)求出线性方程组系数矩阵秩的代码此代码是实现判断线性方程组解情况,其代码如下:int r(int m,int n,double c[][10000]){int i,j,k,b,e=0,f,x;double temp;double m1,m2;for(i=0; i<m; i++){b=0;for(j=0; j<n; j++){b=b+c[i][j];if (b!=0 ){e++;break;}}}for(i=0; i<m; i++){b=0;f=0;for(j=0; j<n; j++){b=b+c[i][j];if(b!=0 ) f=1;}if(f== 0 && c[i][n]!=0)//若系数全为0,非齐次项不为0; {return 0;x=1;break;}}if(x!=1)return e;}(3)分情况讨论解结构无解直接输出,单一解调用函数求解,无穷多解输出基础解析,代码如下:if(ra==0)cout<<"无解"<<endl;if(ra==n)//有唯一解{cout<<"唯一解"<<endl;danjie(n,a,x);for(i=0; i<n; i++)cout<<'x'<<(i)<<'='<<(x[i])<<endl;}else if(ra<n&&ra!=0){cout<<"无穷多解"<<endl;int ra=r(m,n,a);double b[ra][n-ra+1];double xx[ra][n-ra+1];for(i=0; i<ra; i++){for(k=0; k<n-ra+1; k++){b[i][k]=a[i][k+ra];}}for(i=0; i<ra; i++)a[i][ra]=b[i][n-ra];}danjie(ra,a,x);for(i=0; i<ra; i++){xx[i][0]=x[i];}for(j=1; j<=n-ra; j++){for(i=0; i<ra; i++){a[i][ra]=0;a[i][ra]=a[i][ra]-b[i][j-1];}danjie(ra,a,x);for(i=0; i<ra; i++){xx[i][j]=x[i];}}for(i=0; i<n; i++){if(i<ra){cout<<'x'<<(i+1)<<'=';for(j=0; j<=n-ra; j++){if(j==0){if(xx[i][j])cout<<xx[i][j];}else{if(xx[i][j]>0&&(xx[i][j-1]==0))cout<<xx[i][j]<<'k'<<(j);elseif(xx[i][j]>0&&xx[i][j-1]!=0)cout<<'+'<<xx[i][j]<<'k'<<(j);else if(xx[i][j]<0)cout<<xx[i][j]<<'k'<<(j); }}}else cout<<'x'<<(i+1)<<'='<<'k'<<(i+1-ra);cout<<endl;}cout << ra << endl;}void danjie(int n,double a[][10000],double x[]) {int i,j;for (i=n-1; i>=0; i--){if(i==n-1) x[i]=a[i][n]/a[i][i];elsefor(j=n-1; j>i; j--){a[i][n]=a[i][n]-x[j]*a[i][j];}x[i]=a[i][n]/a[i][i];}}运行实例(1) 2X1-X2+3X3+2X4=63X1-3X2+3X3+2X4=53X1-X2-X3+2X4=33X1-X2+X3-X4=4唯一解X1=1,X2=1,X3=1,X4=1(2)X1+X4=40X2+X5=20X3+X6=10X1+X2+X3=45X4+X5+X6=25无穷多解X1=15+X5+X6,X2=20-X5,X3=10-X6,X4=25+X5+X6,X5=X5,X6=.(3) X1+2X2=5X1+X2=42X1+X2=3无解。
六、错误、原因及解决办法七、收获及体会(1)识别对象,明确对象的功能,在解决问题过程中是基本的。
在此次研究的问题中,对象就是线性方程组以及高斯消元法,只有明确了高斯消元法的功能原理,以及线性方程组的基本性质,才能进行程序的基本设想与编写。
(2)对象的方法就是一个函数,与普通函数的抽象区别不大,同样是一个IPO,需要限定其功能,给一个能反映其功能的名称,确定它需要的数据、返回的数据。
对对象的方法而言,除了调用它的对象自身的属性数据外,完成功能需要的数据必须通过参数进行传递。
(3)更加深刻的理解了高斯消元法解线性方程组的思路与原理。
对编程软件的运用更加纯熟,在团队合作过程中大家集思广益,各抒己见,为程序的成功编写做出了贡献,也让大家理解了团队合作与互帮互助的重要性。
八、同类问题或拓展问题高斯消元法求矩阵的逆,伴随矩阵十、程序完整代码#include<iostream>#include<cstdio>using namespace std;void danjie(int n,double a[][10000],double x[]);int panding(int m,int n,double a[][10000]);int r(int m,int n,double c[][10000]);int main(){int i,j,k;int m,n;cout << "请输入方程组个数m和未知数个数n:" ;cin >>m>>n;double a[m][10000];double x[n];cout<<"请输入对应方程的增广矩阵:"<<endl;for(int i=0; i<=m-1; i++){for(j=0; j<=n; j++)cin>>a[i][j];}double m1,m2;int b=0;for( i=0; i<=n-1&&i<m; i++ ){if(a[i][i]!=0){m1=a[i][i];for( j=i+1; j<=m-1; j++){m2=a[j][i];for( k=0; k<=n; k++ ){a[j][k]=a[j][k]-a[i][k]*m2/m1;}}}else if(a[i][i]==0){for( j=i+1; j<=m-1; j++){if(a[j][i]!=0){for(k=0; k<=n; k++)//交换i,j两行使a[i][i]!=0{b=a[i][k];a[i][k]=a[j][k];a[j][k]=b;}break;}}m1=a[i][i];for( j=i+1; j<=m-1; j++){m2=a[j][i];for( k=0; k<=n; k++ ){a[j][k]=a[j][k]-a[i][k]*m2/m1;}}}} //此时已化为阶梯形矩阵,下面求秩,调用一个函数进行列交换,求秩int ra=r(m,n,a);for( i=0; i<=m-1; i++){for(j=0; j<=n; j++)cout <<a[i][j]<<' ';cout <<endl;}if(ra==0)cout<<"无解"<<endl;if(ra==n)//有唯一解{cout<<"唯一解"<<endl;danjie(n,a,x);for(i=0; i<n; i++)cout<<'x'<<(i)<<'='<<(x[i])<<endl; }else if(ra<n&&ra!=0){cout<<"无穷多解"<<endl;int ra=r(m,n,a);double b[ra][n-ra+1];double xx[ra][n-ra+1];for(i=0; i<ra; i++){for(k=0; k<n-ra+1; k++){b[i][k]=a[i][k+ra];}for(i=0; i<ra; i++){a[i][ra]=b[i][n-ra];}danjie(ra,a,x);for(i=0; i<ra; i++){xx[i][0]=x[i];}for(j=1; j<=n-ra; j++){for(i=0; i<ra; i++){a[i][ra]=0;a[i][ra]=a[i][ra]-b[i][j-1];}danjie(ra,a,x);for(i=0; i<ra; i++){xx[i][j]=x[i];}for(i=0; i<n; i++){if(i<ra){cout<<'x'<<(i+1)<<'=';for(j=0; j<=n-ra; j++){if(j==0){if(xx[i][j])cout<<xx[i][j];}else{if(xx[i][j]>0&&(xx[i][j-1]==0))cout<<xx[i][j]<<'k'<<(j);elseif(xx[i][j]>0&&xx[i][j-1]!=0)cout<<'+'<<xx[i][j]<<'k'<<(j);elseif(xx[i][j]<0)cout<<xx[i][j]<<'k'<<(j);}}}else cout<<'x'<<(i+1)<<'='<<'k'<<(i+1-ra);cout<<endl;}}cout << ra << endl;}void danjie(int n,double a[][10000],double x[]){int i,j;for (i=n-1; i>=0; i--){if(i==n-1) x[i]=a[i][n]/a[i][i];elsefor(j=n-1; j>i; j--){a[i][n]=a[i][n]-x[j]*a[i][j];}x[i]=a[i][n]/a[i][i];}}int r(int m,int n,double c[][10000]){int i,j,k,b,e=0,f,x;double temp;double m1,m2;/* for(i=0; i<m-1; i++){if(c[i][i]==0)//如果化为阶梯型矩阵后a[i][i]仍为0,交换列{for( j=i+1; j<=n-1; j++){if(c[i][j]!=0){for(k=i; k<=m-1; k++)//交换i,j两列使a[i][i]!=0{temp=c[k][j];c[k][j]=c[k][i];c[k][i]=temp;}break;}}for(j=i; j<=m-1; j++){m1=c[i][i];m2=c[j][i];for(k=i+1; k<=n; k++ ) c[j][k]=c[j][k]*m1-c[i][k]*m2;}}}*/for(i=0; i<m; i++){b=0;for(j=0; j<n; j++){b=b+c[i][j];if (b!=0 ){e++;break;}}}for(i=0; i<m; i++){b=0;f=0;for(j=0; j<n; j++){b=b+c[i][j];if(b!=0 ) f=1;}if(f== 0 && c[i][n]!=0)//若系数全为0,非齐次项不为0;{return 0;x=1;break;}}if(x!=1)return e; }。