1.2 SymPy 簡介#
本節目標#
- 認識 SymPy:它是什麼、能做什麼
- 了解 SymPy 在 Python 科學計算生態中的位置
- 知道它與 Mathematica、Maple 等商業軟體的差異
SymPy 是什麼?#
SymPy 是一個純 Python 寫成的電腦代數系統(CAS),可以做:
- 多項式展開、因式分解、化簡
- 解方程式(代數方程、微分方程)
- 微積分:極限、微分、積分、級數展開
- 線性代數:矩陣運算、行列式、特徵值
- 離散數學:排列組合、數論
它最大的特色是純 Python——不依賴任何編譯過的底層套件,安裝只有幾 MB,任何能跑 Python 的地方都能跑 SymPy。
SymPy 在 Python 科學生態中的位置#
Python 的科學計算生家族譜大致是:
科學計算基礎層:NumPy(陣列與數值運算)、SciPy(數值演算法)
視覺化層: Matplotlib(繪圖)
符號計算層: SymPy(數學表達式)
資料層: pandas(表格資料)
SymPy 與 NumPy 的關係尤其值得釐清,兩者很容易混淆:
| 面向 | SymPy | NumPy |
|---|---|---|
| 定位 | 符號計算(CAS) | 數值計算(陣列運算) |
| \(\sqrt{2}\) 是什麼 | 精確的符號 \(\sqrt{2}\) | 近似值 1.41421356... |
| 解 \(x^2 - 2 = 0\) | 得到 \(\pm\sqrt{2}\) 的精確符號解 | 得不到(這不是它的工作) |
| 計算 100 萬筆資料的平方根 | 不適合(太慢) | 適合(向量化,非常快) |
| 輸出 | 數學式、LaTeX | 陣列數值 |
| 底層實作 | 純 Python | C 語言核心 |
兩者可以合作:SymPy 算出符號公式後,可以用 lambdify() 把公式轉成 NumPy 函數,快速代入大量數值——先「求真」再「求快」,這是實務上常見的工作流程。
import sympy as sp
import numpy as np
x = sp.Symbol('x')
f = sp.integrate(sp.sin(x)**2, x) # 符號積分
print(f) # x/2 - sin(2x)/4
g = sp.lambdify(x, f, 'numpy') # 轉成 NumPy 函數
print(g(np.array([0.5, 1.0, 2.0]))) # 大量數值代入
與 Mathematica / Maple 的差異#
| 面向 | SymPy | Mathematica | Maple |
|---|---|---|---|
| 授權 | 免費開源(BSD) | 商業授權,昂貴 | 商業授權,昂責 |
| 語言 | Python | Wolfram 自有語言 | 自有語言 |
| 安裝大小 | 約幾 MB | 數 GB | 數 GB |
| 嵌入能力 | 可嵌進任何 Python 程式、網頁後端 | 獨立系統 | 獨立系統 |
| 功能廣度 | 較小但涵蓋大學數學核心 | 極大 | 極大 |
對數學系與工程系學生來說,SymPy 覆蓋的範圍(微積分、線性代數、常微分方程)已足夠應付大學低年級課程;而「免費 + 就是 Python」這兩點,讓它成為入門 CAS 的最佳選擇。
安裝方式#
只要電腦有 Python(3.8 以上),一行指令就裝好:
pip install sympy
驗證安裝:
python -c "import sympy; print(sympy.__version__)"
若你使用 Anaconda,SymPy 通常已經內建,連裝都不用裝(下一節會詳談環境建置)。
GitHub 生態#
SymPy 的原始碼在 github.com/sympy/sympy,擁有上萬顆星標,是由全球社群維護的活躍開源專案。圍繞它還有一批衍生工具:
- SymPy Gamma:線上版 SymPy,網頁上直接輸入數學式運算
- SymPy Live:瀏覽器裡的 SymPy 互動 shell
- Jupyter:與 Jupyter Notebook 深度整合,可直接顯示漂亮的數學式
- sympy.physics 等模組:力學、量子力學等領域應用
遇到問題時,官方文件(docs.sympy.org)與 GitHub Issues 是最好的求助管道。
動手實驗#
實驗 1:安裝並驗證 SymPy,記下你的版本號:
pip install sympy
python -c "import sympy; print(sympy.__version__)"
實驗 2:一分鐘體驗 SymPy 的威力。執行以下程式碼,逐行理解輸出:
from sympy import symbols, solve, diff, integrate, sin, x # 見下方修正
正確寫法(x 要自己宣告):
from sympy import symbols, solve, diff, integrate, sin
x = symbols('x')
print(solve(x**2 - 2, x)) # 解方程:[-sqrt(2), sqrt(2)]
print(diff(sin(x)*x**2, x)) # 微分:2*x*sin(x) + x**2*cos(x)
print(integrate(1/x, x)) # 積分:log(x)
實驗 3:體驗符號與數值結合的威力——算出圓面積公式再代入數值:
from sympy import symbols, pi, lambdify
import numpy as np
r = symbols('r', positive=True)
area = pi * r**2
g = lambdify(r, area, 'numpy')
print(g(np.array([1.0, 2.0, 3.0])))
小結與練習#
- SymPy 是純 Python、免費開源的 CAS,擅長精確的符號運算。
- SymPy 管「符號、精確」,NumPy 管「數值、速度」,透過
lambdify()可以互補合作。 - 相比 Mathematica / Maple,SymPy 免費、輕量、可嵌入 Python 生態,是學習者的首選。
練習
- 用 SymPy 解 \(x^3 - 1 = 0\) ,觀察輸出中出現了什麼特別的數(提示:虛數與複數根)。
- 對照表格說明:下列任務該用 SymPy 還是 NumPy?(a) 化簡 \(\sin^2 x + \cos^2 x\) ;(b) 對 100 萬個感測器讀值求平均。
- 上 SymPy Gamma(gamma.sympy.org)輸入
integrate(x^2, x),比較與本地 SymPy 輸出是否一致。