高斯消元学习笔记

概述 & 用法

高斯消元就是一种解方程的方法

现在有个n个方程,n个未知数组成的方程组:
(a_{i,1}*x_1+a_{i,2}*x_1...+a_{i,n}*x_n=b_i)
.
.
.
然后我们把系数都拿出来组成一个 (n*(n+1)) 的矩阵
接下来就是消消消

具体方法:
按列消除,目标是矩阵中只剩下 (a_{i,i}) ,其余元素皆为0

枚举每一列 i

找到这列中最大的元素,将该行与第i行整体调换一下
然后将第i行所有元素除以 (a_{i,i}),使得 (a_{i,i}==1)
再将其余行每一行都减掉第i行乘一个常数,使得第i列除 (a_{i,i}) 外都为0
最后剩下的第 n+1 列就是每个未知数的值

代码

#define db double
db a[1001][1001];
void solve()
{
	for(int i=1;i<=n;i++)
	{
		int maxx=i;
		for(int j=i+1;j<=n;j++) if(a[j][i]>a[maxx][i]) maxx=j;
		for(int j=i;j<=n+1;j++) swap(a[i][j],a[maxx][j]);
		if(!a[i][i]) {
			cout<<"YZHX"<<endl;
		}
		for(int j=i+1;j<=n+1;j++) a[i][j]/=a[i][i];
		a[i][i]=1;
		for(re int j=1;j<=n;j++)
		{
			if(i==j) continue;
			int k=a[j][i]/a[i][i];
			for(re int p=i;p<=n+1;p++)
				a[j][p]=a[j][p]-a[i][p]*k;
		}
	}
	return ;
}
原文地址:https://www.cnblogs.com/yzhx/p/13162196.html