传送门
高斯消元:用模拟的方式来实现对多个方程组的求解。
高斯消元可分为两个步骤:化简和回代
化简:
将方程组组成一个增广矩阵,并将其化为行阶梯矩阵。
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;
}
ac代码:
#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]);
}
}