当多项式只有 <n 个唯一(精确)根时,numpy.roots() 会 return n 个不同的浮点数吗?

Will numpy.roots() ever return n different floats when a polynomial only has <n unique (exact) roots?

我认为标题说明了一切,但为了具体起见,假设我有一些名为 "coeffs" 的数字列表。假设具有所述系数的多项式恰好有 k 个唯一根,以下代码是否会将 number_of_unique_roots 设置为大于 k 的数字?

import numpy as np
number_of_unique_roots = len(set(np.roots(coeffs)))

是的。

>>> len(set(numpy.roots([1, 6, 9])))
2
>>> numpy.roots([1, 6, 9])
array([-3. +3.72529030e-08j, -3. -3.72529030e-08j])

更准确地说,具有 k 重根的多项式 f(x) 的扰动 f(x)+eps·g(x) 通常具有唯一的根,并且 k 重根分离成一个几乎对称的星形原始 k 重根周围的 k 个顶点,其距离与 eps^(1/k) 成正比。

多项式的数值计算(64 位 doubles)带有取消错误,尤其是在根附近。这可以解释为 eps=1e-16 的扰动。因此,与其他答案一样,双根分裂成两个根,距离为 1e-8,原始根位于中间。 4 重根将导致大小为 ~1e-4 等的正方形或菱形结构