SymPy 是 Python 中強大的符號計算庫,廣泛應用于數學建模、公式推導和科學計算。本文將從兩個核心功能展開:表達式中自由變量的獲取與因式分解的實現,通過完整代碼示例和深入分析,幫助讀者掌握其使用方法。
第一部分:獲取表達式的自由變量
在符號計算中,自由變量(未被積分、求和等操作綁定的符號)的識別是關鍵步驟。SymPy 通過 free_symbols
屬性實現這一功能,支持從簡單到復雜表達式的解析。
1.1 基礎用法:free_symbols
屬性
free_symbols
返回表達式中所有未被綁定的符號集合,自動過濾被積分、求和等操作綁定的變量。
代碼示例
from sympy import symbols, Integral, Derivative, Sum, Function# 定義符號
x, y, z = symbols('x y z')
n = symbols('n', integer=True)
f = Function('f')# 示例1:簡單表達式
expr1 = x + y**2
print("示例1自由變量:", expr1.free_symbols) # 輸出: {x, y}# 示例2:積分表達式(x被積分綁定)
expr2 = Integral(x*y, (x, 0, 1))
print("示例2自由變量:", expr2.free_symbols) # 輸出: {y}# 示例3:導數表達式(變量不綁定)
expr3 = Derivative(f(x), x) + y
print("示例3自由變量:", expr3.free_symbols) # 輸出: {x, y}# 示例4:求和表達式(n被求和綁定)
expr4 = Sum(x*n, (n, 0, 5))
print("示例4自由變量:", expr4.free_symbols) # 輸出: {x}# 示例5:復雜復合表達式(y被積分綁定)
expr5 = Integral(Derivative(f(x), x) + y, (y, 0, z))
sorted_vars = sorted(expr5.free_symbols, key=lambda s: s.name)
print("示例5自由變量(排序后):", sorted_vars) # 輸出: [x, z]
關鍵點分析
- 積分與求和:操作中的積分變量(如
x
)或求和索引(如n
)會被自動排除。 - 導數與函數:導數操作(如
Derivative(f(x), x)
)不會綁定變量,x
仍視為自由變量。 - 結果排序:通過
sorted(..., key=lambda s: s.name)
按符號名稱排序,提升可讀性。
第二部分:因式分解的實現
SymPy 的 factor
函數支持從簡單多項式到復雜表達式的分解,并可擴展至自定義數域。
2.1 基礎因式分解
使用 factor(expr)
對多項式進行有理數域上的分解。
代碼示例
from sympy import symbols, factorx, y = symbols('x y')# 單變量分解
expr1 = x**2 - 4
print("分解1:", factor(expr1)) # 輸出: (x - 2)*(x + 2)# 多變量分解
expr2 = x**2*y + x*y**2
print("分解2:", factor(expr2)) # 輸出: x*y*(x + y)
2.2 擴展數域分解
通過 extension
參數指定數域(如復數域),分解包含無理數的表達式。
代碼示例
from sympy import factor, sqrt,symbols
x = symbols('x')
# 默認無法分解的表達式
expr3 = x**2 - 2
print("默認分解:", factor(expr3)) # 輸出: x2 - 2# 擴展至包含√2的域
print("擴展分解:", factor(expr3, extension=sqrt(2))) # 輸出: (x - √2)*(x + √2)
2.3 分式表達式分解
分解分子和分母后,使用 cancel
函數化簡分式。
代碼示例
from sympy import factor, cancel,symbols
x = symbols('x')
# 分式分解與化簡
expr4 = (x**2 - 4)/(x**2 - 3*x + 2)
factored4 = factor(expr4)
simplified4 = cancel(factored4)
print("分式分解:", factored4)
print("化簡后:", simplified4)
2.4 復雜多項式分解
支持含三角函數或高次多項式的分解。
代碼示例
from sympy import cos, factor,symbols
x,y = symbols('x,y')
# 含三角函數的表達式
expr5 = x**2 - 2*cos(y)*x + cos(y)**2
print("三角分解:", factor(expr5)) # 輸出: (x - cos(y))**2# 高次多項式分解
expr6 = x**5 - x**4 - 2*x**3 + 2*x**2 + x - 1
print("高次分解:", factor(expr6))
2.5 不可分解表達式處理
對無法分解的表達式,使用 roots
分析根或 expand
展開驗證。
代碼示例
from sympy import roots, expand,symbols,factor
x = symbols('x')
# 無法分解的表達式
expr7 = x**2 + x + 1
print("分解結果:", factor(expr7)) # 輸出: x2 + x + 1# 檢查有理數域根
print("根檢查:", roots(expr7)) # 輸出: {}# 驗證展開一致性
expr8 = (x + 1)**2
expanded = expand(expr8)
print("展開驗證:", expanded) # 輸出: x2 + 2x + 1
總結與對比
功能 | 核心方法 | 應用場景 |
---|---|---|
自由變量提取 | expr.free_symbols | 分析表達式依賴的獨立變量 |
基礎因式分解 | factor(expr) | 單變量/多變量多項式分解 |
擴展數域分解 | factor(expr, extension) | 處理含無理數(如√2, i)的表達式 |
分式化簡 | factor + cancel | 分子分母分解后約簡 |
復雜結構分解 | factor(expr) | 高次多項式、三角函數表達式 |
不可分解表達式分析 | roots(expr) | 檢查根的存在性或驗證表達式等效性 |
完整代碼整合
# 自由變量提取
from sympy import symbols, Integral, Derivative, Sum, Functionx, y, z = symbols('x y z')
n = symbols('n', integer=True)
f = Function('f')expr_a = Integral(Derivative(f(x), x) + y, (y, 0, z))
print("自由變量:", sorted(expr_a.free_symbols, key=lambda s: s.name)) # [x, z]# 因式分解
from sympy import factor, cancel, sqrt, cosexpr_b = (x**2 - 4)/(x**2 - 3*x + 2)
print("分式分解:", cancel(factor(expr_b))) # (x + 2)/(x - 1)expr_c = x**5 - x**4 - 2*x**3 + 2*x**2 + x - 1
print("高次分解:", factor(expr_c))
通過本文的代碼與解析,讀者可掌握 SymPy 在自由變量提取和因式分解中的核心方法,并靈活應用于符號計算、工程建模等領域。進一步學習可參考 SymPy 官方文檔。