G23 线性方程组 高斯消元法

视频链接:G23 线性方程组 高斯消元法_哔哩哔哩_bilibili

 

 

 

 

Luogu P3389 【模板】高斯消元法

#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;

const int N = 110;
const double eps = 1e-6;
int n;
double a[N][N]; //增广矩阵

int gauss(){
  for(int i=1; i<=n; ++i){    //第i主元
    for(int k=i; k<=n; ++k)   //换非0行
      if(fabs(a[k][i])>eps)
        {swap(a[k],a[i]); break;}
    if(fabs(a[i][i])<eps) return 0;
    
    for(int j=n+1; j>=i; j--) //变1 
      a[i][j] /= a[i][i]; 
    for(int k=i+1; k<=n; k++) //变0
      for(int j=n+1; j>=i; j--) 
        a[k][j]-=a[k][i]*a[i][j];
  }
  for(int i=n-1; i>=1; i--)   //回代
    for(int j=i+1; j<=n; j++)
      a[i][n+1]-=a[i][j]*a[j][n+1]; 
  return 1;             //存在唯一解
}
int main(){
  scanf("%d",&n);
  for(int i=1; i<=n; i++)
    for(int j=1; j<=n+1; j++) 
      scanf("%lf",&a[i][j]);
  if(gauss()) 
    for(int i=1; i<n+1; i++) 
      printf("%.2lf\n", a[i][n+1]);
  else puts("No Solution");
  return 0;
}
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;

const int N=110;
const double eps=1e-6;
int n;
double a[N][N]; //增广矩阵

bool Gauss_Jordan(){
  for(int i=1; i<=n; ++i){    //第i主元
    for(int k=i; k<=n; ++k)   //换非0行
      if(fabs(a[k][i])>eps)
        {swap(a[k],a[i]); break;}
    if(fabs(a[i][i])<eps) return 0;
    
    for(int k=1; k<=n; ++k){  //对角化
      if(k==i) continue;
      for(int j=n+1; j>=i; --j) 
        a[k][j]-=a[k][i]/a[i][i]*a[i][j];
    }
  }
  for(int i=1; i<=n; ++i) 
    a[i][n+1]/=a[i][i];     //除以主元
  return 1;                 //存在唯一解
}
int main(){
  scanf("%d",&n);
  for(int i=1; i<=n; i++)
    for(int j=1; j<=n+1; j++) 
      scanf("%lf",&a[i][j]);
  if(Gauss_Jordan()) 
    for(int i=1; i<=n; i++) 
      printf("%.2lf\n",a[i][n+1]);
  else puts("No Solution");
}

 

#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;

const int N=110;
const double eps=1e-6;
int n;
double a[N][N]; //增广矩阵

int gauss(){
  int c,r;//当前列,当前行 
  for(c=r=0; c<n; c++){
    //1.找到c列的最大行t
    int t=r; 
    for(int i=r; i<n; i++)
      if(fabs(a[i][c])>fabs(a[t][c])) t=i;
    if(fabs(a[t][c])<eps) continue; //c列已0化
    
    //2.把最大行换到上面 
    for(int i=c; i<n+1; i++)swap(a[t][i],a[r][i]);
    
    //3.把当前行r的第一个数,变成1   
    for(int i=n; i>=c; i--)a[r][i]/=a[r][c];
    
    //4.把当前列c下面的所有数,全部消成0    
    for(int i=r+1; i<n; i++)
      if(fabs(a[i][c])>eps)
        for(int j=n; j>=c; j--)
          a[i][j]-=a[i][c]*a[r][j];
    r++; //这一行的工作做完,换下一行 
  }
  if(r<n){ //说明已经提前变成梯形矩阵
    for(int i=r; i<n; i++) 
      if(fabs(a[i][n])>eps) //a[i][n]==bi 
        return 2; //左边=0,右边≠0,无解
    return 1; //0==0,无穷多解 
  }
  //5.唯一解,从下往上回代,得到方程的解
  for(int i=n-1; i>=0; i--) 
    for(int j=i+1; j<n; j++)
      a[i][n]-=a[i][j]*a[j][n];
  return 0;
}
int main(){
  cin >> n;
  for(int i=0; i<n; i++)
    for(int j=0; j<=n; j++)
      cin >> a[i][j];
  int t=gauss();
  if(t) puts("No Solution");
  else for(int i=0; i<n; i++) 
        printf("%.2lf\n",a[i][n]);
}

 

posted @ 2022-10-05 21:31  董晓  阅读(569)  评论(1编辑  收藏  举报