課程作業要求以 C 語言編寫通用程式,實作「不選主元」與「列主元」兩種高斯消去法,求解 84 階線性方程組,並將數值解與精確解比較分析誤差。本文提供演算法架構、關鍵程式碼片段與數值穩定性分析重點。
A x = b,A 為 84×84 矩陣||x_num - x_exact||_∞)
for (k = 0; k < n-1; k++) {
// 無主元選擇,直接使用 A[k][k] 作為主元
if (fabs(A[k][k]) < EPS) { /* 處理零主元 */ }
for (i = k+1; i < n; i++) {
factor = A[i][k] / A[k][k];
for (j = k+1; j < n; j++) A[i][j] -= factor * A[k][j];
b[i] -= factor * b[k];
}
}
// 回代
for (i = n-1; i >= 0; i--) {
sum = b[i];
for (j = i+1; j < n; j++) sum -= A[i][j] * x[j];
x[i] = sum / A[i][i];
}
缺點:主元極小時,除法放大誤差,數值不穩定。
for (k = 0; k < n-1; k++) {
// 尋找第 k 列從 k 行到 n-1 行的最大絕對值
max_row = k;
max_val = fabs(A[k][k]);
for (i = k+1; i < n; i++) {
if (fabs(A[i][k]) > max_val) {
max_val = fabs(A[i][k]);
max_row = i;
}
}
// 交換第 k 行與 max_row 行
if (max_row != k) {
swap_rows(A, k, max_row, n);
swap(b[k], b[max_row]);
}
// 消去過程同不選主元
...
}
優點:主元最大化,抑制誤差擴大,數值穩定性顯著提升。
malloc 配置 double **A、double *b、double *x,避免堆疊溢位。x_exact = [1,1,...,1]^T 反推 b。max_i |x_num[i] - x_exact[i]|(無窮範數)或 sqrt(sum(...))(二範數)。cond(A) = ||A|| * ||A^-1|| 分析問題敏感度。| 方法 | 最大絕對誤差 | 執行時間 | 備註 |
|---|---|---|---|
| 不選主元 | 較大(可能 1e-3 ~ 1e+2) | 較快 | 病態矩陣下可能完全失效 |
| 列主元 | 極小(通常 1e-12 ~ 1e-15) | 稍慢(尋找主元開銷) | 工程實務標準做法 |
CSDN 同類討論:高斯消去法 C 語言實作細節
DBL_EPSILON)在除法判斷中的角色。完成此作業不僅能掌握經典數值線性代數演算法,更能建立「有限精度運算下誤差控制」的工程直覺,為後續科學計算打下堅實基礎。