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 sign
和absolute
方法来帮助我们。 这里是一个例子,为我工作:
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]