版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yaoyaoqiekenaoo/article/details/84836519
- 定义
齐次线性方程组:等式右侧常数项全部为0
非齐次线性方程组: 等式右侧常数项不全部为0
- 齐次方程组的求解
将系数矩阵化为行阶梯形矩阵,记全为0的行数量为r=n-R(A)。将后r个未知数分别取值为1和0,对应的形成r个解。这些r个解的线性组合即为基础解系。
- 非齐次方程组的求解
分为两步:1.计算特解。将增广矩阵化为行阶梯形矩阵,将r个未知数全部取值为0,得到一个特解。
2.计算对应的齐次方程组的基础解系。
4. 方程组有解的判断条件
程序实现:列主消元法
#include<iostream> #include<cmath> using namespace std; const int n = 3; //交换2个数的大小 template<class T> void SWAP(T& a, T& b) { T c; c = a; a = b; b = c; } //高斯列主元素消元法 void gaussin_L(double a[n][n], double b[n]) { int i, j, k; int col, row; for (k = 0; k < n - 1; k++) { double ave = 0; //找出消元列中最大的那个元素所在的位置 for (i = k; i < n ; i++) if (fabs(a[i][k]) > ave) { ave = fabs(a[i][k]); cout << "ave " << ave << endl; row = i; col = k; } //如果该对角线元素是0,同样不能用高斯消元法来求解 if (a[row][row] == 0) { cout << "can't solve" << endl; return; } //将找出的行进行交换 if (k != row) { for (i = 0; i < n; i++) { SWAP(a[row][i], a[k][i]); } SWAP(b[k], b[row]); } //消元过程 double c[n]; for (j = k + 1; j < n; j++) { c[j] = a[j][k] / a[k][k]; cout << c[j] << endl; } for (i = k + 1; i < n; i++) { for (j = 1; j < n; j++) { a[i][j] = a[i][j] - c[i] * a[k][j]; } b[i] = b[i] - c[i] * b[k]; } } double x[n]; x[n - 1] = b[n - 1] / a[n - 1][n - 1]; for (i = n - 2; i >= 0; i--) { double sum = 0; for (j = i + 1; j < n; j++) sum += a[i][j] * x[j]; x[i] = (b[i] - sum)/a[i][i]; } //打印输出 for (i = 0; i < n ; i++) cout << " x" << "[" << i << "]=" << x[i] << endl; }
思考:列主消元法仅适用于系数矩阵是方阵,而且必须是满秩?
这个消元的过程不就是最简化行列式的过程吗
文章来源: 齐次线性方程组和非齐次线性方程组