閱讀進度 0%
0%

使用 Python NumPy 與 SymPy 計算最簡行階梯型矩陣(RREF)

後端開發Python線性代數數學約 4 分鐘閱讀
最簡行階梯型矩陣(Reduced Row Echelon Form, RREF)是線性代數中分析矩陣性質與解線性方程組的重要工具。本文將詳細介紹 RREF 的定義,以及如何在 Python 中結合 NumPy 與 SymPy 進行 RREF 計算與應用。

行階梯型矩陣基本概念

行階梯型矩陣(Row Echelon Form, REF)是經過一系列初等行變換後得到的特殊形式矩陣。它具有以下特徵:

  1. 階梯狀結構:非零元素呈現階梯狀分布,從左上角向右下角遞進。

  2. 零行處理:全零行(如果存在)位於矩陣底部,非零行在上。

  3. 主元位置:每個非零行的第一個非零元素(主元)位於前一行主元的右側。

  4. 主元上方:每個主元的正上方元素均為零。

  5. 自由度:不是每列都必須有主元,無主元列對應方程組的自由變量。

例如,以下是一個 3x4 的行階梯型矩陣:

[1 3 0 2]
[0 1 2 5]
[0 0 1 4]

這個例子展示了 REF 的典型特徵:

  • 主元(1, 1, 1)呈階梯狀
  • 每個主元上方元素為零
  • 每行主元位於前一行主元右側

REF 在解線性方程組和分析矩陣性質時特別有用,為進一步簡化到最簡行階梯型(RREF)奠定了基礎。

最簡行階梯型矩陣(RREF)

最簡行階梯型矩陣(Reduced Row Echelon Form, RREF)是行階梯型矩陣(REF)的進一步簡化形式。RREF 具有以下特點:

  1. 包含 REF 的所有特徵
  2. 每個主元(leading entry)都是 1
  3. 每個主元所在列的其他元素都是 0

例如,以下是一個 RREF 矩陣:

[1 0 0 | 2]
[0 1 0 | 3]
[0 0 1 | 1]

RREF 的應用與優勢

在處理線性方程組時,RREF(化簡列階梯形式)是一種極為強大的工具。透過將矩陣轉換為 RREF 形式,我們能夠系統性地觀察並解決方程組,尤其在判斷是否存在唯一解、無解或無窮多解時特別有效。這種形式化的過程讓解題更加精確與有條理,是線性代數中不可或缺的技術。

除了求解方程組,RREF 也可以直接揭示矩陣的秩(Rank)。在 RREF 中,非零行的數量即為該矩陣的秩,這對於判斷矩陣是否滿秩、是否具有線性獨立性等性質極為重要。透過這樣的分析,使用者可以迅速掌握矩陣的結構與限制。

進一步來說,RREF 亦可用於計算零空間(Null Space)。透過觀察變數間的自由度與依賴關係,我們能找出所有滿足 Ax = 0 的向量集合。這些零空間解不僅在數學理論中具有重要意義,也在工程、電路設計與資料壓縮中有廣泛應用。

RREF 也能判斷一個方陣是否可逆。當我們將一個方陣轉換為 RREF 並發現其結果為單位矩陣時,即可確定該矩陣存在逆矩陣。這一特性對於解線性系統、計算矩陣函數或進行變換分析時具有實質幫助。

最後,RREF 對教學與學習而言具有極高的可視化價值。相比傳統的高斯消去法,RREF 更能以直觀的方式呈現矩陣的核心特性,讓學生一眼就能辨別其行列關係與解的型態,是線性代數課程中非常適合作為引導學生理解的重要工具。

REF 與 RREF 的差異

舉例說明:

REF 的例子:      RREF 的例子:
[ 1  2  3 ]      [ 1  0  0 ]
[ 0  1  4 ]      [ 0  1  0 ]
[ 0  0  1 ]      [ 0  0  1 ]

在 RREF 中,每個主元 1 所在的列上下都必須是 0,而 REF 只要求主元下方為 0。

在 Python 中計算 RREF

https://assets.calpa.me/python-header.avif

NumPy 是數值計算的主力庫,但不直接提供 RREF 功能。SymPy 則有 rref() 方法可直接計算最簡行階梯型。

步驟 1:安裝必要套件

pip install numpy sympy

或使用 uv:

uv add numpy sympy

步驟 2:NumPy 陣列轉 SymPy 矩陣並計算 RREF

以下範例展示如何將 NumPy 陣列轉成 SymPy 矩陣並計算 RREF:

import numpy as np
from sympy import Matrix

A = np.array([
    [2, 4, 3],
    [1, 2, 3],
    [4, 8, 10]
])

sympy_matrix = Matrix(A)
rref_matrix, pivot_columns = sympy_matrix.rref()
numpy_rref_matrix = np.array(rref_matrix.tolist(), dtype=float)

print("原矩陣:")
print(A)
print("\nRREF:")
print(numpy_rref_matrix)
print("\n主元列索引:")
print(pivot_columns)

執行結果:

原矩陣:
[[ 2 4 3]
 [ 1 2 3]
 [ 4 8 10]]
RREF:
[[1. 2. 0.]
 [0. 0. 1.]
 [0. 0. 0.]]
主元列索引:
(0, 2)

rref() 方法說明

rref() 回傳一個 tuple,第一個元素是 RREF 矩陣,第二個是所有主元所在列的索引。例如:

import sympy as sym
B = np.matrix([
    [50, 10, 30],
    [100, 25, 60],
    [20, 25, 60]
])
result = sym.Matrix(B).rref()
print(result)

輸出:

(Matrix([
[1, 0, 0],
[0, 1, 0],
[0, 0, 1]]), (0, 1, 2))

(0, 1, 2) 表示第 0、1、2 列皆為主元列,代表矩陣為滿秩。這對判斷方程組解的性質與矩陣可逆性很重要。

更複雜情境的 RREF

也可處理有零列的矩陣:

import numpy as np
from sympy import Matrix

A = np.array([
    [0, 0, 1],
    [0, 1, 0]
])
sympy_matrix = Matrix(A)
rref_matrix, pivot_columns = sympy_matrix.rref()
numpy_rref_matrix = np.array(rref_matrix.tolist(), dtype=float)

print("原矩陣:")
print(A)
print("\nRREF:")
print(numpy_rref_matrix)
print("\n主元列索引:")
print(pivot_columns)

輸出:

原矩陣:
[[0 0 1]
 [0 1 0]]

RREF:
[[0. 1. 0.]
 [0. 0. 1.]]

主元列索引:
(1, 2)

實例:三種水果價格推理

RREF 可解多變數線性方程組,以下以生活化例子說明:

問題描述

市集購物紀錄如下:

次數 購買項目(數量) 總金額
第一次 2 蘋果 + 1 香蕉 + 1 橘子 10 元
第二次 1 蘋果 + 2 香蕉 + 3 橘子 20 元
第三次 3 蘋果 + 3 香蕉 + 1 橘子 21 元

設蘋果單價 a、香蕉 b、橘子 c,則:

2a + 1b + 1c = 10
1a + 2b + 3c = 20
3a + 3b + 1c = 21

增廣矩陣:

[2, 1, 1, 10]
[1, 2, 3, 20]
[3, 3, 1, 21]

Python 求解

from sympy import Matrix

G = Matrix([
    [2, 1, 1, 10],
    [1, 2, 3, 20],
    [3, 3, 1, 21]
])
rref_matrix, _ = G.rref()
print("RREF:")
print(rref_matrix)

輸出:

Matrix([
  [1, 0, 0, 1],
  [0, 1, 0, 5],
  [0, 0, 1, 3]
])

即:

  • 蘋果 a = 1 元
  • 香蕉 b = 5 元
  • 橘子 c = 3 元

這說明如何將現實問題建模為線性方程組,並用 RREF 快速求解。

總結

https://assets.calpa.me/b-k-HAl6CKxM3xU-unsplash.avif

SymPy 的 rref() 方法為我們提供了一種便捷的方式來計算矩陣的最簡行階梯型。雖然 NumPy 本身不提供這一功能,但通過結合這兩個庫,我們可以高效地完成相關計算。

最簡行階梯型矩陣在線性代數中的應用非常廣泛,從解決線性方程組到分析矩陣特性都有重要作用。掌握 RREF 的計算方法不僅可以幫助我們解決實際問題,還能加深對線性代數基本概念的理解。

建議讀者在實際應用中,善用 Python 的強大功能,善用 NumPy 和 SymPy 庫提供的各種工具,更有效地解決線性代數問題。

參考資源

  1. NumPy 官方文檔
  2. SymPy 官方文檔
  3. Khan Academy 線性代數課程
  4. MIT OpenCourseWare 線性代數課程
  5. 《線性代數及其應用》by Gilbert Strang
後端開發Python線性代數數學
關於 Calpa

Calpa 擅長使用 TypeScript、React.js 和 Vue.js 建立 Responsive Website。

他積極參與開源社區,曾在 2019 年的香港開源大會上擔任講者,提供工作經驗和見解。此外,他也在GitHub 上公開分享個人博客程式碼,已獲得超過 300 顆星星和 60 個分支的支持。

他熱愛學習新技術,並樂意分享經驗。他相信,唯有不斷學習才能跟上快速演變的技術環境。

熱門文章