使用 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
或其他求解器,如 solveset
、nonlinsolve
和 nsolve
到 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
例如,我想找到多项式 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
或其他求解器,如 solveset
、nonlinsolve
和 nsolve
到 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