高斯消元

用于求解如下的方程组:

{i=1nxia1,i=b1i=1nxia2,i=b2i=1nxiam,i=bm\begin{cases}\sum_{i=1}^nx_ia_{1,i}=b_1\\\sum_{i=1}^nx_ia_{2,i}=b_2\\……\\\sum_{i=1}^nx_ia_{m,i}=b_m\end{cases}

时间复杂度 O(n2m)O(n^2m)

epseps 为精度。

int n,m;
double a[N][N],b[N],eps=1e-8;
int Gauss()
{
	int ans=1;
	for(int i=1;i<=n;i++){
		for(int j=i;j<=m;j++)
			if(fabs(a[j][i])>eps){
				for(int k=1;k<=n;k++)
					swap(a[i][k],a[j][k]);
				swap(b[i],b[j]);
			}
		if(fabs(a[i][i])>eps){
			for(int j=1;j<=m;j++){
				if(i==j)
					continue;
				double rate=a[j][i]/a[i][i];
				for(int k=i;k<=n;k++)
					a[j][k]-=a[i][k]*rate;
				b[j]-=b[i]*rate;
			}
			b[i]/=a[i][i];
			for(int j=n;j;j--)
				a[i][j]/=a[i][i];
		}
	}
	for(int i=1;i<=m;i++){
		bool f=1;
		for(int j=1;j<=n;j++)
			if(fabs(a[i][j])>eps)
				f=0;
		if(f)
			if(fabs(b[i])>eps)
				return -1;
			else
				ans=0;
	}
	return ans;
}

运行完后,Guass()\text{Guass()} 的返回值有以下三种可能:

  • Guass()=1\text{Guass()}=1:有唯一解。
  • Guass()=0\text{Guass()}=0:有多解。
  • Guass()=1\text{Guass()}=-1:无解。

若有唯一解,则解 xix_ibib_i 中。

posted @ 2021-08-22 01:30  luckydrawbox  阅读(11)  评论(0)    收藏  举报  来源