cmath — 複數的數學函式


此模組提供對複數數學函式的訪問。此模組中的函式接受整數、浮點數或複數作為引數。它們也接受任何具有 __complex__()__float__() 方法的 Python 物件:這些方法分別用於將物件轉換為複數或浮點數,然後將函式應用於轉換結果。

注意

對於涉及分支切割的函式,我們面臨如何在切割本身上定義這些函式的問題。根據 Kahan 的“複數基本函式的分支切割”論文,以及 C99 和後續 C 標準的附件 G,我們使用零的符號來區分分支切割的一側和另一側:對於沿(一部分)實軸的分支切割,我們檢視虛部的符號,而對於沿虛軸的分支切割,我們檢視實部的符號。

例如,cmath.sqrt() 函式沿負實軸有一個分支切割。 引數 complex(-2.0, -0.0) 被視為位於分支切割的下方,因此在負虛軸上給出結果。

>>> cmath.sqrt(complex(-2.0, -0.0))
-1.4142135623730951j

但引數 complex(-2.0, 0.0) 被視為位於分支切割的上方。

>>> cmath.sqrt(complex(-2.0, 0.0))
1.4142135623730951j

極座標與直角座標之間的轉換

Python 複數 z 在內部使用直角笛卡爾座標儲存。它完全由其實部 z.real虛部 z.imag 確定。

極座標提供了一種表示複數的替代方法。在極座標中,複數 z 由模量 r 和相位角 phi 定義。模量 r 是從 z 到原點的距離,而相位 phi 是以弧度測量的從正 x 軸到連線原點到 z 的線段的逆時針角度。

以下函式可用於從本機直角座標轉換為極座標並返回。

cmath.phase(x)

返回 x 的相位(也稱為 x輻角),以浮點數表示。phase(x) 等價於 math.atan2(x.imag, x.real)。結果位於範圍 [-π, π] 內,並且此操作的分支切割沿負實軸。 結果的符號與 x.imag 的符號相同,即使 x.imag 為零。

>>> phase(complex(-1.0, 0.0))
3.141592653589793
>>> phase(complex(-1.0, -0.0))
-3.141592653589793

注意

複數 x 的模(絕對值)可以使用內建的 abs() 函式計算。沒有單獨的 cmath 模組函式用於此操作。

cmath.polar(x)

返回 x 的極座標表示形式。 返回一對 (r, phi),其中 rx 的模,phi 是 x 的相位。polar(x) 等價於 (abs(x), phase(x))

cmath.rect(r, phi)

返回具有極座標 rphi 的複數 x。 等價於 complex(r * math.cos(phi), r * math.sin(phi))

冪和對數函式

cmath.exp(x)

返回 ex 次冪,其中 e 是自然對數的底數。

cmath.log(x[, base])

返回 x 對給定 base 的對數。如果未指定 base,則返回 x 的自然對數。有一個分支切割,從 0 沿負實軸到 -∞。

cmath.log10(x)

返回 x 的以 10 為底的對數。 這具有與 log() 相同的分支切割。

cmath.sqrt(x)

返回 x 的平方根。這具有與 log() 相同的分支切割。

三角函式

cmath.acos(x)

返回 x 的反餘弦。 有兩個分支切割:一個從 1 沿實軸向右延伸到 ∞。另一個從 -1 沿實軸向左延伸到 -∞。

cmath.asin(x)

返回 x 的反正弦。 這具有與 acos() 相同的分支切割。

cmath.atan(x)

返回 x 的反正切。 有兩個分支切割:一個從 1j 沿虛軸延伸到 ∞j。另一個從 -1j 沿虛軸延伸到 -∞j

cmath.cos(x)

返回 x 的餘弦。

cmath.sin(x)

返回 x 的正弦值。

cmath.tan(x)

返回 x 的正切值。

雙曲函式

cmath.acosh(x)

返回 x 的反雙曲餘弦值。有一個分支切割,從實軸上的 1 沿左側延伸到 -∞。

cmath.asinh(x)

返回 x 的反雙曲正弦值。有兩個分支切割:一個從 1j 沿虛軸延伸到 ∞j。另一個從 -1j 沿虛軸延伸到 -∞j

cmath.atanh(x)

返回 x 的反雙曲正切值。有兩個分支切割:一個從實軸上的 1 延伸到 。另一個從實軸上的 -1 延伸到 -∞

cmath.cosh(x)

返回 x 的雙曲餘弦值。

cmath.sinh(x)

返回 x 的雙曲正弦值。

cmath.tanh(x)

返回 x 的雙曲正切值。

分類函式

cmath.isfinite(x)

如果 x 的實部和虛部都是有限的,則返回 True,否則返回 False

3.2 版本中新增。

cmath.isinf(x)

如果 x 的實部或虛部是無窮大,則返回 True,否則返回 False

cmath.isnan(x)

如果 x 的實部或虛部是 NaN,則返回 True,否則返回 False

cmath.isclose(a, b, *, rel_tol=1e-09, abs_tol=0.0)

如果值 ab 彼此接近,則返回 True,否則返回 False

兩個值是否被認為接近取決於給定的絕對和相對容差。如果沒有發生錯誤,結果將是:abs(a-b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol)

rel_tol 是相對容差 —— 它是 ab 之間允許的最大差異,相對於 ab 的較大絕對值。例如,要設定 5% 的容差,請傳遞 rel_tol=0.05。預設容差為 1e-09,這確保了兩個值在大約 9 位十進位制數字內相同。rel_tol 必須是非負數且小於 1.0

abs_tol 是絕對容差;它預設為 0.0,並且必須是非負數。當將 x0.0 進行比較時,isclose(x, 0) 計算為 abs(x) <= rel_tol  * abs(x),對於任何 x 和小於 1.0 的 rel_tol,這都是 False。因此,請向呼叫新增適當的正 abs_tol 引數。

NaNinf-inf 的 IEEE 754 特殊值將根據 IEEE 規則進行處理。具體而言,NaN 不被認為與任何其他值接近,包括 NaNinf-inf 僅被認為與自身接近。

3.5 版本中新增。

參見

PEP 485 – 用於測試近似相等性的函式

常量

cmath.pi

數學常數 π,作為浮點數。

cmath.e

數學常數 e,作為浮點數。

cmath.tau

數學常數 τ,作為浮點數。

3.6 版本中新增。

cmath.inf

浮點正無窮大。等效於 float('inf')

3.6 版本中新增。

cmath.infj

實部為零,虛部為正無窮大的複數。等效於 complex(0.0, float('inf'))

3.6 版本中新增。

cmath.nan

浮點數“非數字”(NaN) 值。等效於 float('nan')

3.6 版本中新增。

cmath.nanj

實部為零,虛部為 NaN 的複數。等效於 complex(0.0, float('nan'))

3.6 版本中新增。

請注意,函式選擇是相似的,但與 math 模組中的函式並不完全相同。之所以有兩個模組,是因為一些使用者對複數不感興趣,甚至可能不知道複數是什麼。他們寧願讓 math.sqrt(-1) 引發異常,而不是返回一個複數。另請注意,cmath 中定義的函式總是返回一個複數,即使答案可以表示為一個實數(在這種情況下,複數的虛部為零)。

關於分支切割的說明:分支切割是給定函式不連續的曲線。它們是許多複數函式的必要特徵。假設如果您需要使用複數函式進行計算,您將會理解分支切割。請查閱幾乎任何(不太初級的)關於復變數的書籍以獲得啟發。有關數值目的的正確分支切割選擇的資訊,一個好的參考應該是以下內容:

參見

Kahan, W: 複數基本函式的分支切割;或者,關於零的符號位的大驚小怪。載於 Iserles, A., 和 Powell, M. (編), 數值分析的最新技術。牛津大學出版社 (1987) pp165–211.