【数论】——高斯列主元消元法
作者:互联网
【数论】——高斯列主元消元法
文章目录
初等行变换
- 将某一行乘以一个非零数
- 交换某两行
- 将某一行的k倍加到另一行
消元思路
- 从左往右,找到第一列系数中,绝对值最大系数所在行
- 将该行每一个系数除以该行第一个非零系数
- 将该行后的所有行的该元素消去
- 重复1-3操作直到最后一行
- 从最后一行向上一次求出对应 x i x_i xi的值
代码
#include <algorithm>
#include <cmath>
#include <cstring>
using namespace std;
const int N = 110;
const double eps = 1e-6;
int n;
double g[N][N];
int gauss_solve() // 答案存在g[i][n]中,0 <= i < n
{
int c, k = 0;
for (c = 0;c < n; c++) {
int t = k;
for (int i = k; i < n; i++) // 找绝对值最大的行
if (fabs(g[i][c]) > fabs(g[t][c]))
t = i;
if (fabs(g[t][c]) < eps)//如果为0跳过
continue;
for (int i = c; i <= n; i++)
swap(g[t][i], g[k][i]); // 将绝对值换到最大的未处理的最顶端
for (int i = n; i >= c; i--)
g[k][i] /= g[k][c]; // 将当前行的首位变成1
for (int i = k + 1; i < n; i++) // 用当前行将下面所有的列消成0
if (fabs(g[i][c]) > eps)
for (int j = n; j >= c; j--)
g[i][j] -= g[k][j] * g[i][c];
k++;
}
if (k < n) {
for (int i = k; i < n; i++)
if (fabs(g[i][n]) > eps)
return 2; // 无解
return 1; // 有无穷多组解
}
for (int i = n - 1; i >= 0; i--)
for (int j = i + 1; j < n; j++)
g[i][n] -= g[i][j] * g[j][n];
return 0; // 有唯一解
}
int main()
{
scanf("%d", &n);
for (int i = 0; i < n; i++)
for (int j = 0; j < n + 1; j++)
scanf("%lf", &g[i][j]);
int t = gauss();
if (t == 2)
puts("No solution");
else if (t == 1)
puts("Infinite group solutions");
else {
for (int i = 0; i < n; i++) {
if (fabs(g[i][n]) < eps)
g[i][n] = 0; // 去掉输出 -0.00 的情况
printf("%.2lf\n", g[i][n]);
}
}
return 0;
}
标签:return,高斯,fabs,列主元消,int,eps,++,include,元法 来源: https://blog.csdn.net/GXT020507/article/details/122794025