【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<stdio.h>
#include<math.h>
#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 <= 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 < n; j++) {
max_row_e = j;
for (int i = j; i < n; i++) {
if (fabs(m) > fabs(m)) {
max_row_e = i;
}
}
if (max_row_e != j) {
SwapRow(m, j, max_row_e, n); //与最大主元所在行交换
}
//消元
for (int i = j + 1; i < n; i++) {
ratio = m / m;
for (int k = j; k < 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 >= 0; i--) {
for(int j = i + 1; j < 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]