Кубический корень отрицательного числа на python

Может кто-нибудь помочь мне найти решение о том, как вычислить кубический корень отрицательного числа с помощью python?

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

он не работает. Кубический корень отрицательного числа - отрицательное число. Любые решения?

Ответы

Ответ 1

Вы можете использовать:

-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

Ответ 2

Простое использование формулы De Moivre, достаточно, чтобы показать, что корень куба значения, независимо от знака, функция. Это означает, что для любого входного значения будут три решения. Большинство решений, представленных далеко, возвращают только корень принципа. Ниже приведено решение, которое возвращает все допустимые корни и явно проверяет не сложные сложные случаи.

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 ]

Ответ 3

math.pow(abs(x),float(1)/3) * (1,-1)[x<0]

Ответ 4

Вы можете получить полный (все n корней) и более общий (любой знак, любое питание) решение, используя:

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)). Тогда это решение станет одним из корней и, чтобы получить остальные, поверните его в комплексной плоскости на (полный оборот)/t.

Ответ 5

Принимая более ранние ответы и превращая их в однострочный:

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

Ответ 6

Вы также можете обернуть библиотеку libm, которая предлагает функцию cbrt (cube root):

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

Ответ 7

Кубический корень отрицательного числа является просто отрицательным от кубического корня от абсолютного значения этого числа.

то есть. x ^ (1/3) для x < 0 совпадает с (-1) * (| x |) ^ (1/3)

Просто сделайте свой номер положительным, а затем выполните кубический корень.

Ответ 8

это также работает с массивом numpy:

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

Ответ 9

Примитивное решение:

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

Наверное, массово непитонический, но он должен работать.

Ответ 10

Вы можете использовать cbrt от scipy.special:

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

Это также работает для массивов.

Ответ 11

У меня была очень похожая проблема, и я нашел решение NumPy из этот пост форума.

В 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

Надеюсь, это поможет.

Ответ 12

Для арифметики, калькуляторный ответ в Python 3:

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

или -3.0**(1./3) в Python 2.

Для алгебраического решения 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]