c++解高斯消元

算法思想
(1) 线性方程组写成增广矩阵的形式;
(2) 找主元,对增广矩阵进行行变换,对元素,在第i列中及以下的元素选取绝对值最大的元素,将所有元素中最大的所在的行与第i行交换;
(3) 消元过程,然后采用高斯消元法使得新得到的第i行以下的元素均为零;
(4) 重复上述过程直到,从而得到上三角矩阵;
(5) 对上三角矩阵进行回代求解,即可以得到方程组的解。

1高斯列主元法解线性方程组源代码

double A[N][N], b[N], Aug[N][N + 1];
void equ(double A[N][N], double b[N], double x[N], int n)    //定义equ函数
{
	int i, i1, j, k;
	double Aug[N][N + 1];    //定义增广矩阵
	double max, temp, l, s;
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < n; j++)          //构建增广矩阵Aug
		{
			Aug[i][j] = A[i][j];
			Aug[i][n] = b[i];
		}
	}
	cout << "增广矩阵:" << endl;
	for (i = 0;i< n; i++)             //输出增广矩阵Aug
	{
		for (j = 0; j< n + 1; j++)      
			cout << Aug[i][j] << "  ";
		    cout << endl;
	}
	for (i1 = 0; i1< n - 1; i1++)                 //求主元
	{
		max = fabs(Aug[i1][i1]);
		k = i1;
		for (i = i1; i < n; i++)
		{
			if (max < fabs(Aug[i][i1]))
			{
				max = fabs(Aug[i][i1]);
				k = i;
			}
		}
		cout << "最大元max=" << max << endl;
		cout << endl;
		for (j = i1; j< n + 1; j++)       //换行(将最大元素行换到目标行)
		{
			temp = Aug[i1][j];
			Aug[i1][j] = Aug[k][j];
			Aug[k][j] = temp;
		}
		for (i = 0; i < n; i++)
		{
			for (j = 0; j< n + 1; j++)
				cout << Aug[i][j] << "  ";
			    cout << endl;
		}
		cout << "以" << max << "为列主元消去得到:" << endl;
		for (k = i1 + 1; k < n; k++)              //消元
		{
			l = -Aug[k][i1] / Aug[i1][i1];
			for (j = i1; j < n + 1; j++)
				Aug[k][j] = Aug[k][j] + l*Aug[i1][j];
		}  
		for (i = 0; i < n; i++)            //输出Aug
		{
			for (j = 0; j < n + 1; j++)
				cout << Aug[i][j] << "  ";
			    cout << endl;
		}
	}
		x[n - 1] = Aug[n - 1][n] / Aug[n - 1][n - 1];    //回代求解
		for (i = n - 2; i  >=  0; i = i - 1)
		{
		s = 0;
		for (j = i + 1; j < n; j++)
			s = s + Aug[i][j] * x[j];
		x[i] = (Aug[i][n] - s) / Aug[i][i];
		}
int main()
{
	void equ(double A[N][N], double b[N], double x[N], int n);
	//声明调用函数
	int i, j, n, z;
	double A[N][N], b[N], x[N];
	//定义系数矩阵、常数列向量、变量列向量
	cout << "请输入变量个数n:";
	cin >> n;
	cout << "请输入系数矩阵A" << endl;
	for (i = 0; i < n; i++)
	{
	for (j = 0; j < n; j++)
		cin >> A[i][j];
	}
	cout << "请输入b" << endl;
	for (z = 0; z < n; z++)
	cin >> b[z];
	equ(A, b, x, n);                               //调用equ函数
	for (i = n - 1; i  >=  0 && i < n; i--)
	cout << "x[" << i << "]=" << x[i] << endl;
	system("pause");
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

_长风_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值