跳轉到

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 生態,是學習者的首選。

練習

  1. 用 SymPy 解 \(x^3 - 1 = 0\) ,觀察輸出中出現了什麼特別的數(提示:虛數與複數根)。
  2. 對照表格說明:下列任務該用 SymPy 還是 NumPy?(a) 化簡 \(\sin^2 x + \cos^2 x\) ;(b) 對 100 萬個感測器讀值求平均。
  3. 上 SymPy Gamma(gamma.sympy.org)輸入 integrate(x^2, x),比較與本地 SymPy 輸出是否一致。