用 SymPy 的數學函數來做計算
SymPy 模組是 Python 程式裡一個功能很強大的數學計算模組,可以做符號運算得到公式解,也可以做數值運算得到數值解。從基本的數學計算,到求方程式的解,算微積分,都可以用 SymPy 內的函數來計算。
在使用 SymPy 時,必需在程式的開頭引入 sympy 模組:
from sympy import *
接下來,就可以使用 SymPy 的函數了。
SymPy 中常用的數學函數
分類 | 函數 | 描述 | 例子 |
---|---|---|---|
基礎運算 | simplify(expr) |
簡化表達式 | simplify(sin(x)**2 + cos(x)**2) → 1 |
expand(expr) |
展開表達式 | expand((x + 1)**2) → x**2 + 2*x + 1 |
|
factor(expr) |
因式分解表達式 | factor(x**2 - 2*x - 8) → (x - 4)*(x + 2) |
|
代數 | solveset(equation, var) |
解方程式 | solveset(x**2 - 4, x) → {-2, 2} |
微積分 | diff(expr, var) |
對表達式進行微分 | diff(sin(x), x) → cos(x) |
integrate(expr, var) |
對表達式進行積分 | integrate(exp(x), x) → exp(x) |
|
limit(expr, var, point) |
計算表達式的極限 | limit(sin(x)/x, x, 0) → 1 |
|
三角函數 | sin(x), cos(x), tan(x) |
三角函數 | sin(pi / 2) → 1 |
asin(x), acos(x), atan(x) |
反三角函數 | asin(1) → π/2 |
|
指數對數 | exp(x) |
指數函數 | exp(1) → E |
log(x, base) |
對數函數,base 默認為 e |
log(e) → 1 |
在 SymPy 裡,圓周率 π 在 SymPy 裡是以 pi
來表示。自然對數的底數 e 是以 E
來表示。
在這裡,我們先介紹如何用 SymPy 內的函數來做三角函數,指數,和對數的計算。
例如,要計算 sin(30°),要以弧度 sin(π/6) 來計算:
sin(pi / 6)
\(\displaystyle \frac{1}{2}\)
我們看到 SymPy 內建是以分數來呈現計算的結果。
如果要以數值解來呈現,可以在要後面加上 .n()
,就會以小數呈現數值解:
sin(pi / 6).n()
\(\displaystyle 0.5\)
這裡看到,它算出正確的值 0.5。而不是像在前一篇文章用 math
模組中算出的近似值 0.49999999999999994。
對數的用法,若沒有指定底數 (base),就會以自然對數的底數 e 來計算:
log(100).n()
\(\displaystyle 4.60517018598809\)
若要計算以 10 為底數的對數,可以輸入:
log(100, 10).n()
\(\displaystyle 2.0\)
指數可以用 Pow( ) 這個函數,例如要計算 2 的 3 次方:
Pow(2, 3)
\(\displaystyle 8\)
SymPy 的主要功能之一是可以做數學的符號運算,例如解方程式 \(x^2 + 3x - 2 = 0\)
# 先設未知數 x
x = Symbol("x")
# 計算方程式的解
solveset(x**2 + 3*x - 2, x)
\(\displaystyle \left\{- \frac{3}{2} + \frac{\sqrt{17}}{2}, - \frac{\sqrt{17}}{2} - \frac{3}{2}\right\}\)
如果要用數值解呈現上面的計算結果,可以用以下表示:
solveset(x**2 + 3*x - 2, x).n()
\(\displaystyle \left\{-3.56155281280883, 0.56155281280883\right\}\)
SymPy 的符號運算功能很豐富,也可以用來計算代數,微積分,和數學其它領域。對於用電腦做數學符號計算有興趣的讀者,可以更深入地學習 SymPy。