2015-07-21 80 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级别查找根。