高斯消除问题

Gaussian elimination questions

本文关键字:问题 高斯消      更新时间:2023-10-16

我正在尝试通过一个用于消除高斯的C++程序(所有这些都在片段下方。我已经走得很远了,但我被困在这一部分:

 MatA[i][j] = MatA[i][j]/Divisor;
    }
    MatB[i] = MatB[i]/Divisor;
    if (i+1 < n) {
        for (k=i+1; k<n; k++) {
            Factor = MatA[k][i];
            MatA[k][i] = 0.0;
            for (j = i+1; j < n; j++) {
                MatA[k][j] = MatA[k][j] - Factor * MatA[i][j];
            }
            MatB[k] = MatB[k] - Factor * MatB[i]

高斯消除:

int main(){
int i, j, k, n;
float MatA[100][100], MatB[100], X[100];
float Divisor, Factor, sum;
cin >> n;
for(i=0; i< n; i++) {
    for(j=0; j < n; j++) {
        cin >> MatA[i][j];
    }
}
for(i=0; i< n; i++) {
    cin >> MatB[i];
}
for (i=0; i< n; i++) {
    Divisor = MatA[i][i];
    MatA[i][i] = 1.0;
    for (j = i+1; j < n; j++) {
        MatA[i][j] = MatA[i][j]/Divisor;
    }
    MatB[i] = MatB[i]/Divisor;
    if (i+1 < n) {
        for (k=i+1; k<n; k++) {
            Factor = MatA[k][i];
            MatA[k][i] = 0.0;
            for (j = i+1; j < n; j++) {
                MatA[k][j] = MatA[k][j] - Factor * MatA[i][j];
            }
            MatB[k] = MatB[k] - Factor * MatB[i];
        }
    }
}
X[n-1] = MatB[n-1];
for (i = n-2; i>=0; i--) {
    sum = 0.0;
    for (j = i+1; j < n; j++) {
        sum = sum + MatA[i][j] * X[j];
    }
    X[i] = MatB[i] - sum;
}
for(i=0; i< n; i++) {
    for (j = 0; j < n; j++) {
        cout << MatA[i][j] << " ";
    }
    cout << " " << MatB[i] << endl;
}
for (i=0; i<n; i++) {
    cout << "X[" << i << "] is: " ;
    cout << X[i] << endl;
}
return 0;
}

撇开在执行高斯消除时需要考虑零或非常小的对角线元素这一事实不谈......

假设您在第一排。

M[0][0]是您的枢轴元素。您将第一行的每个元素除以 M[0][0] ,这使得 M[0][0] 的值等于 1.0 并计算其余元素。这不是执行 Guussian 消除的必要步骤,但您正在代码中执行此操作。行后

for (j = i+1; j < n; j++) {
    MatA[i][j] = MatA[i][j]/Divisor;
}

执行i = 0,你有:

1.0  m12   ...  m1n

在第一行。第二行尚未处理。假设第二行如下所示:

m21  m22   ...  m2n

下一步是确保第二行如下所示:

0.0  m_new22   ...  m_new2n

若要达到该状态,需要执行以下操作。

second row = second row - m21 * first row
m21_new = m21 - m21*m11  ==> 0.0 since m11 is 1.0.
m22_new = m22 - m21*m12
m23_new = m23 - m21*m13
...
m2j_new = m2j - m21*m1j
...
m2n_new = m2n - m21*m1n

这些操作中的常量是 m21 ,这在您的代码中Factor

该行:

MatA[k][j] = MatA[k][j] - Factor * MatA[i][j];

是以下代码等效项:

m2j_new = m2j - m21*m1j

查看此站点: http://euler.mcs.utulsa.edu/~class_diaz/cs2503/Spring99/lab7/node8.html

没有简单的方法可以阅读它并尝试自己理解。