1、算法思路
高斯消元法可用来为线性方程组求解。
具体是怎么做的和证明可以去搜索资料,我这里只整理代码的思路。
首先定义初等行列变换
- 把某一行的k倍加到另一行
- 把某一行扩大k倍
- 交换两行
下面来介绍算法思路
我们首先利用初等行列变换,矩阵进行变形(具体变化过程如下)
- 枚举每一列c
- 找到绝对值最大的一行
- 将该行换到最上面
- 将该行第一个数字变成1
- 将下面的所有行的第c列清成0
此时观察矩阵,如果是上三角矩阵,证明答案唯一
如果出现0=非零的行,则证明答案不存在(00000…0x)
如果出现0=0的行,则证明答案不唯一(000000…0)
2、模板代码
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cmath>
using namespace std;
const int N = 110;
const double eps = 1e-6;
double q[N][N];
int n;
int guess()
{
int r,c;
//步骤1
for(r = 0, c = 0; c < n; c ++)
{
int t = r;
//步骤2
for(int i = r; i < n; i ++)
{
if(fabs(q[i][c]) > fabs(q[t][c]))
{
t = i;
}
}
if(fabs(q[t][c]) <= eps) continue;
//步骤3
for(int i = c; i <= n; i ++)
{
swap(q[r][i],q[t][i]);
}
//步骤4
for(int i = n; i >= c; i --)
{
q[r][i] /= q[r][c];
}
//步骤5
for(int i = r + 1; i < n; i ++)
{
if(fabs(q[i][c]) <= eps) continue;
for(int j = n; j >= c; j --)
{
q[i][j] -= q[i][c] * q[r][j];
}
}
r ++;
}
//判断矩阵的类型,根据类型返回不同的数值
if(r < n)
{
for(int i = r; i < n; i ++)
{
if(fabs(q[i][n]) > eps) return 2;
}
return 1;
}
//唯一解
for (int i = n - 1; i >= 0; i -- )
for (int j = i + 1; j < n; j ++ )
q[i][n] -= q[j][n] * q[i][j];
return 0;
}