高斯消元

学了几天,不会线代的我终于学会了高斯消元。

 

其实高斯消元只两步:

第一步:转化为上三角矩阵。通过加减消元实现( i 从 1 到 N 遍历,把第 j (j  > i )行的 xi 消掉)

第二步:从底向上代入。

 

需要注意的是判断多解和无解的情况,还有减小误差的方法。

int gauss(){
	int r;
	for(int i=1;i<=N;i++){
		r=i;
		for(int j=i+1;j<=M;j++)
			if(fabs(a[j][i])>fabs(a[r][i]))//减小误差
				r=j;
		if(r!=i)
			for(int j=1;j<=N+1;j++)//错了好多次
				swap(a[r][j],a[i][j]);
		if(r==i&&fabs(a[i][i])<eps)
			return 2;//多解
		for(int j=i+1;j<=M;j++){
			for(int k=N+1;k>i;k--)
				a[j][k]-=(a[j][i]/a[i][i])*a[i][k];
			a[j][i]=0;
		}
	}
	for(int i=N;i<=M;i++){
		bool flag=0;
		for(int j=1;j<=N;j++)
			if(fabs(a[i][j])>eps){
				flag=1;
				break;
			}
		if((!flag)&&fabs(a[i][N+1])>eps)
			return 0;//无解
	}
	for(int i=N;i>=1;i--){
		for(int j=i+1;j<=N;j++)
			a[i][N+1]-=a[i][j]*a[j][N+1];
		a[i][N+1]/=a[i][i];
		a[i][i]=1;
	}
	return 1;
}
//N个未知数,M个等式

 

别的不说了,直接上板子,遇到题套进去就行了。

高斯消元还能用来解异或方程组,这个坑晚上填。

 

posted @ 2017-12-16 19:04  咸鱼lzh  阅读(214)  评论(0编辑  收藏  举报