[英]Python - how to compute all nth roots of a number?
是否可以使用Python計算給定數字的n個復雜根? 我很快檢查了它,看起來Python給了我錯誤/不完整的答案:
(-27.0j)**(1.0/3.0)
產生(2.598076211353316-1.4999999999999998j)
但正確的根應該是3個復數,因為每個非零數都有n個不同的復數n個根。 在Python中有可能嗎?
我不認為標准Python會這樣做,除非你為它編寫一個函數,但你可以用Numpy來做:
http://docs.scipy.org/doc/numpy/reference/generated/numpy.roots.html
有許多多值復雜函數 - 可以具有多個值的函數,這些值對應於其域中的任何點。 例如:根,對數,反三角函數......
這些函數可以具有多個值的原因通常是因為它們是在域映射中具有相同值的多個值的函數的反函數。
使用此類函數進行計算時,始終返回所有可能的值是不切實際的。 對於反三角函數,存在無限多個可能的值。
通常,不同的函數值可以表示為整數參數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)]
如果你想在干凈的python上獲得所有的根,你可以創建簡單的函數來做到這一點:
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.