gauss消元

高斯消元法(或譯:高斯消去法)(英語:Gaussian Elimination),是線性代數中的一個算法,可用來爲線性方程組求解,求出矩陣的秩,以及求出可逆方陣的逆矩陣。當用於一個矩陣時,高斯消元法會產生出一個“行梯陣式”。

/*
 *
 * 函數說明
 * 
 * 將方程做成一個矩陣,再利用三種矩陣初等變換
 * 得到上三角矩陣,最後回代得到解集 
 *
 *
 * 時間複雜度 O(n^3)
 *  
 * 輸入 
 * a  方程組對應的矩陣
 * n  方程未知數的個數
 * l  表示是否爲自由元
 * ans 存儲解 
 *
 * 輸出:解空間的維數 
 **/
int gauss(double a[][N], bool l[], double ans[], int &n){
    int res = 0, r = 1;
    for (int i = 1; i <= n; i++){
        l[i] = false;
    }
    for (int i = 1; i <= n; i++){
        // 交換兩行, 使得a[r][i]不爲零 
        for (int j = r; j <= n; j++){
            if (fabs(a[j][i]) > eps){
                for (int k = i; k <= n+1; k++){
                    swap(a[j][k], a[r][k]);
                }
                break;
            }
        }
        // 如果a[r][i]仍然是0 則這個方程是一個無用的方程 
        if (fabs(a[r][i]) < eps){
            res++;
            continue;
        }
        for (int j = 1; j <= n; j++){
            if (j != r && fabs(a[j][i]) > eps){
                double tmp = a[j][i] / a[r][i];
                for (int k = i; k <= n+1; k++){
                    a[j][k] -= tmp*a[r][k];
                }
            }
        }
        l[i] = true;
        r++;
    }
    // 計算解集 
    for (int i = 0; i < n; i++){
        if (l[i]){
            for (int j = 0; j < n; j++){
                if (fabs(a[j][i]) > 0){
                    ans[i] = a[j][n]/a[j][i];
                }
            }
        }
    }
    return res;
}
發佈了274 篇原創文章 · 獲贊 52 · 訪問量 24萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章