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
- cmath.polar(x)¶
返回 x 的極座標表示形式。 返回一對
(r, phi)
,其中 r 是 x 的模,phi 是 x 的相位。polar(x)
等價於(abs(x), phase(x))
。
- cmath.rect(r, phi)¶
返回具有極座標 r 和 phi 的複數 x。 等價於
complex(r * math.cos(phi), r * math.sin(phi))
。
冪和對數函式¶
- cmath.exp(x)¶
返回 e 的 x 次冪,其中 e 是自然對數的底數。
- cmath.log(x[, base])¶
返回 x 對給定 base 的對數。如果未指定 base,則返回 x 的自然對數。有一個分支切割,從 0 沿負實軸到 -∞。
三角函式¶
- cmath.acos(x)¶
返回 x 的反餘弦。 有兩個分支切割:一個從 1 沿實軸向右延伸到 ∞。另一個從 -1 沿實軸向左延伸到 -∞。
- 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)¶
如果值 a 和 b 彼此接近,則返回
True
,否則返回False
。兩個值是否被認為接近取決於給定的絕對和相對容差。如果沒有發生錯誤,結果將是:
abs(a-b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol)
。rel_tol 是相對容差 —— 它是 a 和 b 之間允許的最大差異,相對於 a 或 b 的較大絕對值。例如,要設定 5% 的容差,請傳遞
rel_tol=0.05
。預設容差為1e-09
,這確保了兩個值在大約 9 位十進位制數字內相同。rel_tol 必須是非負數且小於1.0
。abs_tol 是絕對容差;它預設為
0.0
,並且必須是非負數。當將x
與0.0
進行比較時,isclose(x, 0)
計算為abs(x) <= rel_tol * abs(x)
,對於任何x
和小於1.0
的 rel_tol,這都是False
。因此,請向呼叫新增適當的正 abs_tol 引數。NaN
、inf
和-inf
的 IEEE 754 特殊值將根據 IEEE 規則進行處理。具體而言,NaN
不被認為與任何其他值接近,包括NaN
。inf
和-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.