HOWTO · Python

在 Python 中計算反正切

本教程演示瞭如何在 Python 中計算反正切。

本頁內容

反正切也稱為 arctan,回答的是「哪個角度的正切值等於這個數值?」在 Python 中,單一數值可使用 math.atan(),陣列元素運算可使用 numpy.arctan(),若要讓輸入維持符號運算式,則可使用 sympy.atan()。前兩者是數值 API;SymPy 會以符號方式表示這個關係,直到你要求它計算數值。

單一數值使用 math.atan()

標準函式庫中的 math 模組最適合處理單一數值,因此不需要安裝第三方套件。將正切值傳入 math.atan(),結果會是以弧度表示的角度。只有在應用程式的其他部分需要角度制時,才用 math.degrees() 轉換。

執行以下範例:

本節中的程式碼以及顯示的標籤或輸出仍為英文。

import math

tangent = 1
angle_radians = math.atan(tangent)
angle_degrees = math.degrees(angle_radians)
print(angle_radians)
print(angle_degrees)

這個範例示範了可執行的單一數值用法。請依你的輸入調整 tangent;若後續計算會使用 Python 的三角函式,請保留弧度值。若要顯示結果,或介面明確使用角度制,則轉換為角度會很方便。

陣列使用 numpy.arctan()

輸入是陣列,或需要對多個數值套用同一個運算時,請使用 NumPy。NumPy 是選用的相依套件;Python 標準函式庫不提供 NumPy 的陣列型別或向量化函式。numpy.arctan()會逐一計算各元素,並回傳以弧度表示的角度。numpy.degrees()會轉換角度陣列,同時保留逐元素對應的形狀。

本節中的程式碼以及顯示的標籤或輸出仍為英文。

import numpy as np

tangents = np.array([0.0, 1.0, -1.0])
angles_radians = np.arctan(tangents)
angles_degrees = np.degrees(angles_radians)
print(angles_radians)
print(angles_degrees)

若數值資料已表示為 NumPy 陣列,這種做法就很適合。若只處理一個一般的 Python 數值,使用 math.atan()即可避免增加相依套件。這些 API 接受正切值作為輸入;它們不會接受角度並回傳該角度的正切值。

符號運算式使用 sympy.atan()

當輸入包含符號,且你需要的是運算式而非立即得到浮點角度時,請使用 SymPy。SymPy 是選用的第三方套件。明確匯入函式,並用 sympy.Symbol 建立符號;將 x 之類的運算式傳給 sympy.atan(),結果便會維持符號形式。

本節中的程式碼以及顯示的標籤或輸出仍為英文。

import sympy
from sympy import atan

x = sympy.Symbol("x")
angle = atan(x)
print(angle)

符號運算式適合用於代數運算。它與數值結果不同:需要十進位近似值時,先代入符號的值,再呼叫 evalf()。直接進行數值計算時,請使用 math.atan()或 numpy.arctan()。

解讀反正切結果

對有限實數輸入而言,單一引數的反正切會回傳以弧度表示的主值角,範圍介於 -pi/2 和 pi/2 之間,但不包含端點。輸入正無限大或負無限大時,math.atan()和 numpy.arctan()會分別回傳對應端點 pi/2 或 -pi/2。多個角度可能有相同的正切值,因此單靠正切值,atan()無法還原所有可能角度,也無法辨識完整象限。若要根據水平與垂直分量計算方向,請使用雙引數函式 math.atan2(y, x) 或 numpy.arctan2(y, x);這些函式會利用兩個分量的正負號保留象限資訊。

單一數值使用 math.atan(),只有需要時才轉換單位。陣列使用 numpy.arctan(),也可視需要使用 numpy.degrees()轉換。代數運算使用 sympy.atan(),只有需要數值近似值時才求值。請記住,結果預設以弧度表示,並依輸入是純量數值、陣列或符號運算式來選擇函式。