使用 mpmath 求简单多项式的根

Finding the roots of a simple polynomial with 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 是否无法找到多项式的根?我该如何解决这个问题?

文档提到增加 extraprec 可能是实现收敛所必需的。由于根的多重性,您的示例就是这种情况。

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

参数extraprec表示在计算过程中多使用的位数,比较结果中需要的位数(默认为15,在[=13=中全局设置) ]).它的默认值为 10;将其增加到 110 可在 100 步内实现收敛。这实际上比在默认 extraprec 级别尝试(并且失败)找到具有 maxsteps=2000 的根花费的时间更少。