高斯消元解线性方程组
首先答案有三种情况:1、有唯一解
2、有无穷多解
3、无解
通过矩阵的行列变换变为一个上三角的时候。如果是一个完美的阶梯型(即可以依次通过上一个方程解得所有未知元)则有唯一解
如果有一个解有 0 = 非零的情况则无解。如果有0 = 0则有无穷多解
高斯消元步骤
1、枚举每一列c
找到绝对值最大的一行(方便后续直接用乘法来消除下面的所有元素)
2、交换到最上面一行(全部元素交换)
3、将下面所有元素变为0
4、再反推回去由下到上得到一个仅有对角线的矩阵
#include<iostream>
#include<cmath>
using namespace std;
const int N = 110;
double a[N][N];
const double eps = 1e-6;
int n;
void out()
{
for(int i = 0;i < n;i ++)
{
for(int j = 0;j <= n; j++)
cout<<a[i][j]<<" ";
puts("");
}
puts("");
}
int guoss()
{
int r,c;
for(c = 0,r = 0;c < n;c ++)
{
// out();
int t = r;//记录绝对值最大的一行
for(int i = r ; i< n;i ++)
if(fabs(a[i][c]) > fabs(a[t][c]))
t = i;
if(fabs(a[t][c]) < eps)continue;
for(int k = c;k <= n;k++)swap(a[t][k],a[r][k]);
for(int j = n; j >=c;j--)a[r][j] /=a[r][c];
/* for(int i = n;i >= 0;i--)
for(int j = r+1; j < n;j++)
a[j][i] -= a[r][i]*a[j][c];*/
for(int i = r + 1;i < n;i ++)
if(fabs(a[i][c]) > eps)
for(int j = n; j >= c ;j--)
a[i][j] -= a[r][j]*a[i][c];
r++;
}
if(r < n)
{
for(int j = r;j < n;j ++)
if(fabs(a[j][n]) > eps)return 2;//无解
return 1;//无穷多解
}
for(int i = n-1;i >=0;i--)
for(int j = i +1 ;j < n;j++)
a[i][n] -= a[i][j] * a[j][n];
return 0;
}
int main()
{
cin>>n;
for(int i = 0;i < n;i ++)
for(int j = 0; j < n + 1; j++)
cin>>a[i][j];
int k = guoss();
if(k == 0)
for(int i = 0 ;i <n;i++)printf("%.2lf\n",a[i][n]);
else if(k == 1)
puts("Infinite group solutions");
else
puts("No solution");
return 0;
}