2011-09-13 14 views
8

Belirli bir sayının karmaşık kökenlerini Python kullanarak hesaplamak mümkün müdür? Kısa bir süre onu kontrol ettik ve Python beni yanlış/eksik cevaplar verir gibi görünür: Her sıfır olmayan sayı n farklı kompleks sayısına ulaşıldığı için,Python - bir sayının tüm nth köklerini nasıl hesaplanır?

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

üretir ancak uygun kökler 3 karmaşık sayılar olmalıdır nth kökleri. Python'da mümkün mü? Ben bunun için bir işlev yazmak sürece standart Python bunu sanmıyorum ama Numpy ile yapabilirsiniz

+0

ilgili: ([python çok büyük tamsayı inci kökünü hesaplamak için nasıl] http://stackoverflow.com/questions/356090/how-to-compute-the-nth- root-of-a-çok-büyük-tamsayı-içinde-python) [bir dupe değil çünkü bu soruda OP tam sayı istemiyor, fakat herhangi bir sayı] – amit

+2

Aslında, sıfır n kökleri de vardır - hepsi aynıdır :) –

+0

@amit: bu kesinlikle başka bir soru, anahtar kelime "tüm kökler" – psihodelia

cevap

0

temiz piton tüm kökleri almak istiyorsanız bunu yapmak için basit işlevi oluşturabilirsiniz:

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

birçok çoklu değerli karmaşık fonksiyonlar vardır - kendi etki alanındaki herhangi bir noktaya tekabül eden birden fazla değere sahip olabilir fonksiyonları. Örneğin: kökler, logaritmalar, ters trigonometrik fonksiyonlar ...

Bu işlevlerin birden çok değere sahip olmasının nedeni genellikle, etki alanı haritasındaki aynı değere birden çok değere sahip bir işlevin tersi olmalarıdır.

Bu tür işlevlerle hesaplamalar yaparken, tüm olası değerleri her zaman döndürmek pratik olmayabilir. Ters trigonometrik fonksiyonlar için sonsuz sayıda olası değer vardır. Genellikle farklı fonksiyon değerleri, bir tamsayı parametresi k'nin bir fonksiyonu olarak ifade edilebilir. Örneğin,ile log z'un değerleri, herhangi bir tamsayı ile log r + i*(t + k*2*pi)'dur. Nth kök için k=0..n-1 dahil r**(1/n)*exp(i*(t+k*2*pi)/n'dur.

Mümkün olan tüm değerlerin döndürülmesi pratik olmadığından, Python'daki matematiksel işlevler ve hemen hemen tüm diğer yaygın programlama dilleri, işlevin 'temel değeri' olarak adlandırılanı döndürür. (reference) Temel değer, genellikle k = 0 olan işlev değeridir. Seçim ne olursa olsun, belgelerde açıkça belirtilmelidir.

Yani bir karmaşık sayının tüm karmaşık kökleri almak için, sadece k ilgili tüm değerler için işlevini değerlendirmek:

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)) 

(Sen bu işi yapmak için cmath modülü almak gerekir.) Bu veriyor:

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