Python - как вычислить все n-е корни числа? - PullRequest
8 голосов
/ 13 сентября 2011

Можно ли рассчитать n комплексных корней заданного числа с помощью Python? Я недавно проверил это, и похоже, что Python дает мне неправильные / неполные ответы:

(-27.0j)**(1.0/3.0) производит (2.598076211353316-1.4999999999999998j)

но правильные корни должны быть 3 комплексными числами, потому что каждое ненулевое число имеет n различных комплексных чисел n -ных корней. Возможно ли это на Python?

Ответы [ 3 ]

6 голосов
/ 13 сентября 2011

Я не думаю, что стандартный Python сделает это, если вы не напишите для него функцию, но вы можете сделать это с помощью Numpy:

http://docs.scipy.org/doc/numpy/reference/generated/numpy.roots.html

4 голосов
/ 14 сентября 2011

Существует много многозначных сложных функций - функций, которые могут иметь более одного значения, соответствующего любой точке в их области.Например: корни, логарифмы, обратные тригонометрические функции ...

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

При выполнении вычислений с такими функциями было бы нецелесообразно всегда возвращать все возможные значения.Для обратных тригонометрических функций существует бесконечно много возможных значений.

Обычно различные значения функции могут быть выражены как функция целочисленного параметра k.Например, значения log z с z = r*(cos t + i*sin t равны log r + i*(t + k*2*pi) с k любым целым числом.Для n-го корня это r**(1/n)*exp(i*(t+k*2*pi)/n с k=0..n-1 включительно.

Поскольку возвращать все возможные значения непрактично, математические функции в Python и почти во всех других распространенных языках программирования возвращают то, что называется «основным значением»функция.( ссылка ) Основным значением обычно является значение функции с k = 0.Независимо от того, какой выбор сделан, это должно быть четко указано в документации.

Таким образом, чтобы получить все сложные корни комплексного числа, вы просто оцениваете функцию для всех соответствующих значений 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))

(Вам нужно будет импортировать модуль cmath, чтобы это работало.) Это дает:

>>> roots(-27j,3)
[(2.59808-1.5j), (1.83691e-16+3j), (-2.59808-1.5j)]
0 голосов
/ 13 сентября 2011

Если вы хотите получить все корни на чистом питоне, вы можете создать простую функцию для этого:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...