高斯消元

高斯消元是解决线性方程组的方法。
线性方程组,就是n元一次方程组,
\(\left\{\begin{matrix} a_{11}*x_{1}+a_{12}*x_{2}+……+a_{1n}*x_{n}=b_{1} & & & & \\ a_{21}*x_{1}+a_{22}*x_{2}+……+a_{2n}*x_{n}=b_{2} & & & & \\ …… & & & & \\ a_{n1}*x_{1}+a_{n2}*x_{2}+……+a_{nn}*x_{n}=b_{n} & & & & \end{matrix}\right.\)
要如何去解,我们可以从二元一次方程组入手。
\(\left\{\begin{matrix} a_{11}*x_{1}+a_{12}*x_{2}=b_{1} \\ a_{21}*x_{1}+a_{22}*x_{2}=b_{2} \end{matrix}\right.\)
解这个方程只需要将下面这个式子减去上面这个式子乘上\((-a_{22}/a_{12})\),求出\(x_{1}\),在将\(x_{1}\)代入上面这个式子求出\(x_{2}\)就可以了
通过二元一次方程组的消元操作,可以发现需要解出n元一次方程组的第一步就是将这个方程组经过一些操作转换为
\(\left\{\begin{matrix} a_{11}^{`}*x_{1}+a_{12}^{`}*x_{2}+……+a_{1n}^{`}*x_{n}=b_{1}^{`} & & & & \\ a_{21}^{`}*x_{1}+a_{22}^{`}*x_{2}+……+0=b_{2}^{`} & & & & \\ a_{31}^{`}*x_{1}+a_{32}^{`}*x_{2}+……+0+0=b_{3}^{`} & & & & \\ …… & & & & \\ a_{n1}^{`}*x_{1}+0+……0+0=b_{n}^{`} & & & & \end{matrix}\right.\)
完成这步操作也不难,从第1行开始向下消元,第i行的消元就是将i+1行到n行的第n+1-i列数消成0。
下一步就是从最后一行开始,一元一次方程求解,每次求出的解还要代入方程组的其余方程中,最终求出\(x_{1}\)\(x_{n}\)的解。
无解的情况就是操作过程中的任意除数等于零的情况。
代码如下:

#include<iostream>
using namespace std;
int n;
double a[110][110],b[110];
double x[110];
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			cin>>a[i][j];
		}
		cin>>b[i];
	}
	for(int i=1;i<=n;i++){
		if(a[i][n+1-i]==0){
			int p=0;
			for(int j=i+1;j<=n;j++){
				if(a[j][n+1-i]!=0){
					p=1;
					for(int k=1;k<=n;k++){
						double t=a[i][k];
						a[i][k]=a[j][k];
						a[j][k]=t;
					}
					double t=b[i];
					b[i]=b[j];
					b[j]=t;
					break;
				}
			}
			if(p==0){
				cout<<"No Solution";
				return 0;
			}
		}
		for(int j=i+1;j<=n;j++){
			double t=a[j][n+1-i]/a[i][n+1-i];
			for(int k=1;k<=n;k++){
				a[j][k]-=t*a[i][k];
			}
			b[j]-=t*b[i];
		}
	}
	for(int i=1;i<=n;i++){
		if(a[n+1-i][i]==0){
			cout<<"No Solution";
			return 0;
		}
		x[i]=b[n+1-i]/a[n+1-i][i];
		for(int j=1;j<n+1-i;j++){
			b[j]-=a[j][i]*x[i];
		}
	}
	for(int i=1;i<=n;i++){
		printf("%.2lf\n",x[i]);
	}
	return 0;
}
posted @ 2022-04-13 22:15  zzzzzz2  阅读(91)  评论(0)    收藏  举报