sympy solve and polynomial roots

334 views
Skip to first unread message

Alexandre Eudes

unread,
Sep 1, 2013, 7:05:48 PM9/1/13
to sy...@googlegroups.com
Hello Everyone,
I have noted some stranges behaviours of solve for polynomial in my use of sympy.

In case of 4th degree polynomial with 2 two conjugates solutions, solve return only two of the four solutions.
The problem seems to appear only with real coefficients, integer polynomial solutions are fine.
On the other side, sympy roots always gives the good answer.

Example :
>>> import sympy as sy
>>> s = sy.S("s")
>>> expr =  4.0*s**4 + 3.0*s**3 + 3.0*s**2 - 4.0*s + 4.0
>>> rt= sy.roots(expr)
>>> slsy.solve(expr)
>>> print sl,"\n",rt
[0.490766420298022 - 0.526081774461482*I, 0.490766420298022 + 0.526081774461482*I] 
{-0.865766420298022 - 1.08737810369128*I: 1, 0.490766420298022 - 0.526081774461482*I: 1, -0.865766420298022 + 1.08737810369128*I: 1, 0.490766420298022 + 0.526081774461482*I: 1}

Similarly, solving for 5th degree polynomial return strange error :

>>> sy.solve(s**5+s**4-1.0)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "sympy/sympy/solvers/solvers.py", line 958, in solve
    solution = nfloat(solution, exponent=False)
  File "sympy/sympy/core/function.py", line 2219, in nfloat
    return type(expr)([nfloat(a, n, exponent) for a in expr])
  File "sympy/sympy/core/function.py", line 2235, in nfloat
    rv = rv.xreplace(dict(reps))
  File "sympy/sympy/core/basic.py", line 1106, in xreplace
    return self.func(*args)
  File "sympy/sympy/polys/rootoftools.py", line 62, in __new__
    raise PolynomialError("only univariate polynomials are allowed")
sympy.polys.polyerrors.PolynomialError: only univariate polynomials are allowed

Should I had an issue in the tracker or this problems are already known ?

Regards,
Alexandre.

Ondřej Čertík

unread,
Sep 3, 2013, 12:49:29 PM9/3/13
to sympy
Hi Alexandre,

On Sun, Sep 1, 2013 at 5:05 PM, Alexandre Eudes
<alexand...@gmail.com> wrote:
> Hello Everyone,
> I have noted some stranges behaviours of solve for polynomial in my use of
> sympy.
>
> In case of 4th degree polynomial with 2 two conjugates solutions, solve
> return only two of the four solutions.
> The problem seems to appear only with real coefficients, integer polynomial
> solutions are fine.

Is there a reason you need floating point coefficients? In my opinion,
one should use floating point only as a last resort.
Note that this works:

In [1]: solve(x**5+x**4-1)
Out[1]:
⎡ ⎛ 5 4 ⎞ ⎛ 5 4 ⎞ ⎛ 5 4 ⎞
⎣RootOf⎝x + x - 1, 0⎠, RootOf⎝x + x - 1, 1⎠, RootOf⎝x + x - 1, 2⎠, RootO

⎛ 5 4 ⎞ ⎛ 5 4 ⎞⎤
f⎝x + x - 1, 3⎠, RootOf⎝x + x - 1, 4⎠⎦

but this doesn't:

In [2]: solve(x**5+x**4-1.0)

yes, I think you should report it. I am attaching a pdf of what
Mathematica does in this case ---
the integer case work the same as in sympy, but the floating point
case returns numerical solution,
while SymPy fails.

Ondrej
solve.pdf

Aaron Meurer

unread,
Sep 3, 2013, 7:15:22 PM9/3/13
to sy...@googlegroups.com
This is also a bug in the sense that the only exception that should
ever be raised by solve() should be NotImplementedError.

Aaron Meurer
> --
> You received this message because you are subscribed to the Google Groups "sympy" group.
> To unsubscribe from this group and stop receiving emails from it, send an email to sympy+un...@googlegroups.com.
> To post to this group, send email to sy...@googlegroups.com.
> Visit this group at http://groups.google.com/group/sympy.
> For more options, visit https://groups.google.com/groups/opt_out.
Reply all
Reply to author
Forward
0 new messages