用mpmath找到一个简单多项式的根

时间:2015-07-21 15:13:53

标签: python mpmath

我正在尝试使用mpmath.polyroots来查找具有整数系数x*(x-4)**3的简单多项式的根,其在展开时具有[1, -12, 48, 64, 0]的系数向量。以下代码失败:

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是否无法找到多项式的根?我该如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

文档提到增加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的根更少。