思想
将矩阵化为上三角后从下向上求出每个解
步骤
1. 每次找到最大系数行(减小误差)
1 -8/7 10/7 3
4 -5 6 12
1 -2 3 6
2. 将该系数化为1
1 -8/7 10/7 3
4 -5 6 12
1 -2 3 6
3. 将后面行该列系数化为0
1 -8/7 10/7 3
0 -3/7 2/7 0
0 -6/7 11/7 3
4. 经过 n n n 此操作矩阵化为一个上三角,从 n n n 行回代求解每个未知数
代码
#include<bits/stdc++.h>
#define DB double
#define eps 1e-8
using namespace std;
const int N=109;
int n;
DB a[N][N],ans[N];
bool Gauss()
{
for(int col=1;col<=n;col++) //将矩阵化为上三角
{
int k=col;
for(int row=col+1;row<=n;row++)
if(fabs(a[k][col])<fabs(a[row][col])) //找最大减小误差
k=row;
if(fabs(a[k][col])<eps) return 0; //多解
if(k!=col) swap(a[col],a[k]);
DB temp=a[col][col];
for(int i=col;i<=n+1;i++) //将a[col][col]系数变为1
a[col][i]/=temp;
for(int row=col+1;row<=n;row++) //对下面每一行col列系数变为0
{
temp=a[row][col];
for(int j=col;j<=n+1;j++)
a[row][j]-=a[col][j]*temp;
}
}
for(int row=n;row>=1;row--) //从下向上求出每个解
{
ans[row]=a[row][n+1];
for(int col=n;col>row;col--)
ans[row]-=a[row][col]*ans[col];
}
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];
if(!Gauss()) cout<<"No Solution\n";
else for(int i=1;i<=n;i++) printf("%.2lf\n",ans[i]);
return 0;
}