高斯消元——约旦消元法
Posted zero_orez6
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了高斯消元——约旦消元法相关的知识,希望对你有一定的参考价值。
前言
约旦消元法相较于普通方法,主要区别于约旦消元法处理后可以得到一个单位矩阵,但缺点在于不能够判断无解和无数解的情况。
code
#include<bits/stdc++.h>
#define db double
using namespace std;
typedef long long LL;
const int N=120;
const db eqs=1e-8;
int n;
db a[N][N];
int main()
freopen("Gauss.in","r",stdin);
freopen("Gauss.out","w",stdout);
cin>>n;
for(int i=1;i<=n;i++)
for(int j=1;j<=n+1;j++)
cin>>a[i][j];
for(int i=1;i<=n;i++)
// for(int j=1;j<=n;j++)
//
// for(int k=1;k<=n+1;k++) cout<<a[j][k]<<" ";
// cout<<endl;
//
int r=i;
for(int j=i;j<=n;j++) if(fabs(a[j][i]-a[r][i])>=eqs) r=j;
for(int j=1;j<=n+1;j++) swap(a[i][j],a[r][j]);
if(fabs(a[i][i])<=eqs)
puts("No Solution");
return 0;
for(int j=1+n;j>=i;j--) a[i][j]/=a[i][i];
for(int j=1;j<=n;j++)
for(int k=n+1;k>=i;k--)
if(i!=j)
a[j][k]-=a[j][i]*a[i][k];
// for(int j=1;j<=n;j++)
//
// for(int k=1;k<=n+1;k++) cout<<a[j][k]<<" ";
// cout<<endl;
//
for(int i=1;i<=n;i++)
printf("%.2lf\\n",a[i][n+1]);
return 0;
模拟过程
input
3
2 5 3 38
1 3 2 23
3 8 1 49
过程
2 5 3 38
1 3 2 23
3 8 1 49
----------------------
1 2.66667 0.333333 16.3333
0 0.333333 1.66667 6.66667
0 -0.333333 2.33333 5.33333
----------------------
1 0 19 59
0 1 -7 -16
0 0 4 12
----------------------
1 0 0 2
0 1 0 5
0 0 1 3
2.00
5.00
3.00
以上是关于高斯消元——约旦消元法的主要内容,如果未能解决你的问题,请参考以下文章