高斯消去法和LU三角分解法求解线性方程组算法的实现

//高斯消去法和LU三角分解法
#include<iostream>
#include<cmath>
#define Length 10
using namespace std;
class DirectMethod {
public:
	void gaussinput();
	void luinput();
	void gausselimination();
	void lutriangulationmethod();
	void gaussdisplay();
	void inint();
	void ludisplay();
private:
	double A[Length][Length];
	double B[Length];
	double C[Length];
	double X[Length];
	double L[Length][Length];
	double U[Length][Length];
	int n;
	double a;
	double b;
}dm;
void DirectMethod::gaussinput() {
	cout << "*****************第一题*****************\n" << endl;
	cout << "请输入系数矩阵A的维数:n=";
	cin >> n;
	cout << "请输入您要求解的方程组的系数矩阵A" << endl;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			cin >> A[i][j];
		}
	}
	cout << "请输入您要求解的方程组的常数矩阵B:" << endl;
	for (int k = 0; k < n; k++) {
		cin >> B[k];
	}
}
void DirectMethod::luinput() {
	cout << "\n*****************第二题*****************\n" << endl;
	cout << "请输入系数矩阵A的维数:n=";
	cin >> n;
	cout << "请输入您要求解的系数矩阵A:" << endl;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			cin >> A[i][j];
		}
	}
}
//高斯消去法
void DirectMethod::gausselimination() {
	int i, j, k;
	double AB[Length][Length];
	for (i = 0; i < n; i++) {
		for (j = 0; j < n; j++) {
			AB[i][j] = A[i][j];
		}
		AB[i][n] = B[i];
	}
	double l;
	for (i = 0; i < n-1; i++) {
		for (j = i; j < n-1; j++) {
			l = -AB[j+1][i] / AB[i][i];
			for (k = i; k <= n; k++) {
				AB[j + 1][k] += AB[i][k] * l;
			}
		}
	}
	X[n-1] = AB[n-1][n] / AB[n-1][n-1];
	for (i = n - 2; i >= 0; i--) {
		double sum = 0.0;
		for (j = i+1; j <= n; j++) {
			sum += AB[i][j] * X[j];
		}
		X[i] = (AB[i][n] - sum) / AB[i][i];
	}
}
void DirectMethod::inint() {
	int i, j;
	L[n - 1][n - 1] = { 0 };
	U[n - 1][n - 1] = { 0 };
	for (i = 0; i < n; i++) {
		for (j = 0; j <= i; j++) {
			L[i][j] = 1;
		}
		for (j = i; j < n; j++) {
			U[i][j] = 1;
		}
	}
}
//LU三角分解法
void DirectMethod::lutriangulationmethod() {
	int i, j, k, m;
	for (j = 0; j < n; j++) {
		U[0][j] = A[0][j];
	}
	for (i = 1; i < n; i++) {
		L[i][0] = A[i][0] / U[0][0];
	}
	for (k = 1; k < n; k++) {
		for (j = k; j < n; j++) {
			double sum = 0;
			for (m = 0; m <= k - 1; m++) {
				sum += L[k][m] * U[m][j];
			}
			U[k][j] = A[k][j] - sum;
		}
		for (i = k + 1; i < n; i++) {
			double sum = 0.0;
			for (m = 0; m <= k - 1; m++) {
				sum += L[i][m] * U[m][k];
			}
			L[i][k] = (A[i][k] - sum) / U[k][k];
		}
	}
}
void DirectMethod::ludisplay() {
	cout << "矩阵L为:" << endl;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			cout << L[i][j] << "\t";
		}
		cout << endl;
	}
	cout << "矩阵U为:" << endl;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			cout << U[i][j] << "\t";
		}
		cout << endl;
	}
	cout << endl;
}
void DirectMethod::gaussdisplay() {
	cout << "用高斯消去法解得方程组的根为:" << endl;
	for (int i = 0; i < n; i++) {
		cout << "X" << i + 1 << "=" << X[i] << "  ";
	}
	cout << endl;
}
int main() {
	dm.gaussinput();
	dm.gausselimination();
	dm.gaussdisplay();
	dm.luinput();
	dm.inint();
	dm.lutriangulationmethod();
	dm.ludisplay();
	system("pause");
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值