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

假设系数矩阵的维数为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
    评论
### 回答1: 高斯消元法是一种求解线性方程组的方法,可以使用Matlab进行实现。具体步骤如下: 1. 将线性方程组写成增广矩阵的形式,即将系数矩阵和常数向量合并成一个矩阵。 2. 对增广矩阵进行初等行变换,将其化为上三角矩阵。 3. 从最后一行开始,依次回代求解未知数。 Matlab中可以使用“\”运算符求解线性方程组,也可以使用“inv”函数求解矩阵,然后将逆矩阵与常数向量相乘得到解向量。但是,使用高斯消元法可以更加高效地求解线性方程组。 ### 回答2: 高斯消元法是一种常见的求解线性方程组的方法,它通过逐步将系数矩阵中的系数化为对角线上为1,其余为0的上三角形矩阵,再通过回代求解出未知数的值。 在MATLAB中,求解线性方程组可以使用\函数或者linsolve()函数。使用\函数时,只需将系数矩阵A和常数矩阵b输入,MATLAB会自动使用LU分解或者高斯消元法进行求解,并返回未知数的值。例如: A = [2 -3 1; 4 5 -2; -1 1 3]; b = [7; -8; 6]; x = A\b; 其中x为未知数向量,即x = [x1; x2; x3]。 如果需要手动使用高斯消元法进行求解,可以按照以下步骤操作: 1. 构造增广矩阵,将系数矩阵A和常数矩阵b合并为一个矩阵C。 C = [A, b]; 2. 逐步将矩阵C化为上三角形矩阵。 for j = 1:n-1 for i = j+1:n m = C(i,j)/C(j,j); C(i,j:n+1) = C(i,j:n+1) - m*C(j,j:n+1); end end 其中n为未知数个数。 3. 回代求解未知数的值。 x(n) = C(n,n+1)/C(n,n); for i = n-1:-1:1 x(i) = (C(i,n+1) - C(i,i+1:n)*x(i+1:n))/C(i,i); end 其中x为未知数向量。 使用高斯消元法进行求解需要注意以下问题: 1. 矩阵的主元不能为0,否则会出现除0错误。 2. 矩阵可能会出现行交换的情况,需要特别考虑。 ### 回答3: 高斯消元法是一种用于求解线性方程组算法,主要是通过矩阵变换将线性方程组化简为最简形式,从而得到其解(如果存在的话)。在 Matlab 中,可以使用“\”或者“inv()”函数来实现高斯消元法求解线性方程组。 一般来说,通过“\”函数可以非常简单地求解线性方程组,例如: A = [3 1 2; 2 4 7; 1 3 4]; b = [5; 10; 8]; x = A\b; 其中,A 表示一个 3*3 的系数矩阵,b 表示一个 3*1 的列向量,x 表示解向量。通过执行“x = A\b”语句,即可使用“\”函数求解得到 x 的值。如果想使用“inv()”函数进行求解,则可以使用如下代码: A = [3 1 2; 2 4 7; 1 3 4]; b = [5; 10; 8]; x = inv(A)*b; 但是需要注意的是,尽管在某些情形下使用“inv()”函数求解线性方程组是可行的,但是这种方式会导致性能下降,因为它需要计算矩阵的逆运算。相比之下,“\”函数呈现更好的性能,因此建议优先使用“\”函数进行求解。 如果需要进一步深入了解高斯消元法,可以阅读 Matlab 的文档并参考相关的数学书籍。总之,高斯消元法使用非常广泛,可以用于求解各种类型的线性方程组,具有较高的精度和稳定性,在 Matlab 中能够实现简单易用的求解

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值