高斯消元 [模板]

高斯消元

简介

高斯消元是用来解线性方程组的一种 O(N3)O(N^3) 算法.

基本步骤

  1. 按顺序枚举 未知数 xx, 在 没有使用过的方程 中选出 xx 系数最大的方程. (为了减少误差)
  2. 将其移动到 ii 行.
  3. 将该方程 系数化一
  4. 使用该方程对 没有使用过的方程 进行消元.
  5. 最后得到 上三角矩阵, 将最后一个 未知数 回带即可解出所有 未知数 .

模板 高斯消元

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
"); 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
", A[i][N+1]);
        return 0;
}


原文地址:https://www.cnblogs.com/zbr162/p/11822621.html