Кубический корень отрицательного числа на питоне - PullRequest
15 голосов
/ 01 сентября 2009

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

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

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

Ответы [ 13 ]

18 голосов
/ 01 сентября 2009

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

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 ]
11 голосов
/ 01 сентября 2009
math.pow(abs(x),float(1)/3) * (1,-1)[x<0]
10 голосов
/ 01 сентября 2009

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

-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
9 голосов
/ 01 сентября 2009

Вы можете получить полное (все 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.

9 голосов
/ 01 сентября 2009

Принимая предыдущие ответы и превращая их в однострочник:

import math
def cubic_root(x):
    return math.copysign(math.pow(abs(x), 1.0/3.0), x)
3 голосов
/ 01 сентября 2009

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

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

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

3 голосов
/ 01 сентября 2009

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

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
1 голос
/ 17 октября 2015

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

cbrt = lambda n: n/abs(n)*abs(n)**(1./3)
1 голос
/ 23 мая 2014

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

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

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

0 голосов
/ 19 июня 2018

numpy имеет встроенную функцию корня куба cbrt, которая отлично обрабатывает отрицательные числа:

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

Это было добавлено в версии 1.10.0 (выпущено 2015-10-06).

Также работает для numpy array / list входов:

>>> np.cbrt([-8, 27])
array([-2.,  3.])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...