首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

數值計算作業:C 語言實作高斯消去法(不選主元與列主元)求解 84 階方程組

     編輯:程式設計綜合問答

課程作業要求以 C 語言編寫通用程式,實作「不選主元」與「列主元」兩種高斯消去法,求解 84 階線性方程組,並將數值解與精確解比較分析誤差。本文提供演算法架構、關鍵程式碼片段與數值穩定性分析重點。

問題定義

  • 方程組:A x = b,A 為 84×84 矩陣
  • 需實作兩種演算法:
    1. 不選主元高斯消去法
    2. 列主元高斯消去法
  • 輸出:數值解向量、與精確解的誤差(如 ||x_num - x_exact||_∞)
作業題目圖片
圖示:作業題目要求的矩陣結構與精確解

演算法核心步驟

1. 不選主元高斯消去法

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];
}

缺點:主元極小時,除法放大誤差,數值不穩定。

2. 列主元高斯消去法

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,避免堆疊溢位。
  • 精確解生成:依題目給定矩陣結構(如 Hilbert、Vandermonde 或特定條帶矩陣)計算理論解,或直接設定 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 語言實作細節

學習重點總結

  1. 理解主元選擇對數值穩定性的決定性影響。
  2. 熟練雙重指標動態矩陣操作與列交換技巧。
  3. 體會機器精度(DBL_EPSILON)在除法判斷中的角色。
  4. 學會以誤差範數量化驗證演算法優劣。

完成此作業不僅能掌握經典數值線性代數演算法,更能建立「有限精度運算下誤差控制」的工程直覺,為後續科學計算打下堅實基礎。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved