一文帶您了解SymPy:使用Python進行符號數學運算
SymPy 是一個 Python 庫,專注于符號計算,提供了處理數學表達式、方程和公式的工具。與數值計算庫不同,SymPy 能夠進行符號微分、積分、極限等運算,適用于代數運算、微積分和方程求解等。與傳統的數值計算庫(如 NumPy)不同,SymPy 主要用于處理數學表達式、方程和公式的符號計算,而不是進行數值計算。
它支持多項式運算、矩陣操作、特征值計算等線性代數功能,并能處理數論和組合數學中的問題。SymPy 還具備簡化數學表達式的功能,并能繪制數學函數和圖形。作為一個完全用 Python 實現的開源庫,SymPy 易于集成到 Python 環境中,廣泛應用于學術研究、教育以及需要符號計算的領域。
什么是 SymPy?
它是計算機代數系統(computer alegebra systems,CAS)的一部分:一個允許我們進行代數和數學計算的庫。
主要功能:
- 簡化、重排、因式分解和展開代數表達式和方程。
- 求解各種類型的方程,包括線性方程、多項式方程和微分方程。
- 執行微積分運算,包括微分和積分。
- 繪制圖形。
- 生成原始 LaTeX 輸出。
- 生成渲染的 LaTeX 輸出。
安裝SymPy
pip install sympy
圖片
簡化和展開
首先,導入 SymPy。然后定義 SymPy 變量,才能使用它們。通過創建 SymPy 的 symbols 來實現這一點。這些符號代表了數學變量:
import sympy
from sympy import latex
a, b, x, y = sympy.symbols("a b x y")
display(a,b,x,y)
圖片
然后,我們可以構建表達式和方程:
from IPython.display import Markdown, display
a = (x + 1)**2
b = x**2 + 2*x + 1
display(a)
print(latex(a))
display(b)
# Expand a...
expanded = sympy.expand(a)
display(Markdown(f"$a = {latex(expanded)}$"))
# Show a-b without simplifying...
a_minus_b = a-b
display(Markdown(f"$a-b = {latex(a_minus_b)}$"))
# Simplify...
display(Markdown(f"$a-b$ $= {latex(sympy.simplify(a_minus_b))}$"))
圖片
等式判斷
我們可以測試兩個表達式是否相同,方法如下:
圖片
變量賦值和評估
在定義了一個 SymPy 符號并將其分配給 Python 變量后,不能簡單地給 Python 變量賦值。如果這樣做,變量將不再是一個符號。相反,你需要使用 subs() 方法將值與 SymPy 符號關聯起來:
x, y = sympy.symbols("x y")
expr = x+y
result = expr.subs({x: 2, y: 5})
print(f"{expr=}, {result=}")
圖片
微分和積分
在 SymPy 中,積分和微分非常簡單:
x = sympy.symbols("x")
expr = x**2
display(expr)
deriv = sympy.diff(expr)
display(deriv)
integral = sympy.integrate(deriv)
display(integral)
圖片
求解二次方程
求解二次方程很簡單,只需提供二次方程的系數,然后運行 SymPy 的 solve() 函數即可:
expr = x**2 + 3*x - 10
solutions = sympy.solve(expr, x, dict=True)
for solution in solutions:
print(f"x={solution[x]}")
圖片
有時,我們只希望看到實數解,而不是復數解。(復數解是包含虛數部分的解,即以負數平方根表示的解。)在這種情況下,我們可以使用 solveset() 并指定僅允許實數的域。例如:
expressions = []
expressions.append(x**2 - 9)
expressions.append(x**2 + 9)
for expr in expressions:
display(expr)
solutions = sympy.solveset(expr, x)
display(solutions)
display(expressions[-1])
solutions = sympy.solveset(expressions[-1], x, domain=sympy.S.Reals)
print(f"There are {len(solutions)} real solutions for x.")
圖片
轉換為數值
SymPy 返回的結果是精確的數學符號。但有時我們希望將這些結果轉換為數值表示,可以使用evalf 函數。示例如下:
expr=sympy.sqrt(8)
display(expr)
display(expr.evalf(4))
圖片
繪制圖形
使用 SymPy 繪制圖形使用 SymPy 的 plot 函數,支持函數、隱函數和參數方程,下面是小幾個例子。
- 繪制簡單的函數圖形:
from sympy import symbols
from sympy.plotting import plot
x = symbols('x')
f = x**2 + 2*x + 1
plot(f, (x, -10, 10), title="Plot of f(x) = x^2 + 2x + 1")
圖片
- 繪制多個函數在同一圖形上
from sympy import symbols
from sympy.plotting import plot
x = symbols('x')
f = x**2
g = x**3
plot(f, g, (x, -10, 10), title="Plot of f(x) = x^2 and g(x) = x^3",legend=True)
圖片
- 繪制隱函數圖形
from sympy import symbols, Eq
from sympy.plotting import plot_implicit
x, y = symbols('x y')
eq = Eq(x**2 + y**2, 9)
plot_implicit(eq, (x, -5, 5), (y, -5, 5), title="Plot of Circle x^2 + y^2 = 9")
圖片
- 繪制參數方程圖形
from sympy import symbols, cos, sin, pi
from sympy.plotting import plot_parametric
t = symbols('t')
x = cos(t)
y = sin(t)
plot_parametric(x, y, (t, 0, 2*pi), title="Plot of a Circle")
圖片
SymPy 非常適合需要代數運算的問題。它可以用于求解復雜的方程和進行微積分運算。這里提供了一個快速入門的概述,并展示了一些使用 SymPy 的簡單例子。