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.