Gauss elimination

Posted by unbreakable9 on Sun, 03 Nov 2019 06:12:43 +0100

Gauss elimination Gauss elimination

brief introduction

Gauss elimination is an O (N3) O (N3) O (N3) O (N3) algorithm for solving linear equations

Basic steps

  1. Enumerate the unknown number XXX in order, and select the equation with the largest coefficient xxx from the unused equation
  2. Move it to line iii
  3. Coefficient the equation into one
  4. Use this equation to eliminate the unused equation
  5. The upper triangular matrix is obtained, and all unknowns can be solved by bringing back the last unknowns

Template Gauss elimination

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[j][i]) > fabs(A[max_id][i])) 
                                max_id = j;
                if(fabs(A[max_id][i]) < 1e-14){ printf("No Solution"); return 0; } 
                for(reg int j = 1; j <= N+1; j ++) std::swap(A[i][j], A[max_id][j]);
                double tmp = A[i][i];
                for(reg int j = 1; j <= N+1; j ++) A[i][j] /= tmp; //Coefficient one
                for(reg int j = i+1; j <= N; j ++){
                        tmp = A[j][i];  // x of other lines
                        for(reg int k = 1; k <= N+1; k ++)
                                A[j][k] -= A[i][k] * tmp; // Elimination
                }
                Ans[N] = A[N][N+1];
                for(reg int i = N-1; i >= 1; i --){
                        Ans[i] = A[i][N+1];
                        for(reg int j = i+1; j <= N; j ++)
                                Ans[i] -= Ans[j] * A[i][j];
                }
        }
        for(reg int i = 1; i <= N; i ++)
                printf("%.2lf\n", Ans[i]);
        return 0;
}