Python的负数的立方根

有人可以帮助我find一个解决scheme,如何计算使用Python的负数的立方根?

>>> math.pow(-3, float(1)/3) nan 

这是行不通的。 负数的立方根是负数。 任何解决scheme

你可以使用:

 -math.pow(3, float(1)/3) 

或者更一般地说:

 if x > 0: return math.pow(x, float(1)/3) elif x < 0: return -math.pow(abs(x), float(1)/3) else: return 0 

De Moivre公式的简单使用足以certificate一个值的立方根,不pipe符号是多值函数。 这意味着,对于任何input值,将有三个解决scheme。 大多数提出的解决scheme只返回原则根源。 下面显示了一个解决scheme,该解决scheme返回所有有效的根,并显式testing非复杂的特殊情况。

 import numpy import math def cuberoot( z ): z = complex(z) x = z.real y = z.imag mag = abs(z) arg = math.atan2(y,x) return [ mag**(1./3) * numpy.exp( 1j*(arg+2*n*math.pi)/3 ) for n in range(1,4) ] 

编辑:根据要求,在不适合依赖numpy的情况下,下面的代码做同样的事情。

 def cuberoot( z ): z = complex(z) x = z.real y = z.imag mag = abs(z) arg = math.atan2(y,x) resMag = mag**(1./3) resArg = [ (arg+2*math.pi*n)/3. for n in range(1,4) ] return [ resMag*(math.cos(a) + math.sin(a)*1j) for a in resArg ] 
 math.pow(abs(x),float(1)/3) * (1,-1)[x<0] 

您可以使用以下方法获得完整的(全部为n根)和更一般的(任何符号,任何电源)解决scheme:

 import cmath x, t = -3., 3 # x**(1/t) a = cmath.exp((1./t)*cmath.log(x)) p = cmath.exp(1j*2*cmath.pi*(1./t)) r = [a*(p**i) for i in range(t)] 

说明:a使用方程x u = exp(u * log(x))。 这个解决scheme将成为其中的一个根源,为了让其他人在复杂的平面上旋转(完整旋转)/ t。

拿早先的答案做成一个单行的:

 import math def cubic_root(x): return math.copysign(math.pow(abs(x), 1.0/3.0), x) 

负数的立方根只是该数的绝对值的立方根的负数。

即对于x <0的x ^(1/3)与(-1)*(| x |)^(1/3)

只要让你的号码正面,然后执行立方根。

您也可以包装提供cbrt (立方体根)function的libm库:

 from ctypes import * libm = cdll.LoadLibrary('libm.so.6') libm.cbrt.restype = c_double libm.cbrt.argtypes = [c_double] libm.cbrt(-8.0) 

给出预期的

 -2.0 

这与numpy数组一起工作:

 cbrt = lambda n: n/abs(n)*abs(n)**(1./3) 

原始解决scheme:

 def cubic_root(nr): if nr<0: return -math.pow(-nr, float(1)/3) else: return math.pow(nr, float(1)/3) 

大概是非pythonic,但它应该工作。

你可以从scipy.special使用scipy.special

 >>> from scipy.special import cbrt >>> cbrt(-3) -1.4422495703074083 

这也适用于数组。

我只是有一个非常类似的问题,并find了这个论坛post的NumPy解决scheme。

在一个nushell,我们可以使用NumPy signabsolute方法来帮助我们。 这里是一个例子,为我工作:

 import numpy as np x = np.array([-81,25]) print x #>>> [-81 25] xRoot5 = np.sign(x) * np.absolute(x)**(1.0/5.0) print xRoot5 #>>> [-2.40822469 1.90365394] print xRoot5**5 #>>> [-81. 25.] 

因此,回到原始的多维数据集根目录问题:

 import numpy as np y = -3. np.sign(y) * np.absolute(y)**(1./3.) #>>> -1.4422495703074083 

我希望这有帮助。

对于算术,Python 3中类似计算器的答案:

 >>> -3.0**(1/3) -1.4422495703074083 

或Python 2中的-3.0**(1./3)

对于x**3 + (0*x**2 + 0*x) + 3 = 0的代数解,使用numpy:

 >>> p = [1,0,0,3] >>> numpy.roots(p) [-3.0+0.j 1.5+2.59807621j 1.5-2.59807621j]