其他分享
首页 > 其他分享> > 高斯约旦消元法

高斯约旦消元法

作者:互联网

用来求解n元一次线性方程组

核心思想:

把方程组塞到一个矩阵里得到一个\(n*n+1\)的矩阵,第\(i\)行表示第\(i\)个方程,\(Mat[i][j]\)表示第\(i\)个方程中\(xj\)的系数 \(Mat[i][n+1]\)为一个常数,即等号右面的常数

把\(xi\)的系数都集中于第\(i\)行(对角线上),\(xi\)为当前选择的主元,然后用方程\(i\)把其他方程中的\(xi\)都消掉,可得到每行都是\(ki*xi = y\)的矩阵,显然\(xi=y/ki\)

void work(){
     n=read();
     for(int i=1;i<=n;++i){
		 for(int j=1;j<=n+1;++j){
			 Mat[i][j]=read();
		 }
	 }
	 for(int i=1;i<=n;++i){//枚举项xi
	     double maxx=Mat[i][i];
		 int tmp=i;
		 //x1--xi-1 的系数都在方程i上,其他方程该项系数为0,如果用方程1--i-1来消元会引入x1--xi-1,所以从i开始找
		 for(int j=i+1;j<=n;++j){//选出该列最大系数可以保证误差最小
			 if(fabs(Mat[j][i])>fabs(maxx)){
                maxx=Mat[j][i];tmp=j;
			 }
		 }
         for(int j=1;j<=n+1;++j){
			 swap(Mat[i][j],Mat[tmp][j]);//把方程i和方程tmp整个交换,使得系数集中在对角线上
		 }
		 if(Mat[i][i]==0){//多解
			 puts("No Solution");return;
		 }
		 //把除了Mat[i][i] 其他方程xi的系数都消掉
		 for(int j=1;j<=n;++j){
			 if(j==i)continue;
			 double x=Mat[j][i]/Mat[i][i];
			 for(int k=i+1;k<=n+1;++k){
				 Mat[j][k]-=Mat[i][k]*x;
			 }
		 }
	 }
	 for(int i=1;i<=n;++i){
         double ans=Mat[i][n+1]/Mat[i][i];
		 printf("%.2lf\n",ans);
	 }
}

标签:方程,xi,Mat,int,矩阵,maxx,约旦,元法,高斯
来源: https://www.cnblogs.com/Chano/p/16265414.html