c++实现高斯消元法和列主元消元法解多项式方程

方程已给定:
在这里插入图片描述
高斯消元法都知道,列主元消元法也就是改进了一下可以使某一列主元很小的时候实现精确化。
在消元过程中,无法使主元素a(ii)≠0,但是很小时,用其做除数,会导致其他元素数量级的严重增长,舍入误差的扩展,最后导致计算结果不可靠。所以这次采用列主元素消去法来进行,思想就是将有小数的那行与该列中数最大的那行进行交换。

#include<iostream>
#include<math.h>
using namespace std;

struct  Gauss {
	double A[4][5];
	double B[2][5];
	double x1, x2, x3;
	 Gauss() {
		A[1][1] = 0.9428;
		A[1][2] = 0.3475;
		A[1][3] = -0.8468;
		A[1][4] = 0.4127;
		A[2][1] = 0.3475;
		A[2][2] = 1.8423;
		A[2][3] = 0.4759;
		A[2][4] = 1.7321;
		A[3][1] = -0.8468;
		A[3][2] = 0.4759;
		A[3][3] = 1.2147;
		A[3][4] = -0.8621;
	}
public:

	void find(int a, int b) {
		double max = A[a][b];
		int a1=a, b1=b;
		for (int i = a; i <= 3; i++) {
			for (int j = b; j <= 3; j++) {
				if (abs(max) < abs(A[i][j]))
				{
					max = A[i][j];
					a1 = i;
					b1 = j;
				}
			}
		}
		for (int i = 1; i < 5; i++) {
			swap(A[a][i], A[a1][i]);
		}
		for (int i = 1; i < 4; i++) {
			swap(A[i][b], A[i][b1]);
		}
		cout << "列主元消元法变换结果如下:" << endl;
		for (int i = 1; i < 4; i++) {
			for (int j = 1; j < 5; j++)
				cout << A[i][j] << "  ";
			cout << endl;
		}
		cout << endl;
	}

	void resultGauss1() {
		for (int i = 1; i < 3; i++) {
			for (int d = 1; d < 4 - i; d++) {
				double k = 0;
				k = A[i + d][i] / A[i][i];
				for (int j = 1; j < 5; j++) {
					A[i + d][j] = A[i + d][j] - A[i][j] * k;
				}
			}
		}
		cout << "牛顿消元法结果如下:" << endl;
		x3 = A[3][4] / A[3][3];
		x2 = (A[2][4] - A[2][3] * x3) / A[2][2];
		x1 = (A[1][4] - A[1][3] * x3 - A[1][2] * x2) / A[1][1];
		for (int i = 1; i < 4; i++) {
			for (int j = 1; j < 5; j++)
				cout<<A[i][j] <<"  ";
			cout << endl;
		}
		cout << "x1:" << x1 << "  x2: " << x2 << "  x3: " << x3 << endl;
	}
	void resultGauss2() {
		for (int i = 1; i < 3; i++) {
			find(i, i);
			for (int d = 1; d < 4 - i; d++) {
				double k = 0;
				k = A[i + d][i] / A[i][i];
				for (int j = 1; j < 5; j++) {
					A[i + d][j] = A[i + d][j] - A[i][j] * k;
				}
			}
		}
		x3 = A[3][4] / A[3][3];
		x2 = (A[2][4] - A[2][3] * x3) / A[2][2];
		x1 = (A[1][4] - A[1][3] * x3 - A[1][2] * x2) / A[1][1];
		for (int i = 1; i < 4; i++) {
			for (int j = 1; j < 5; j++)
				cout << A[i][j] << "  ";
			cout << endl;
		}
		cout << "x1:" << x3 << "  x2: " << x1 << "  x3: " << x2 << endl;
	}
};

int main() {
	Gauss gauss;
	gauss.resultGauss1();
	cout << endl;
	gauss.resultGauss2();
	system("pause");
	return 0;
}


发布了73 篇原创文章 · 获赞 81 · 访问量 9944

猜你喜欢

转载自blog.csdn.net/qq_41910353/article/details/103336641