2011-09-13 172 views
8

¿Es posible calcular n raíces complejas de un número dado usando Python? poco Lo he comprobado, y parece que Python me da malas respuestas incompletas:/Python: ¿cómo calcular todas las enésimas raíces de un número?

(-27.0j)**(1.0/3.0) produce (2.598076211353316-1.4999999999999998j)

pero las raíces adecuadas debe ser de 3 números complejos, ya que cada número cero no tiene n diferente número complejo enésimas raíces ¿Es posible en Python?

+0

relacionada: [Cómo calcular la raíz enésima de un gran número entero en Python] (http://stackoverflow.com/questions/356090/how-to-compute-the-nth- root-of-a-very-big-integer-in-python) [no es un engaño porque en esta pregunta el OP no quiere números enteros, sino cualquier número] – amit

+2

En realidad, cero también tiene raíces n. Son todas iguales :) –

+0

@amit: esta es absolutamente otra pregunta, la palabra clave es "todas las raíces" – psihodelia

Respuesta

0

Si desea obtener todas las raíces de pitón que limpia puede crear la función simple de hacer esto:

import math 

def root(num, r): 
    base = num ** (1.0/r) 
    roots = [base] 
    for i in range(1, r): 
     roots.append(complex(base * math.cos(2*math.pi * i/r), base * math.sin(2*math.pi * i/r))) 
    return roots 
4

Hay muchas funciones complejas de varios valores - funciones que pueden tener más de un valor correspondiente a cualquier punto de su dominio. Por ejemplo: raíces, logaritmos, funciones trigonométricas inversas ...

La razón por la cual estas funciones pueden tener valores múltiples es generalmente porque son las inversas de una función que tiene múltiples valores en el mapa de dominio con el mismo valor.

Al hacer cálculos con tales funciones, sería poco práctico devolver siempre todos los valores posibles. Para las funciones trigonométricas inversas, hay infinitos valores posibles.

Normalmente, los diferentes valores de función se pueden expresar como una función de un parámetro entero k. Por ejemplo, los valores de log z con z = r*(cos t + i*sin t son log r + i*(t + k*2*pi) con k cualquier número entero. Para la enésima raíz, es r**(1/n)*exp(i*(t+k*2*pi)/n con k=0..n-1 inclusive.

Como devolver todos los valores posibles no es práctico, las funciones matemáticas en Python y casi todos los demás lenguajes de programación comunes devuelven lo que se denomina el "valor principal" de la función. (reference) El valor principal suele ser el valor de la función con k = 0. Cualquiera que sea la elección, debe indicarse claramente en la documentación.

Así que para todas las raíces complejas de un número complejo, que acaba de calcular la función para todos los valores relevantes de k:

def roots(z, n): 
    nthRootOfr = abs(z)**(1.0/n) 
    t = phase(z) 
    return map(lambda k: nthRootOfr*exp((t+2*k*pi)*1j/n), range(n)) 

(Tendrá que importar el módulo cmath para hacer este trabajo.) Esto da:

>>> roots(-27j,3) 
[(2.59808-1.5j), (1.83691e-16+3j), (-2.59808-1.5j)] 
Cuestiones relacionadas