Python - 如何计算一个数的所有n次方根?

8
有没有可能用Python计算出给定数的n个复数根?我简要检查了一下,看起来Python给出的答案是错误/不完整的:(-27.0j)**(1.0/3.0) 的结果是 (2.598076211353316-1.4999999999999998j)。但是正确的根应该是3个复数,因为每个非零数都有n个不同的复数n次根。这在Python中是否可能实现?

相关:如何在Python中计算一个非常大的整数的第n个根 [这不是重复问题,因为在这个问题中,OP不只想要整数,还包括任何数字] - amit
2
实际上,零也有n个根 - 它们只是完全相同的 :) - Tom Zych
@amit:这绝对是另一个问题,关键词是“所有根”。 - psihodelia
@psihodelia:我并没有将它标记为重复,我只是认为对于你/未来的读者,如果他们对你的问题感兴趣,也许他们也会对另一个问题感兴趣。 - amit
2
@amit:这完全没有什么密切关系。 - Tom Zych
将某物的幂次为(1.0/3.0)时的根数可能是3,也可能不是;因为1/3的浮点表示会受到一些舍入误差的影响。 - SingleNegationElimination
3个回答

7

4
有许多多值复杂函数 - 函数可以有多个值与其定义域中的任何点相对应。例如:根、对数、反三角函数...
这些函数之所以可以有多个值,通常是因为它们是具有多个值在定义域映射到相同值的函数的反函数。
在使用这样的函数进行计算时,总是返回所有可能的值是不切实际的。对于反三角函数,可能存在无限多个可能的值。
通常,不同的函数值可以表示为整数参数k的函数。例如,log z的值为z = r*(cos t + i*sin tlog 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)]

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接