天天看點

高斯消元。

​​傳送門​​​ 高斯消元:用模拟的方式來實作對多個方程組的求解。

高斯消元可分為兩個步驟:化簡和回代

化簡:

将方程組組成一個增廣矩陣,并将其化為行階梯矩陣。

int Gauss()
{
  for(int c = 1; c <= n; c++)
  {
    int f = c;
    for(int r = c; r <= n; r++)
    {
      if(fabs(a[f][c]) < fabs(a[r][c]))
      {
        f = r;
      }
    }
    for(int i = 1; i <= n+1; i++)
    {
      swap(a[c][i],a[f][i]);
    }

    for(int i = c+1; i <= n+1; i++)
    {
      if(fabs(a[c][c]) <= eps)
      {
        cout<<"No Solution";
        return 0;
      }
      a[c][i] = a[c][i]/a[c][c];
    }
    a[c][c] = 1;

    for(int r = c+1; r <= n; r++)
    {
      for(int i = c+1; i <= n+1; i++)
      {
        a[r][i] = a[r][i]-a[r][c]*a[c][i];
      }
      a[r][c] = 0;
    }
  }
}      

回代:

int solve()
{
  int f = 0;
  for(int i = 1; i <= n+1; i++)if(a[n][i])f = 1;
  if(!f)return 0;
  for(int i = n; i >= 1; i--)
  {
    double sum = 0;
    for(int j = i+1; j <= n; j++)
    sum += a[i][j]*ans[j];
    if(fabs(a[i][i]) <= eps)
    return 0;
    ans[i] = (a[i][n+1]-sum)/a[i][i];
  }
  return 1;
}      
#include<iostream>
#include<string>
#include<map>
#include<iomanip>
#include<bits/stdc++.h>
#include<algorithm>
#define ll long long
#define endl '\n'
using namespace std;
const double eps = 0.0000001;
int n;
double a[110][110];
double ans[110];

int Gauss()
{
  int free = 0;
  for(int c = 1; c <= n; c++)
  {
    /*交換*/
    int f = c;
    for(int r = c; r <= n; r++)
    {
      if(fabs(a[f][c]) < fabs(a[r][c]))
      {
        f = r;
      }
    }
    
    
    for(int i = 1; i <= n+1; i++)
    {
      swap(a[c][i],a[f][i]);
    }

    for(int i = c+1; i <= n+1; i++)
    {
      if(fabs(a[c][c]) <= eps)
      {
        cout<<"No Solution";
        return 0;
      }
      a[c][i] = a[c][i]/a[c][c];
    }
    a[c][c] = 1;

    for(int r = c+1; r <= n; r++)
    {
      for(int i = c+1; i <= n+1; i++)
      {
        a[r][i] = a[r][i]-a[r][c]*a[c][i];
      }
      a[r][c] = 0;
    }
  }
}
int solve()
{
  int f = 0;
  for(int i = 1; i <= n+1; i++)if(a[n][i])f = 1;
  if(!f)return 0;
  for(int i = n; i >= 1; i--)
  {
    double sum = 0;
    for(int j = i+1; j <= n; j++)
    sum += a[i][j]*ans[j];
    if(fabs(a[i][i]) <= eps)
    return 0;
    ans[i] = (a[i][n+1]-sum)/a[i][i];
  }
  return 1;
}
int main()
{
  cin>>n;
  for(int i = 1; i <= n;i++)
  {
    for(int j = 1; j <= n+1; j++)
    {
      cin>>a[i][j];
    }
  }
  int f = Guess();
  if(!f)return 0;

  int fl = solve();
  if(!fl)
  {
    printf("No Solution");
    return 0;
  }
  for(int i = 1; i <= n; i++)
  {
    printf("%.2lf\n",ans[i]);
  }
  
}      

繼續閱讀