高斯消元法求解线性方程组

文章提供了一个C++程序,该程序实现了高斯消元法来解决线性方程组。首先,程序要求用户输入线性方程的系数和常数矩阵,然后通过选列主元和行变换将增广矩阵转化为行阶梯形矩阵。如果出现主元为零或矩阵奇异的情况,程序会提示无解。最后,通过回代法求解未知数。程序包括了多个测试用例展示其运行过程。
摘要由CSDN通过智能技术生成

假设系数矩阵的维数为A(n,n),常数矩阵的维数为b(n,1),增广矩阵的维数为A_b(n,n+1)

   1、选列主元:对系数矩阵主对角线上的每一个元素aii,找到该元素所在列中对角线以下(包括aii)所有元素中的最大值,将aii所在行与最大元素所对应行交换,完成选列主元

2、求比值、初等变换:1e-10,当abs(aii)<eps时,在计算机中就认为aii==0,当abs(aii)>=eps时,即aii!=0,mki=-(aki/aii),k=i+1,…,n,然后对第k行做如下计算,akj=akj+mki*aij,k=i+1,…,n;j=i+1,

…,n+1。

   3、经过第二部计算之后,增广矩阵变成一个行阶梯形矩阵,记变换之后的增广矩阵为L,则有Lx=b。从L的第n行开始,回代求解即可。

#include<bits/stdc++.h>
#define maxn 1000+10
#define eps 1e-10
using namespace std;

double A[maxn][maxn],b[maxn],A_b[maxn][maxn],X[maxn];//A表示系数矩阵,b表示常数矩阵,A_b表示增广矩阵,X表示未知数矩阵 
int n;//线性方程个数 

int main(){
cout<<"Please enter the number of unknown numbers:"<<endl;
	cin>>n;
cout<<"Please enter a coefficient matrix and a constant matrix:"<<endl;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			cin>>A[i][j];
			A_b[i][j]=A[i][j];
		}
		cin>>b[i];
		A_b[i][n+1]=b[i];
	}
	for(int k=1;k<n;k++){//k控制n-1个主元
		int maxx=abs(A_b[k][k]);
		int row=k;
		for(int i=k+1;i<=n;i++){//i控制行
			if(maxx<abs(A_b[i][k])){
				maxx=abs(A_b[i][k]);
				row=i;
			}
		}
		if(abs(maxx)<=eps){
			cout<<"该方程无解"<<endl;
			return 0;
		}
		for(int j=k;j<=n+1;j++){//j控制列 
			double term=A_b[k][j];
			A_b[k][j]=A_b[row][j];
			A_b[row][j]=term;
		}
		for(int t=k+1;t<=n;t++){//t控制k+1行->n行 
			double m=A_b[t][k]/A_b[k][k];
			for(int j=k;j<=n+1;j++){//j控制第t行的每一列 
				A_b[t][j]-=m*A_b[k][j];
			}
		}
		//输出第k次变换之后增广矩阵的状态 
cout<<"Output the state of the augmented matrix after the "<<k<<"-th transformation:"<<endl;
		for(int i=1;i<=n;i++){
			for(int j=1;j<=n+1;j++){
				printf("%-10lf",A_b[i][j]);
			}
			cout<<endl;
		}
	}
	double sum=1;
	for(int i=1;i<=n;i++){
		sum*=A_b[i][i];
	}
	if(abs(sum)<=eps){
		cout<<"该方程组无解"<<endl;
		return 0;
	}
	//回代 
	for(int i=n;i>=1;i--){
		sum=0;
		for(int j=n;j>=i+1;j--){
			sum+=A_b[i][j]*X[j];
		}
		X[i]=(A_b[i][n+1]-sum)/A_b[i][i];
	}
	cout<<"The solution of this equation is:"<<endl;
	for(int i=1;i<=n;i++){
		cout<<"x"<<i<<"="<<X[i]<<endl;
	}
	return 0;
}

测试用例1:

x1-x2+2x3-x4=-8

2x1-2x2+3x3-3x4=-20

x1+x2+x3=-2

x1-x2+4x3+3x4=4

输入未知变量个数、系数矩阵和常数矩阵:

输出第k步消元后增广矩阵的状态:

输出该线性方程的解:

测试用例2:

2.0000x1-2.0000x2+3.0000x3-3.0000x4=-14

0.5000x1+2.0000x2-0.5000x3+1.5000x4=6

0.5000x1+2.5000x3+4.5000x4=4

0.5000x1+0.2000x3-0.4000x4=4

输入未知变量个数、系数矩阵和常数矩阵:

输出第k步消元后增广矩阵的状态:

输出该线性方程的解:

测试用例3:

0.00000008x1+2x2+3x3=1

-1x1+3.712x2+4.623x3=2

-2x1+1.072x2+5.643x3=3

输入未知变量个数、系数矩阵和常数矩阵:

输出第k步消元后增广矩阵的状态:

输出该线性方程的解:

测试用例4:

0.000000000012x1+0.000000000089x2+0.000000000065x3=2

0.000000000008x1+0.000000000007x2+0.000000000025x3=8

0.000000000010x1+0.000000000018x2+0.000000000096x3=6

输入未知变量个数、系数矩阵和常数矩阵:

发现该方程无解

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值