2015-07-21 81 views
1

我試圖用mpmath.polyroots找到一個簡單的多項式的根整係數x*(x-4)**3,當其擴展爲[1, -12, 48, 64, 0]係數向量。下面的代碼失敗:尋找一個簡單的多項式的根與mpmath

import mpmath 
p = [ 1, -12, 48, -64, 0] 
print mpmath.polyroots(p,maxsteps=2000) 

與錯誤:

Traceback (most recent call last): 
    File "poly.py", line 3, in <module> 
    print mpmath.polyroots(p,maxsteps=2000) 
    File "/usr/local/lib/python2.7/dist-packages/mpmath/calculus/polynomials.py", line 188, in polyroots 
    % maxsteps) 
mpmath.libmp.libhyper.NoConvergence: Didn't converge in maxsteps=2000 steps. 

增加的步驟沒有幫助的數量。預期的答案顯然是[0,4,4,4]

如果存在多重性,mpmath無法找到多項式的根?我該如何解決這個問題?

+0

由於浮點評估中的擾動,三重根導致數值求解器中的'1e-5'錯誤級別。對於1e-6或更小的典型默認級別,這可能無法解決。通過聚類分析來查找多個或根目錄可能會阻止這種情況。 – LutzL

+0

@LutzL我認爲這個詞的聚類分析可能有不同的看法(例如我的用例就像主成分分析)。聚類分析如何與尋找多根相關? – Hooked

+1

多根在數值行爲與根簇密切相關。我不知道軟件在哪裏完成,但從數學的角度來看,在複平面中識別包含多個或多個根的相對較小的磁盤並找到相應的多項式因子將是有利的。這種中間因式分解不會像多重性根的情況那樣遭受精度損失。但是,小程度的因素可能仍然會導致不穩定的根源,就像這個例子。 – LutzL

回答

1

該文件提到增加extraprec可能是實現收斂所必需的。由於根的多樣性,您的示例就是這種情況。

>>> mpmath.polyroots(p, maxsteps=100, extraprec=110) 
[mpf('0.0'), mpf('4.0'), mpf('4.0'), mpf('4.0')] 

extraprec參數意味着在計算過程中所使用的數字的數目額外相比,在結果所需要的數字位數(這是15通過默認,在mpmath.np.dps全局設置)。其默認值是10;將其增加到110可以達到100步收斂。這實際上花費的時間少於嘗試(和失敗)的時間,以maxsteps=2000的默認extraprec級別查找根。