Python - 如何计算一个数字的所有n次根?
可以用Python计算一个数字的n个复数根吗?我简单查了一下,发现Python给我的答案好像不对或者不完整:
(-27.0j)**(1.0/3.0)
计算出来的结果是 (2.598076211353316-1.4999999999999998j)
但其实正确的结果应该是3个复数,因为每个非零数字都有n个不同的复数n次根。那在Python里可以做到吗?
3 个回答
如果你想在干净的Python环境中获取所有的根(解),你可以创建一个简单的函数来实现这个功能:
import math
def root(num, r):
base = num ** (1.0/r)
roots = [base]
for i in range(1, r):
roots.append(complex(base * math.cos(2*math.pi * i / r), base * math.sin(2*math.pi * i / r)))
return roots
有很多多值的复杂函数,也就是说这些函数在它们的定义域内,某个点可以对应多个值。比如说:根、对数、反三角函数等等。
这些函数之所以能有多个值,通常是因为它们是某个函数的反函数,而那个函数在定义域内有多个值映射到同一个结果。
在进行这些函数的计算时,如果总是返回所有可能的值,那就太麻烦了。以反三角函数为例,它们可能有无穷多个值。
通常,不同的函数值可以用一个整数参数 k 来表示。例如,log z
的值,当 z = r*(cos t + i*sin t)
时,可以表示为 log r + i*(t + k*2*pi)
,这里的 k 是任何整数。对于 n 次根,它的值是 r**(1/n)*exp(i*(t+k*2*pi)/n)
,其中 k=0..n-1
,包括这两个值。
因为返回所有可能的值不太实际,所以 Python 和几乎所有常见的编程语言中的数学函数,通常返回一个叫做“主值”的值。(参考) 主值通常是当 k=0 时的函数值。无论选择什么,都应该在文档中明确说明。
所以,要得到一个复数的所有复杂根,只需要对所有相关的 k 值计算这个函数:
def roots(z, n):
nthRootOfr = abs(z)**(1.0/n)
t = phase(z)
return map(lambda k: nthRootOfr*exp((t+2*k*pi)*1j/n), range(n))
(你需要导入 cmath 模块才能让这个工作。)这样就能得到:
>>> roots(-27j,3)
[(2.59808-1.5j), (1.83691e-16+3j), (-2.59808-1.5j)]
我觉得标准的Python是做不到这个的,除非你自己写一个函数。不过你可以用Numpy来实现:
http://docs.scipy.org/doc/numpy/reference/generated/numpy.roots.html