Ответ 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
Может кто-нибудь помочь мне найти решение о том, как вычислить кубический корень отрицательного числа с помощью python?
>>> math.pow(-3, float(1)/3)
nan
он не работает. Кубический корень отрицательного числа - отрицательное число. Любые решения?
Вы можете использовать:
-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, достаточно, чтобы показать, что корень куба значения, независимо от знака, функция. Это означает, что для любого входного значения будут три решения. Большинство решений, представленных далеко, возвращают только корень принципа. Ниже приведено решение, которое возвращает все допустимые корни и явно проверяет не сложные сложные случаи.
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 корней) и более общий (любой знак, любое питание) решение, используя:
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.
Принимая более ранние ответы и превращая их в однострочный:
import math
def cubic_root(x):
return math.copysign(math.pow(abs(x), 1.0/3.0), x)
Вы также можете обернуть библиотеку 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
Кубический корень отрицательного числа является просто отрицательным от кубического корня от абсолютного значения этого числа.
то есть. x ^ (1/3) для x < 0 совпадает с (-1) * (| x |) ^ (1/3)
Просто сделайте свой номер положительным, а затем выполните кубический корень.
это также работает с массивом numpy:
cbrt = lambda n: n/abs(n)*abs(n)**(1./3)
Примитивное решение:
def cubic_root(nr):
if nr<0:
return -math.pow(-nr, float(1)/3)
else:
return math.pow(nr, float(1)/3)
Наверное, массово непитонический, но он должен работать.
Вы можете использовать cbrt
от scipy.special
:
>>> from scipy.special import cbrt
>>> cbrt(-3)
-1.4422495703074083
Это также работает для массивов.
У меня была очень похожая проблема, и я нашел решение 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
Надеюсь, это поможет.
Для арифметики, калькуляторный ответ в 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]