我正在尝试使用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是否无法找到多项式的根?我该如何解决这个问题?
答案 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
的根更少。