在 Python 中計算三角函數(sin、cos、tan、arcsin、arccos、arctan)

商業

使用 Python 的數學函數標準模塊 math,您可以計算三角函數(sin、cos、tan)和反三角函數(arcsin、arccos、arctan)。

下面的內容在這裡用示例代碼來解釋。

  • 圓周率 (3.1415926..):math.pi
  • 角度轉換(弧度、度):math.degrees(),math.radians()
  • 正弦、反正弦:math.sin(),math.asin()
  • 餘弦,反餘弦:math.cos(),math.acos()
  • 正切,反正切:math.tan(),math.atan(),math.atan2()
  • 以下差異:math.atan(),math.atan2()

圓周率 (3.1415926..):math.pi

Pi 在數學模塊中作為常數提供。它表達如下。
math.pi

import math

print(math.pi)
# 3.141592653589793

角度轉換(弧度、度):math.degrees(),math.radians()

數學模塊中的三角函數和反三角函數使用弧度作為角度單位。

使用 math.degrees() 和 math.radians() 在弧度(弧度法)和度數(度法)之間進行轉換。

Math.degrees() 將弧度轉換為度數,而 math.radians() 將度數轉換為弧度。

print(math.degrees(math.pi))
# 180.0

print(math.radians(180))
# 3.141592653589793

正弦、反正弦:math.sin(),math.asin()

求正弦 (sin) 的函數是 math.sin(),求反正弦 (arcsin) 的函數是 math.asin()。

這是一個查找 30 度正弦的示例,使用 math.radians() 將度數轉換為弧度。

sin30 = math.sin(math.radians(30))
print(sin30)
# 0.49999999999999994

30度的正弦是0.5,但是因為pi這個無理數不能準確計算,所以有誤差。

如果您希望四捨五入到適當的位數,請使用 round() 函數或 format() 方法或 format() 函數。

注意round() 的返回值是一個數字(int 或float),而format() 的返回值是一個字符串。如果您想將其用於後續計算,請使用 round()。

print(round(sin30, 3))
print(type(round(sin30, 3)))
# 0.5
# <class 'float'>

print('{:.3}'.format(sin30))
print(type('{:.3}'.format(sin30)))
# 0.5
# <class 'str'>

print(format(sin30, '.3'))
print(type(format(sin30, '.3')))
# 0.5
# <class 'str'>

round() 函數指定小數位數作為其第二個參數。請注意,這不是嚴格的四捨五入。有關詳細信息,請參閱以下文章。

format() 方法和 format() 函數指定格式化規範字符串中的小數位數。有關詳細信息,請參閱以下文章。

如果要比較,也可以使用 math.isclose()。

print(math.isclose(sin30, 0.5))
# True

類似地,這裡是一個求 0.5 的反正弦的示例。 math.asin() 返回弧度,使用 math.degrees() 將其轉換為度數。

asin05 = math.degrees(math.asin(0.5))
print(asin05)
# 29.999999999999996

print(round(asin05, 3))
# 30.0

餘弦,反餘弦:math.cos(),math.acos()

求餘弦 (cos) 的函數是 math.cos(),求反餘弦 (arc cosine, arccos) 的函數是 math.acos()。

這是一個求 60 度的餘弦和 0.5 的反餘弦的示例。

print(math.cos(math.radians(60)))
# 0.5000000000000001

print(math.degrees(math.acos(0.5)))
# 59.99999999999999

如果您希望四捨五入到適當的數字,您可以像使用正弦一樣使用 round() 或 format()。

正切,反正切:math.tan(),math.atan(),math.atan2()

求正切 (tan) 的函數是 math.tan(),求反正切 (arctan) 的函數是 math.atan() 或 math.atan2()。
Math.atan2() 稍後描述。

求 45 度的正切和 1 度的反正切的示例如下所示。

print(math.tan(math.radians(45)))
# 0.9999999999999999

print(math.degrees(math.atan(1)))
# 45.0

math.atan() 和 math.atan2() 之間的區別

math.atan() 和 math.atan2() 都是返回反正切的函數,但它們的參數數量和返回值範圍不同。

math.atan(x) 有一個參數,並以弧度返回 arctan(x)。返回值將介於 -pi \ 2 和 pi \ 2 之間(-90 到 90 度)。

print(math.degrees(math.atan(0)))
# 0.0

print(math.degrees(math.atan(1)))
# 45.0

print(math.degrees(math.atan(-1)))
# -45.0

print(math.degrees(math.atan(math.inf)))
# 90.0

print(math.degrees(math.atan(-math.inf)))
# -90.0

在上面的示例中,math.inf 表示無窮大。

math.atan2(y, x) 有兩個參數,並以弧度返回 arctan(y \ x)。這個角度是從原點到坐標(x,y)的向量在極坐標平面中與x軸正方向所成的角度(偏角),返回值在-pi和pi之間(-180至 180 度)。

由於第二象限和第三象限的角度也可以正確獲得,因此在考慮極坐標平面時,math.atan2() 比 math.atan() 更合適。

請注意,參數的順序是 y, x,而不是 x, y。

print(math.degrees(math.atan2(0, 1)))
# 0.0

print(math.degrees(math.atan2(1, 1)))
# 45.0

print(math.degrees(math.atan2(1, 0)))
# 90.0

print(math.degrees(math.atan2(1, -1)))
# 135.0

print(math.degrees(math.atan2(0, -1)))
# 180.0

print(math.degrees(math.atan2(-1, -1)))
# -135.0

print(math.degrees(math.atan2(-1, 0)))
# -90.0

print(math.degrees(math.atan2(-1, 1)))
# -45.0

如上例,x軸的負方向(y為零,x為負)為pi(180度),但當y為負零時,為-pi(-180度)。如果您想嚴格處理標誌,請小心。

print(math.degrees(math.atan2(-0.0, -1)))
# -180.0

負零是以下操作的結果

print(-1 / math.inf)
# -0.0

print(-1.0 * 0.0)
# -0.0

整數不被視為負零。

print(-0.0)
# -0.0

print(-0)
# 0

即使 x 和 y 都為零,結果也取決於符號。

print(math.degrees(math.atan2(0.0, 0.0)))
# 0.0

print(math.degrees(math.atan2(-0.0, 0.0)))
# -0.0

print(math.degrees(math.atan2(-0.0, -0.0)))
# -180.0

print(math.degrees(math.atan2(0.0, -0.0)))
# 180.0

還有其他示例,其中結果的符號根據負零而變化,例如 math.atan2() 以及 math.sin()、math.asin()、math.tan() 和 math.atan() .

print(math.sin(0.0))
# 0.0

print(math.sin(-0.0))
# -0.0

print(math.asin(0.0))
# 0.0

print(math.asin(-0.0))
# -0.0

print(math.tan(0.0))
# 0.0

print(math.tan(-0.0))
# -0.0

print(math.atan(0.0))
# 0.0

print(math.atan(-0.0))
# -0.0

print(math.atan2(0.0, 1.0))
# 0.0

print(math.atan2(-0.0, 1.0))
# -0.0

請注意,到目前為止的示例是在 CPython 中運行程序的結果。請注意,其他實現或環境可能以不同方式處理負零。