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.