Python - 如何计算数字的所有第n个根?

时间:2011-09-13 13:15:27

标签: python math

是否可以使用Python计算给定数字的n个复杂根?我很快就检查了它,看起来Python给了我错误/不完整的答案:

(-27.0j)**(1.0/3.0)生成(2.598076211353316-1.4999999999999998j)

但正确的根应该是3个复数,因为每个非零数都有n个不同的复数第n个根。在Python中有可能吗?

3 个答案:

答案 0 :(得分:6)

我不认为标准Python会这样做,除非你为它编写一个函数,但你可以用Numpy来做:

http://docs.scipy.org/doc/numpy/reference/generated/numpy.roots.html

答案 1 :(得分:4)

有许多多值复杂函数 - 可以具有多个值的函数,这些值对应于其域中的任何点。例如:根,对数,反三角函数......

这些函数可以具有多个值的原因通常是因为它们是在域映射中具有相同值的多个值的函数的反函数。

使用此类函数进行计算时,始终返回所有可能的值是不切实际的。对于反三角函数,存在无限多个可能的值。

通常,不同的函数值可以表示为整数参数k的函数。例如,log zz = 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中的数学函数和几乎所有其他常见的编程语言都会返回函数的“主要值”。 (reference)主值通常是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)]

答案 2 :(得分:0)

如果你想在干净的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