跳轉到內容

數值方法導論/線性方程組

來自華夏公益教科書,開放的書籍,開放的世界

目標

  • 定義向量和矩陣
  • 加、減、乘矩陣
  • 求方陣的轉置
  • 定義矩陣的逆
  • 將聯立線性方程組設定為矩陣形式

資源

向量和矩陣

[編輯 | 編輯原始碼]

一個矩陣 是一個矩形的陣列,例如數字、符號或表示式。矩陣通常用來表示線性變換線性方程組

一個三角矩陣 是一種特殊的方陣。如果 A 中主對角線以下的所有元素都為零,則 A 稱為上三角矩陣

對所有

類似地,如果 A 中主對角線以上的所有元素都為零,則 A 稱為下三角矩陣。

對所有

如果主對角線以外的所有元素都為零,則 A 稱為對角矩陣。

對所有

這個矩陣

是上三角,這個矩陣

是下三角。

大小為 n 的單位矩陣 是一個 n×n 矩陣,其中主對角線上的所有元素都等於 1,其他所有元素都等於 0。

矩陣乘法

[編輯 | 編輯原始碼]

矩陣乘法 接受兩個矩陣並生成另一個矩陣。該操作的規則如下所示

用圓圈標記的交點處的值為

矩陣的轉置

[edit | edit source]

矩陣的轉置定義如下:矩陣A轉置是另一個矩陣AT,可以透過以下任何一種等效操作建立

  • 沿其主對角線(從左上角到右下角)反射A以獲得AT
  • A的行寫為AT的列
  • A的列寫為AT的行

下圖說明了這個概念

The transpose AT of a matrix A can be obtained by reflecting the elements along its main diagonal. Repeating the process on the transposed matrix returns the elements to their original position.

矩陣的逆

[edit | edit source]

如果存在一個n×n方陣B,使得

其中In表示n×n單位矩陣,使用的乘法是普通的矩陣乘法B被稱為A,記為A−1

將線性方程組表示為矩陣形式

[edit | edit source]

我們可以將這個線性方程組表示成矩陣形式,如下所示

然後我們可以使用矩陣乘法來分離變數。

線性方程組的一般矩陣形式如下所示

矩陣A是係數矩陣。X是解向量(矩陣),C是右側向量。如果我們在兩邊乘以A的逆矩陣,我們可以看到解與A的逆矩陣密切相關。

高斯消元法

[編輯 | 編輯原始碼]

來源

高斯消元法 是一個用來求解線性方程組的演算法,類似於求一個可逆方陣的逆矩陣。該演算法包含一系列對係數矩陣進行的行變換操作。共有三種基本行變換:

  • 交換兩行
  • 將一行乘以一個非零常數
  • 將一行乘以一個常數加到另一行上。

例如,第一個線性方程 (L1,主元方程) 可以用來消去 從接下來的兩個方程中:

然後 L2 (主元方程) 可以用來消去 從 L3 中。這個過程被稱為**前向消元**。現在 L3 中只有一個未知量 ,可以用來將 代入 L2 中求解 。這個過程被稱為**後向代入**。

高斯消元法的演算法可以這樣實現:

''' 
x = gauss_elimin(a, b)
Solves [a][x] = [b] by Gauss elimination.
'''
from numpy import dot, array

def gauss_elimin(a, b):
  (rows, cols) = a.shape
  # elimination phase
  for row in range(0, rows-1): # pivot equation/row
    for i in range(row+1, rows):
      if a[i, row] != 0.0:
        factor = a[i, row]/a[row, row]
        a[i, row+1:rows] = a[i, row+1:rows] - factor*a[row, row+1:rows]
        b[i] = b[i] - factor*b[row]
  # back substitution 
  for k in range(rows-1,-1,-1):
    b[k] = (b[k] - dot(a[k, k+1:rows],b[k+1:rows]))/a[k, k]
  return b

a = array([[3, 2.0], [-6, 6]])
b = array([7, 6])
print gauss_elimin(a, b)

帶部分主元選擇的高斯消元法

[編輯 | 編輯原始碼]

高斯消元法容易受到舍入誤差的影響,特別是當方程數量很大時,誤差會累積。另一個問題是除零錯誤。例如,以下矩陣會導致該方法失效,因為第二個主元元素為零,而該方法要求主元元素非零。

帶部分主元選擇的高斯消元法類似於高斯消元法,只是在 次前向消元步驟中,找出 的最大值,並將包含最大值的所在行與主元行進行交換。交換後,之前的係數矩陣如下所示。

高斯-賽德爾法

[編輯 | 編輯原始碼]

高斯消元法是一種直接(直接)方法,它將原始方程轉化為等價的更容易求解的方程。一些方程組沒有解,例如,方程數量少於未知量,或者一個方程與另一個方程矛盾。

高斯-賽德爾法 是一種迭代(或間接)方法,它從對解的猜測開始,並反覆改進猜測,直到它收斂(收斂條件得到滿足)。這種方法的優點是,當係數矩陣很大且稀疏時,它在計算上更有效率,並且可以透過調整誤差容限來控制舍入誤差。

該演算法包含以下步驟:

  1. 將每個方程改寫為對應未知量的形式,例如,將第一個方程寫成 在左側,將第二個方程寫成 在左側
  1. 找到 的初始猜測。
  2. 使用重寫的方程計算新的估計值 - 始終使用最新的估計值。
  3. 重複上一步,直到所有 中最大的絕對相對近似誤差小於指定的容差。

大多數迭代方法的缺點是,當方程組的係數矩陣不是 對角佔優 時,它可能不會收斂。係數矩陣對角佔優的方程組總是收斂的。矩陣 A 對角佔優,如果

以及

一個 使用 numpy 的 Python 實現 只需迭代即可生成解向量。

LU 分解

[edit | edit source]

LU 分解 將係數矩陣 A 分解為下三角矩陣和上三角矩陣的乘積:A = LU。從 A 中匯出 L 和 U 的過程稱為 LU 分解或 LU 分解,類似於 高斯消元法

完成 LU 分解後,我們可以使用前向和後向替換來求解由 A 表示的線性方程組。

,這意味著 可以透過前向消元法求解。從 中,我們可以使用後向消元法求解 X。

LU 分解的一種方法類似於高斯消元法。對於一個

從最後一個矩陣中,我們可以看到為了消除 ,我們需要將 A 的第一行乘以 ,類似地,為了消除 ,需要將第一行乘以 。為了計算 L,我們可以簡單地記錄正向消元步驟中使用的乘數,矩陣 U 與正向消元得到的最終上三角矩陣相同。

Python 示例程式碼

求矩陣的逆

[edit | edit source]

求矩陣的逆是一個與求解線性方程組相關的過程。如果找到了係數矩陣的逆,那麼由係數矩陣表示的方程組也就被解出來了。

求矩陣的逆的一種方法是透過解一組線性方程組分別求出逆矩陣的每一列。如果 並且

那麼

.

我們可以透過使用 LU 分解方法求解方程組來計算 的第一列。其餘的列可以以類似的方式計算。正如你所看到的,LU 分解方法的優勢在於 LU 分解只執行一次,結果被多次使用,這降低了整個解決方案的計算複雜度。

華夏公益教科書