As an example, I want to find all five roots of the polynomial x**3 * (x - 3)**2
.
sympy's solve
command finds a 0
and a 3
:
from sympy import *
x = symbols ('x')
solve (x**3 * (x - 3)**2)
[0, 3]
According to the fundamental theorem of algebra, I would have hoped that solve
honored the multiplicity of the roots and returned something like
[0, 0, 0, 3, 3]
Unfortunately, I could not find any parameter that would persuade solve
or other solvers like solveset
, nonlinsolve
, and nsolve
to return a list of five elements. Fortunately, sympy's roots
returns a dictionary indicating the multiplicity:
r = roots (x**3 * (x - 3)**2); r
{3: 2, 0: 3}
Is there an easy way to transform this dictionary into the desired list of five elements? I came up with
l = []
for k, v in r.items ():
for m in range (v):
l.append (k)
l
[3, 3, 0, 0, 0]
but I feel like there should be a more elegant way ...
CodePudding user response:
A slightly more elegant solution:
a = []
[a.extend([k]*v) for k, v in r.items()]
print(a)
CodePudding user response:
Use the multiple
argument to roots
:
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