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),其中*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.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

根据给定的绝对和相对容差确定两个值是否被认为是接近的。

rel_tol 是相对容差 – 它是 ab 之间允许的最大差值,相对于 ab 的较大绝对值。 例如,要设置 5% 的容差,请传递 rel_tol=0.05。 默认容差为 1e-09,这确保了这两个值在约 9 位小数内相同。 rel_tol 必须大于零。

abs_tol 是最小绝对容差 – 对于接近零的比较很有用。 abs_tol 必须至少为零。

如果没有错误发生,结果将是: abs(a-b) <= max(rel_tol * max(abs(a), abs(b)), abs_tol)

IEEE 754 特殊值 NaNinf-inf 将根据 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: Branch cuts for complex elementary functions; or, Much ado about nothing’s sign bit. In Iserles, A., and Powell, M. (eds.), The state of the art in numerical analysis. Clarendon Press (1987) pp165–211.