方程已给定:
高斯消元法都知道,列主元消元法也就是改进了一下可以使某一列主元很小的时候实现精确化。
在消元过程中,无法使主元素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;
}