解線性方程組的直接方法 --- 選主元的三角分解法(C語言實現)

 

從直接三角分解法公式可以看出,當U矩陣中的Urr=0時,計算將中斷。或者當Urr絕對值很小時,按分解公式計算可能引起舍入誤差的累積。

當A滿秩的時候(非奇異), 我們可以通過交換A的行實現矩陣PA的LU分解,因此可以採用與列主元消去法類似的方法, 將直接三角分解法修改爲(部分)選主元的三角分解法。

void GaussTri(double (*Arr)[3], int N){
    // 對於列主元三角分解法,我們首先需要進行列主元的選取
    // 在數值分析(第五版)關於列主元的介紹中,
    // 首先需要根據公式 s_i = Arr_i_r - sum(l_i_k*u_k_r, 1, r-1)
    // 則首先需要循環當前列上的所有的元素,計算出對應的值,並接下來進行挑選
    double sum_val = 0.0;
    int max_val_index = 0;
    // 這裏對應的i是遍歷的行的索引, 用來確定主元所在的行的索引值
    for(int i=0; i<N; i++){
        // 接下來我們首先需要進行行的循環,下面行的循環,
        // 行是從i開始的,因爲i行上的主元素也需要處理
        max_val_index = i;
        for(int row_i=i; row_i<N; row_i++){
            sum_val = 0.0;
            // 這裏的row_i表示的是要進行操作的行數
            // 接下來,我們應該創建一個求和的列數
            for(int d=i-1; d>=0; d--){
                // 這裏的d的起始行必須是小於i的
                sum_val += Arr[row_i][d] * Arr[d][i];
            }
        // 求和完畢後,接下來處理原位置上的數值
        Arr[row_i][i] -= sum_val;
        // 處理完第一個元素了,接下來我們對最大索引值進行處理
        if(abs(Arr[row_i][i]) > abs(Arr[max_val_index][i])){
            max_val_index = row_i;
        }
        }
        // 當跳出內循環後,便得到了最大索引所在的位置
        // 接下來把對應的行進行交換
        double temp = 0.0;
        for(int col_i=0; col_i<N; col_i++){
            temp = Arr[max_val_index][col_i];
            Arr[max_val_index][col_i] = Arr[i][col_i];
            Arr[i][col_i] = temp;
        }

        // 挑選出列主元之後,接下來便是該進行三角分解 了
        // 但是注意這裏的列已經處理成Si了
        // 首先根據書上的內容,當前在對角線上的元素便是U_rr了
        // 然後所有的列需要被U_rr除.
        // 我們首先來處理當前需要進行操作的列
        for(int col_d=i+1; col_d<N; col_d++){
            // 這裏的col_d應該從i+1開始,因爲下面的才需要進行除法的運算
            Arr[col_d][i] /= Arr[i][i];
        }
        // 待循環結束,那麼對於列便處理完成了,接下來該是來去處理行上的元素le
        // 接下來所進行的遍歷是指定行上的列的遍歷
        // 當前處理的行是i 行上的元素, 因爲在2D矩陣Arr中,i列已經處理完了
        for(int col_m=i+1; col_m<N; col_m++){
            // 這裏的row_d的起始應該是從i+1開始的,因爲i上的元素已經處理完成了
            // 進行對應列上的上面的元素的求和
            sum_val = 0.0;
            for(int d=i-1; d>=0; d--){
                sum_val += Arr[i][d] * Arr[d][col_m];
            }
            // 待跳出循環後,去處理對應位置上的元素
            Arr[i][col_m] -= sum_val;
        }
    }
}

將係數矩陣寫成1D時的求解過程還沒有完成,改天會補充上來。

已經工作快三個月了,在北京,投的簡歷大多石沉大海了,當前這個公司的工資還是太低了,在北京生活成本有點高的嚇人,如果一直這樣下去,看不到希望。而且最慘的是啥都沒有,對象沒有,房子沒有,車也買不起,也沒有存款。

生活真是個王八蛋。

 

 

扶貧方式如下:

哪位大兄弟能給介紹個對象呢,我是男的,只愛女生。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章