//高斯消去法和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;
}
高斯消去法和LU三角分解法求解线性方程组算法的实现
于 2020-11-29 16:34:17 首次发布