(一)计算机数值方法之Gauss列主元素消去法

说明:

本系列将致力于用计算机代码编程解决人工计算较为繁杂无趣的数学计算问题。本系列的文章将分为以下几个模块:数学问题,解决代码,使用方法,问题解答。话不多说,开始吧。

数学问题:

利用 Gauss列主元素消去法解决线性方程问题Ax=b,其中(A,b)分别为:

​​​​​​​

解决代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <iostream>
#include <iomanip>
#include <math.h>
using namespace std;


void SolverEqGauss(double** A, double* b, int n, double* x);
//其中A和b为系数矩阵,n为矩阵阶数,x为待求解变量,eps为精度。
int main()
{
	int i, n;
	double** A, * b, * x;
	//输入维数
	cin >> n;
	A = new double* [n];
	b = new double[n];
	x = new double[n];
	for (i = 0; i < n; i++)
	{
		A[i] = new double[n];
	}
	//输入系数矩阵和向量
	for (i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
		{
			cin >> A[i][j];
		}
	}
	for (int i = 0; i < n; i++)
	{
		cin >> b[i];
	}

	//计算
	SolverEqGauss(A, b, n, x);
	//输出
	for (i = 0; i < n; i++)
	{
		cout << fixed << setprecision(5) << x[i] << " ";
	}
	delete[]b;//释放内存
	delete[]x;
	for (i = 0; i < n; i++)
	{
		delete[]A[i];
	}
	
	return 0;
}


void SolverEqGauss(double** A, double* b, int n, double* x)
{
	int i, j, k;
	double** a = new double* [n];
	double* btemp = new double[n];
	double d, temp;
	double eps = 1e-6;
	for (i = 0; i < n; i++)
	{
		a[i] = new double[n + 1];
	}
	//赋值
	for (i = 0; i < n; i++)
	{
		for (j = 0; j < n; j++)
		{
			a[i][j] = A[i][j];
		}
		a[i][n] = b[i];
	}

	for (k = 0; k < n - 1; k++)
	{//找列主元最大值
		
		for (int i = k + 1; i < n - 1; i++)
		{
			if (abs(a[i][k]) >= abs(a[k][k]))
			{
				if (abs(a[i][k]) < eps)
				{
					break;
					printf("wrong");
				}
				else
				{
					for (int j = k; j <= n; j++)
					{
						double c;
						c = a[i][j];
						a[i][j] = a[k][j];
						a[k][j] = c;

						
					}
				}
			}
		}
	
		for (int i = k + 1; i < n; i++)
		{
			double m = a[i][k] / a[k][k];

			for (int j = k+1; j <= n; j++)
			{
				a[i][j] = a[i][j] - m * a[k][j];
			}



		}


	}

	for (i = 0; i < n; i++)
	{
		btemp[i] = 0.0;
	}

	for (i = n - 1; i >= 0; i--) //求解向量
	{
		
		double trans = 0.0;
		for (int j = i + 1; j <n; j++)
		{
			trans = trans + a[i][j] * btemp[j];
		}
		btemp[i] = (a[i][n] - trans) / a[i][i];
		
	}
	for (i = 0; i < n; i++)
	{
		x[i] = btemp[i];
	}


	for (i = 0; i < n; i++)
	{
		delete[]a[i];
	}
	delete[]a;
	delete[]btemp;
}

使用方法:

第一行是矩阵阶度:n ;

后面的 n 行,输入 n 阶矩阵;

最后一行,输入未知向量的值。

例如:

矩阵为:A=[[1,−1,2,−1],[2,−2,3,−3],[1,1,1,0],[1,−1,4,3]]

向量为:b=[−8,−20,−2,4]

测试输入:

4

1 -1 2 -1

2 -2 3 -3

1 1 1 0

1 -1 4 3

-8 -20 -2 4

预期输出:

-7.00000 3.00000 2.00000 2.00000

问题解决:

ps:博客生涯第一篇文章,希望大家多多支持!有许多不足之处,希望多多指教!希望与大家一同进步!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值