Home > Mobile >  Find all roots of a polynomial with sympy
Find all roots of a polynomial with sympy

Time:03-17

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

  • Related