数值计算方法(七)——两种消去法求解线性方程组

一、约当消去法

基本思想:
将矩阵转换成仅含主对角元素,且为1
算法步骤描述:
1.逐行进行遍历:
(1)归一化,保证该行主对角元素为1
(2)其他所有行进行消元,消去目前该行的对应主对角元素的那列的元素,注意操作右端向量b
2.最后得到的对角矩阵即为结果

代码实现:

/**
 *@name Jordan_elimination:约当消元
 *@param1 A:系数矩阵
 *@param2 b:右端向量
**/
void Jordan_elimination(double A[row_len][col_len],double b[row_len])
{
	for (int i=0;i<row_len;i++)
	{
		//对一行元素
		//首先进行归一化 A中元素
		double A_temp=A[i][i];
		for (int j=0;j<col_len;j++)
		{
			A[i][j]=A[i][j]/A_temp;
		}
		//归一化b中元素
		b[i]=b[i]/A_temp;

		//对其他行减去该行的归一化元
		for (int k=0;k<row_len;k++)
		{
			if(k==i)
				continue;
			else
			{
				//消去该行的第i列的元素
				double A_temp2=A[k][i];
				for (int p=0;p<row_len;p++)
				{
					A[k][p]=A[k][p]-A_temp2*A[i][p];
				}
				//对b向量在该行的值作处理
				b[k]=b[k]-A_temp2*b[i];
			}
		}
	}

	//显示矩阵经过约当消元后的结果 对角
	for (int i=0;i<row_len;i++)
	{
		for (int j=0;j<col_len;j++)
		{
			cout<<A[i][j]<<" ";
		}
		cout<<b[i]<<endl;
	}
}

二、高斯消去法

基本思想:
将矩阵转化为上三角矩阵,然后再从最后一行回代求解
算法步骤:
1.逐行遍历
(1)根据主对角元素对该行进行归一化
(2)该行下面的所有行消去该行的主对角元素对应列的元素,同样不要忘记操作右端向量b
2.迭代得到的矩阵为上三角矩阵,需要进行回代求解
3.回代时定义一个解向量,从后先前迭代:右端向量-sum(位于该位置后面的解*对应位置系数)
在这里插入图片描述

代码实现:

/**
 *@name Jordan_elimination:高斯消去法
 *@param1 A:系数矩阵
 *@param2 b:右端向量
**/
void Gaussian_elimination(double A[row_len][col_len],double b[row_len])
{
	for (int i=0;i<row_len;i++)
	{
		//将主对角归一化
		double A_temp=A[i][i];
		for (int j=0;j<col_len;j++)
		{
			A[i][j]=A[i][j]/A_temp;
		}
		b[i]=b[i]/A_temp;

		//对该行后面的行进行消元
		for (int k=i+1;k<row_len;k++)
		{
			double A_temp2=A[k][i];
			for (int p=0;p<col_len;p++)
			{
				A[k][p]=A[k][p]-A_temp2*A[i][p];
			}
			b[k]=b[k]-A_temp2*b[i];
		}
	}

	//显示矩阵结果 上三角
	for (int i=0;i<row_len;i++)
	{
		for (int j=0;j<col_len;j++)
		{
			cout<<A[i][j]<<" "; 
		}
		cout<<b[i]<<endl;
	}

	//回代
	cout<<"\nthe result is"<<endl;
	
	//x定义为解向量 从后向前回代
	double x[row_len];
	for (int i=row_len-1;i>=0;i--)
	{
		x[i]=b[i];
		for (int j=i+1;j<row_len;j++)
		{
			x[i]+=(-A[i][j]*x[j]);
		}
	}

	//显示解向量
	for (int i=0;i<row_len;i++)
	{
		cout<<x[i]<<endl;
	}
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值