高斯消元 [模板]
简介
高斯消元是用来解线性方程组的一种 算法.
基本步骤
- 按顺序枚举 未知数 , 在 没有使用过的方程 中选出 系数最大的方程. (为了减少误差)
- 将其移动到 行.
- 将该方程 系数化一
- 使用该方程对 没有使用过的方程 进行消元.
- 最后得到 上三角矩阵, 将最后一个 未知数 回带即可解出所有 未知数 .
Code
#include<bits/stdc++.h>
#define reg register
const int maxn = 105;
int N;
double A[maxn][maxn];
double Ans[maxn];
int main(){
scanf("%d", &N);
for(reg int i = 1; i <= N; i ++)
for(reg int j = 1; j <= N+1; j ++)
scanf("%lf", &A[i][j]);
for(reg int i = 1; i <= N; i ++){
int max_id = i;
for(reg int j = i+1; j <= N; j ++)
if(fabs(A[max_id][i]) < fabs(A[j][i])) max_id = j;
if(fabs(A[max_id][i]) < 1e-14){ printf("No Solution\n"); return 0; }
std::swap(A[i], A[max_id]);
double tmp = A[i][i];
for(reg int j = i; j <= N+1; j ++) A[i][j] /= tmp;
for(reg int j = i+1; j <= N; j ++){
tmp = A[j][i];
for(reg int k = i; k <= N+1; k ++)
A[j][k] -= A[i][k] * tmp;
}
}
for(reg int i = N; i >= 1; i --)
for(reg int j = i+1; j <= N; j ++) A[i][N+1] -= A[i][j]*A[j][N+1];
for(reg int i = 1; i <= N; i ++) printf("%.2lf\n", A[i][N+1]);
return 0;
}