使用 sympy 查找多项式的所有根

Find all roots of a polynomial with sympy

例如,我想找到多项式 x**3 * (x - 3)**2 的所有五个根。

sympy 的 solve 命令找到一个 0 和一个 3:

from sympy import *
x = symbols ('x')
solve (x**3 * (x - 3)**2)

[0, 3]

根据代数基本定理,我本希望solve尊重根的多重性,return编辑类似

的东西
[0, 0, 0, 3, 3]

不幸的是,我找不到任何参数可以说服 solve 或其他求解器,如 solvesetnonlinsolvensolve 到 return五个元素的列表。幸运的是,sympy 的 roots return 是一个表示多重性的字典:

r = roots (x**3 * (x - 3)**2); r

{3: 2, 0: 3}

有没有一种简单的方法可以将这个字典转换为所需的五个元素列表?我想到了

l = []
for k, v in r.items ():
    for m in range (v):
        l.append (k)
l

[3, 3, 0, 0, 0]

但我觉得应该有更优雅的方式...

稍微优雅一点的解决方案:

a = []
[a.extend([k]*v) for k, v in r.items()]
print(a)

roots使用multiple参数:

In [91]: roots(x**3 * (x - 3)**2)
Out[91]: {0: 3, 3: 2}

In [92]: roots(x**3 * (x - 3)**2, multiple=True)
Out[92]: [0, 0, 0, 3, 3]

https://docs.sympy.org/latest/modules/polys/reference.html#sympy.polys.polyroots.roots