诚信模型公司 發表於 2025-12-11 13:53:00

【C/C++】高斯列主元消元法求解线性方程组

<p>初始增广矩阵:</p>
<p>矩阵当前状态:</p>
<h2 id="30000-----10000-----10000-----4000010000-----10000-----10000-----6000020000-----30000-----10000----120000">3.0000    -1.0000   1.0000   4.0000<br>
1.0000   1.0000   1.0000   6.0000<br>
2.0000   3.0000    -1.0000    12.0000</h2>
<p>方程组的解:<br>
x1 = 1.0000<br>
x2 = 3.0000<br>
x3 = 2.0000</p>
<p>验证结果:<br>
3x1 - x2 + x3 = 4.0000 (预期4)<br>
x1 + x2 + x3 = 6.0000 (预期6)<br>
2x1 + 3x2 - x3 = 12.0000 (预期12)</p>
<pre><code>#include&lt;stdio.h&gt;
#include&lt;math.h&gt;

#define MAX_MATRIX 10

/**
* @brief SwapRow 进行行交换
* @param m 待计算的矩阵
*      row 待交行的行
*      max_row 待交换的另一行
*      n 矩阵行数
*/
static void SwapRow(double m[], int row, int max_row, int n) {
        double swap;
        for (int k = row; k &lt;= n; k++) {
                swap = m;
                m = m;
                m = swap;
        }
}

/**
* @brief 组上三角矩阵
* @param m 待计算的矩阵
*      n 矩阵行数
*/
static void SelectColE(double m[], int n) {
        int max_row_e = 0;//主元所在行
        double ratio = 0;   //消元因数
        for (int j = 0; j &lt; n; j++) {
                max_row_e = j;
                for (int i = j; i &lt; n; i++) {
                        if (fabs(m) &gt; fabs(m)) {
                                max_row_e = i;
                        }
                }
                if (max_row_e != j) {
                        SwapRow(m, j, max_row_e, n);   //与最大主元所在行交换
                }
                //消元
                for (int i = j + 1; i &lt; n; i++) {
                        ratio = m / m;
                        for (int k = j; k &lt; n + 1; k++) {
                                m -= m * ratio;
                        }
                }
        }
}

/**
* @brief: Gauss 高斯列主元消元法求解线性方程(A*X = B)
* @param: m 由于A|B组成的增广矩阵,X为待求的解
*         n 求解的元数,n要小于MAX_MATRIX
* @result:所求结果存放在m[]中
*/
void Gauss(double m[], int n) {
        SelectColE(m, n);   // 列选主元并消元成上三角
        // 回代求解,结果存在m[]中
        for(int i = n - 1; i &gt;= 0; i--) {
                for(int j = i + 1; j &lt; n; j++) {
                        m -= m * m;
                }
                m /= m;
        }
}

double a = {
        {3,-1, 1, 4},//A|B
        {1, 1, 1, 6},
        {2, 3,-1, 12}
};

int main(int argc ,char **argv) {
        Gauss(a, 3);
        printf("%f,%f,%f\r\n",a, a, a);
        return 0;
}


</code></pre><br><br>
来源:https://www.cnblogs.com/wuxiaomu/p/19336144
頁: [1]
查看完整版本: 【C/C++】高斯列主元消元法求解线性方程组