高斯若尔当消元法
算法內容:
該算法主要用于求解線性方程組的解,其原理是,將增廣矩陣化成行最簡形矩陣,最終能求出方程是否有解、有解時自由元的個數和非自由元的解。
/// /// _ooOoo_ /// o8888888o /// 88" . "88 /// (| -_- |) /// O\ = /O /// ____/`---'\____ /// .' \\| |// `. /// / \\||| : |||// \ /// / _||||| -:- |||||- \ /// | | \\\ - /// | | /// | \_| ''\---/'' | | /// \ .-\__ `-` ___/-. / /// ___`. .' /--.--\ `. . __ /// ."" '< `.___\_<|>_/___.' >'"". /// | | : `- \`.;`\ _ /`;.`/ - ` : | | /// \ \ `-. \_ __\ /__ _/ .-` / / /// ======`-.____`-.___\_____/___.-`____.-'====== /// `=---=' /// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ /// Buddha Bless, No Bug ! /// #include <iostream> #include <string> #include <cmath> #include <cstdio> #include <cstdlib> #define eps 1e-9 using namespace std; const int MAXN = 220; double a[MAXN][MAXN], x[MAXN];///方程左邊的矩陣和等于等式右邊的值,求解之后X存的就是結果 int equ, var;///(方程數)和(未知數個數) /* 返回-1表示一個解,0表示無解,其余的數表示有K個自由元 */ int Gauss() {int i, j, k, col, max_r;for (k = 0, col = 0; k < equ && col < var; k++, col++){max_r = k;for (i = k + 1; i < equ; i++)///逐層尋找絕對值比第(k, k)個數大的數,便于后面化成行最簡型 {if (fabs(a[i][col]) > fabs(a[max_r][col]))///逐層尋找絕對值比第(k, k)個數大的數,便于后面化成行最簡型 {max_r = i;}}if (abs(a[max_r][col]) < eps){continue;}if (k != max_r)///如果最大的數所在行不與K同行,就進行交換,方便后面的行減去他,然后轉換成行最簡型 {for (j = col; j < var; j++)///進行交換 {swap(a[k][j], a[max_r][j]);}swap(x[k], x[max_r]);}x[k] /= a[k][col];for (j = col + 1; j < var; j++)///使(k,col)元素在k行以后的元素都除以他,而他自己變成1 {a[k][j] /= a[k][col];///使a[k][col] = 1,使這行逐漸變成行最簡形矩陣 }a[k][col] = 1;for (i = 0; i < equ; i++){if (i != k){x[i] -= x[k] * a[i][k];///x[i] 減去 (第k行的x[k]與a[i][k]的乘積),與后面的a[i][j] -= a[k][j] * a[i][col]合在一起就是每一行減去第K行for (j = col + 1; j < var; j++){a[i][j] -= a[k][j] * a[i][col];///使(其他所有行)減去(第k行) }a[i][col] = 0;}}}for (i = equ - 1; i >= 0; i--)/// {bool bul = 1;for (j = var - 1; j >= 0; j--){if (abs(a[i][j]) > eps)///如果有解(R(a) = R(a, x)) {bul = 0;}}if (bul && abs(x[i]) > eps)///如果無解(R(a)<R(a, x)) {return 0;}}int free_num = var;for (i = equ - 1; i >= 0; i--)/// {for (j = var - 1; j >= 0; j--){if (abs(a[i][j]) > eps){free_num--;///計算自由元個數break;}}}if (free_num == 0){return -1;}return var - free_num; } int main() {int n, m;while (scanf("%d%d", &equ, &var) != EOF){for (int i = 0; i < equ; i++){for (int j = 0; j < var; j++){cin >> a[i][j];}cin >> x[i];///存的是方程的結果,也就是增廣矩陣的b[]a[i][var] = i + 1;///存這個行的序號 }cout << Gauss() << endl;for (int i = 0; i < equ; i++){for (int j = 0; j < var; j++){printf("%5.2f ", a[i][j]);///輸出矩陣變換后的每個數 }cout << endl;}for (int i = 0; i < var; i++){printf("%d : %.2f\n", i + 1, x[i]);///x[i]此時存的是未知數的解 }}return 0; }?
轉載于:https://www.cnblogs.com/RootVount/p/11274090.html
總結
- 上一篇: jquery radio取值,check
- 下一篇: win10安装tensorflow (c