從直接三角分解法公式可以看出,當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時的求解過程還沒有完成,改天會補充上來。
已經工作快三個月了,在北京,投的簡歷大多石沉大海了,當前這個公司的工資還是太低了,在北京生活成本有點高的嚇人,如果一直這樣下去,看不到希望。而且最慘的是啥都沒有,對象沒有,房子沒有,車也買不起,也沒有存款。
生活真是個王八蛋。
扶貧方式如下:
哪位大兄弟能給介紹個對象呢,我是男的,只愛女生。