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

作者: Calpa Liu
字數:1579
出版:April 17, 2025
分類: 後端開發 Python 線性代數 數學

最簡行階梯型矩陣(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

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 快速求解。

總結

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

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

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

參考資源

  1. NumPy 官方文檔
  2. SymPy 官方文檔
  3. Khan Academy 線性代數課程
  4. MIT OpenCourseWare 線性代數課程
  5. 《線性代數及其應用》by Gilbert Strang
感謝您閱讀我的文章。歡迎隨時分享你的想法。
後端開發 Python 線性代數 數學
關於 Calpa

Calpa 擅長使用 TypeScriptReact.jsVue.js 建立 Responsive Website。

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

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