分類: 實用工具

SymPy:使用 Python 幫你導煩人的數學公式

SymPy 是一個可以進行數學代數運算的 Python 模組,他的發展目標是一個完整的電腦代數系統,而此模組完全都是使用 Python 寫成的,所以不需要依賴其他的函式庫。

準備 SymPy 環境

在 Ubuntu 或 Debian Linux 中若要安裝 SymPy,可以直接使用 apt 安裝:

sudo apt-get install python-sympy

裝完之後,接著就可以執行 Python 了:

python

進入 Python 的互動式模式(interactive mode)之後,就會看到三個大於符號(>>>),這就是 Python 的主要命令提示字元(primary prompt)。

如果是只要使用 SymPy 的功能,可以使用 isympy 這個指令,這是專門為了 SymPy 而設計的互動式介面,其實跟 Python 的互動式環境一樣,但是 isympy 會在一開始設定一些基本的變數與環境,讓使用起來更方便。

藍色的 In 就是輸入指令的地方,輸出則是紅色的 Out,後面中括弧中的數字是自動編上去的行號。

如果不想那麼麻煩安裝 SymPy,也可以直接使用 SymPy Live,直接在網頁上運行 SymPy,其實更方便,開啓網頁後,左下方就可以直接輸入 Python 指令了。

而 SymPy Live 的環境就跟上面的 isympy 差不多,一開始就會把一些基本的變數與環境設定好。這種線上版本的排版比一般終端機還要漂亮,我們在這裡執行相同的指令,與上面的 isympy 比較一下。

因為 SymPy Live 是用 MathJax 來顯示數學式子的,所以看起來很漂亮,幾乎跟 LaTeX 的排版差不多。若是沒什麼特別需求,用這個就很棒了,省去安裝的麻煩。

開始使用 SymPy

接著就可以輸入 Python 指令了,在使用之前要先載入 sympy 這個 Python 模組,輸入:

>>> from sympy import *

輸入完這行指令之後,記得按下 Enter 鍵,正常的話應該沒有什麼訊息出現。這個指令是將 sympy 中所有的東西都載入進來,如果一開始執行了這行指令,之後所有的 import 步驟都可以省略,而如果不想一次載入所有的東西也可以,那就按照下面的 import 作法,需要使用時才載入。

接著就可以來使用 SymPy 了,首先來介紹一些基本的使用方式。在 SymPy 中的數值分為三種類型,分別為浮點數(Float)、有理數(Rational)與整數(Integer)。有理數是由兩個整數相除所得到的數值,例如 Rational(1, 2) 則代表 1/2:

>>> from sympy import Rational
>>> a = Rational(1, 2)

>>> a
1/2

>>> a*2
1

>>> Rational(2)**50/Rational(10)**50
1/88817841970012523233890533447265625

在使用浮點數與整數運算時(尤其是除法)要注意所使用的數值是 SymPy 數值或是原生的 Python 數值,若是使用一般原生的 Python 數值,相除的結果會是浮點數,若在 isympy 中則會使用 __future__ 中的 division 進行除法運算。

>>> 1/2
0.5

若是在舊版的 Python 2 中,division 沒有被 import,則結果會被 truncated:

>>> 1/2
0

這兩種狀況都是使用 Python 原生的數值,不是 SymPy 數值,在大部分的狀況下,在使用 SymPy 時都會使用 SymPy 數值,所以其實可以使用這樣的方式簡化程式碼:

>>> R = Rational
>>> R(1, 2)
1/2

>>> R(1)/2
1/2

最後一個指令中 R(1) 會得到一個 Rational 數值,再除以原生的 Python 數值 2,得到的結果也是一個 Rational 數值。

在數學上有一些常數,例如圓周率(pi)與尤拉常數(e),在 SymPy 中也有支援,在運算時他會以符號的方式進行運算,也就是說 1 + pi 不會計算成浮點數 4.14,而會保持 1 + pi 這個形式,若是要算出實際的浮點數,可以使用 evalf() 這個函數。

>>> from sympy import pi, E
>>> pi**2
pi**2

>>> pi.evalf()
3.14159265358979

>>> (pi + E).evalf()
5.85987448204884

數學上的無限大(infinity)在 SymPy 中也有,表示方式為兩個 o(看起來就像是無限大的寫法)。

>>> from sympy import oo
>>> oo
oo

>>> oo + 1
oo

Page: 1 2 3 4 5

G. T. Wang

個人使用 Linux 經驗長達十餘年,樂於分享各種自由軟體技術與實作文章。

Share
Published by
G. T. Wang
標籤: 數學

Recent Posts

光陽 KYMCO GP 125 機車接電發動、更換電瓶記錄

本篇記錄我的光陽 KYMCO ...

2 年 ago

[開箱] YubiKey 5C NFC 實體金鑰

本篇是 YubiKey 5C ...

3 年 ago

[DIY] 自製竹火把

本篇記錄我拿竹子加上過期的苦茶...

3 年 ago