高斯消元——约旦消元法

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

以上是关于高斯消元——约旦消元法的主要内容,如果未能解决你的问题,请参考以下文章

高斯消元——约旦消元法

高斯-约旦消元法

模板 - 高斯约旦消元法

高斯约旦消元法

模板高斯(约旦)消元

高斯消元法