Raíz cúbica del número negativo en python

¿Puede alguien ayudarme a encontrar una solución sobre cómo calcular una raíz cúbica del número negativo usando python?

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

No funciona. La raíz cúbica del número negativo es un número negativo. ¿Alguna solución?

Podrías usar:

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

O más generalmente:

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

Un uso simple de la fórmula de De Moivre es suficiente para demostrar que la raíz cúbica de un valor, independientemente de su signo, es una función de múltiples valores. Eso significa que, para cualquier valor de entrada, habrá tres soluciones. La mayoría de las soluciones presentadas solo devuelven la raíz del principio. A continuación se muestra una solución que devuelve todas las raíces válidas y que prueba explícitamente los casos especiales no complejos.

 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) ] 

Edición: según lo solicitado, en los casos en que no sea apropiado tener dependencia en el número, el siguiente código hace lo mismo.

 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] 

Puede obtener la solución completa (todas las n raíces) y más general (cualquier signo, cualquier poder) utilizando:

 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)] 

Explicación: a utiliza la ecuación x u = exp (u * log (x)). Esta solución será entonces una de las raíces y, para obtener las otras, gírela en el plano complejo mediante una (rotación completa) / t.

Tomando las respuestas anteriores y convirtiéndolas en una sola línea:

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

La raíz cúbica de un número negativo es simplemente el negativo de la raíz cúbica del valor absoluto de ese número.

es decir, x ^ (1/3) para x <0 es lo mismo que (-1) * (| x |) ^ (1/3)

Simplemente haga su número positivo, y luego realice la raíz cúbica.

También puede envolver la biblioteca libm que ofrece una función cbrt (raíz de cubo):

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

da lo esperado

 -2.0 

Puedes usar cbrt desde scipy.special :

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

Esto también funciona para matrices.

esto funciona también con una matriz numpy:

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

Solución primitiva:

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

Probablemente masivamente no pythonico, pero debería funcionar.

Acabo de tener un problema muy similar y encontré la solución NumPy en esta publicación del foro .

En un nushell, podemos usar el sign NumPy y los métodos absolute para ayudarnos. Aquí hay un ejemplo que me ha funcionado:

 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.] 

Así que volviendo al problema original de la raíz cúbica:

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

Espero que esto ayude.

Para una respuesta aritmética, similar a una calculadora en Python 3:

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

o -3.0**(1./3) en Python 2.

Para la solución algebraica de x**3 + (0*x**2 + 0*x) + 3 = 0 use numpy:

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

numpy tiene una función de raíz de cubo incorporada cbrt que maneja bien los números negativos:

 >>> import numpy as np >>> np.cbrt(-8) -2.0 

Esto se agregó en la versión 1.10.0 (lanzada el 2015-10-06 ).

También funciona para numpy array / list :

 >>> np.cbrt([-8, 27]) array([-2., 3.])