三角函數的計算 (用 SymPy 內的函數)

SymPy 是 Python 裡用來計算數學符號運算的函式庫。這裡我們使用 SymPy 內的三角函數來計算。

首先在 IPython console 內匯入 SymPy 內需要的函數和資料:

 In [1]: from sympy import *

匯入後,在 Spyder 右上方的視窗,點選 Variable explorer,就會看到目前使用的變數。其中 pi 代表圓周率,E 代表自然底數。在 SymPy 裡,可以用 N(expr) 來計算式子或變數的數值解。我們可以輸出 pi 和 E 的值:

 In [2]: N(pi)
 Out[2]: 
 3.14159265358979
 
 In [3]: N(E)
 Out[3]: 
 2.71828182845905

在匯入 sympy 之後,我們就可以使用 SymPy 裡常用的數學函數。其中三角函數是以 sin(x), cos(x), tan(x) 來表示。注意三角函數的運算,變數 x 是以弧度 (radian),而不是角度 (degree)。1 弧度的定義是圓弧長度等於半徑時的圓心角。弧度是實數,通常沒有單位,有時也會用 rad 來表示。一個圓的角度 360° (degree) 相當於弧度 2π (radian)。半個圓 180° 相當於 π。30° 就是 π/6。依此類推。

在 IPython console 內輸入一些例子:

 In [2]: sin(pi / 6)
 Out[2]: 
 1/2

 In [3]: sin(pi / 3)
 Out[3]: 
 sqrt(3)/2

 In [4]: sin(pi / 4)
 Out[4]: 
 sqrt(2)/2

 In [5]: sin(0)
 Out[5]: 
 0

 In [6]: sin(1.75)
 Out[6]: 
 0.983985946873937

 In [7]: sin(pi / 7)
 Out[7]: 
 sin(pi/7)

我們看到在 SymPy 裡,系統會先嘗試用確定的值或公式解表示。若不能,則以數值答案來表示。在第 7 例中,系統直接回傳輸入的式子。此時,我們如果要計算出數值答案,可以用 N(expr) 來求出近似的數值解。也可以用 (expr).evalf() 來表示,求出近似的數值解。例如:

 In [18]: N(sin(pi / 7))
 Out[18]: 
 0.433883739117558

 In [19]: sin(pi / 7).evalf()
 Out[19]: 
 0.433883739117558

 In [20]: N(sin(pi / 6))
 Out[20]: 
 0.500000000000000
 
 In [21]: N(sin(pi / 3))
 Out[21]: 
 0.866025403784439

 In [22]: N(sin(pi / 2))
 Out[22]: 
 1.00000000000000

 In [23]: N(sin(0))
 Out[23]: 
 0

以下試算 cos(x) 的例子:

 In [7]: cos(pi / 6)
 Out[7]: 
 sqrt(3)/2
 
 In [8]: cos(pi / 3)
 Out[8]: 
 1/2

 In [9]: cos(pi / 4)
 Out[9]: 
 sqrt(2)/2

 In [10]: cos(pi / 2)
 Out[10]: 
 0

 In [11]: cos(0.68)
 Out[11]: 
 0.777572718750928

 In [12]: N(cos(pi / 6))
 Out[12]: 
 0.866025403784439
 
 In [13]: N(cos(pi / 3))
 Out[13]: 
 0.500000000000000

tan(x) 函數也可計算,但注意在 x 等於 π/2 或 – π/2 是沒有定義的,tan(x) 分別會是正無限大和負無限大,此時計算結果會輸出 zoo。

 In [12]: tan(pi / 6)
 Out[12]: 
 sqrt(3)/3

 In [13]: tan(pi / 3)
 Out[13]: 
 sqrt(3)

 In [14]: tan(pi / 9)
 Out[14]: 
 tan(pi/9)

 In [15]: tan(pi / 4)
 Out[15]: 
 1
 
 In [29]: tan(pi / 2)
 Out[29]: 
 zoo
 
 In [30]: tan(-pi / 2)
 Out[30]: 
 zoo
 
 In [31]: N(tan(pi / 9))
 Out[31]: 
 0.363970234266202

解三角函數的方程式

我們試著解三角函數的方程式。例如,求sin(x) + 0.7 = 0 的解。先匯入求一元方程式所需的函式庫後,也可用 solveset() 這個函數來計算。

  In [5]: solveset(sin(x) + 0.7, x)
  Out[5]: 
\displaystyle \left\{2 n \pi + 0.775397496610753 + \pi\; |\; n \in \mathbb{Z}\right\} \cup \left\{2 n \pi - 0.775397496610753 + 2 \pi\; |\; n \in \mathbb{Z}\right\}

後記:之前我曾寫了一篇用 math 函式庫裡的三角函數計算的文章,當時數值計算的結果時常會出現近似值,令人心裡略感不安。這裡用 SymPy 的三角函數計算,就傳回較正確的值或數值解。看來用 SymPy 來計算,會比較安心。

關於 SymPy 的安裝:使用前必需確認系統裡有安裝 SymPy。在 Ubuntu 系統下,可以在終端機下輸入以下指令查看目前安裝的版本:
$ sudo dpkg -l | grep sympy
在我的電腦裡,得到 sympy 1.5.1 的回應。

如果還沒安裝,可用以下指令安裝。
$ sudo apt install python3-sympy

參考閱讀:
https://docs.sympy.org/latest/modules/functions/index.html

https://docs.sympy.org/latest/modules/evalf.html