这里介绍的是高斯-约旦消元法。
相对于传统的高斯消元,约旦消元法的精度更高、代码更简单,没有回带的过程。
约旦消元法大致思路如下:
- 选择一个尚未被选过的未知数作为主元,选择一个包含这个主元的方程。
- 将这个方程主元的系数化为 1。
- 通过加减消元,消掉其它方程中的这个未知数。
- 重复以上步骤,直到把每一行都变成只有一项有系数。
我们用矩阵表示每一项系数以及结果。
代码如下:
#include<bits/stdc++.h>
using namespace std;
namespace _yz
{
typedef double db;
const int N=100+10;
const db eps=0.000001;
int n; char ERR[]="No Solution";
db p[N][N];
void main()
{
scanf("%d",&n);
for(int i=1;i<=n;i++)
for(int j=1;j<=n+1;j++)
scanf("%lf",&p[i][j]);
for(int i=1;i<=n;i++)
{
int maxn=i;
for(int j=i;j<=n;j++)
{
if(fabs(p[j][i])<fabs(p[maxn][i]))
continue;
maxn=j;
}
for(int j=1;j<=n+1;j++)
swap(p[i][j],p[maxn][j]);
if(fabs(p[i][i])<=eps)
{
printf("%s\n",ERR);
return;
}
//当前的那一列可以不用管,因为对后面的消元没影响
for(int j=i+1;j<=n+1;j++)
p[i][j]/=p[i][i];
for(int j=1;j<=n;j++)
{
if(i==j) continue;
for(int k=i+1;k<=n+1;k++)
p[j][k]-=p[j][i]*p[i][k];
}
}
for(int i=1;i<=n;i++) printf("%.2lf\n",p[i][n+1]);
return;
}
}
int main()
{
_yz::main();
return 0;
}
本文作者:Yurchiu
本文链接:https://yz-hs.github.io/5127f3a117e4/
版权声明:本博客中所有原创文章除特别声明外,均允许规范转载,转载请注明出处。所有非原创文章,按照原作者要求转载。