Ask Your Question

roots() returns no real solutions for cubic function

asked 2012-10-17 02:21:52 +0200

anonymous user


Hi there

I have a pretty complicated third-order polynomial which I use Sage to solve. However, somehow roots() only returns imaginary solutions. This should not be possible as a cubic function always has at least one root, so naturally I'm puzzled by this.

I could't seem to include all my code (formatting gets messed up). First I checked that the equation really is a polynomial in m:


Outputs 3, so that's OK. Next, I obtain the roots, which I have printed below:

-0.000119434160296805 + 2.27373675443232e-12*I
-5395.14738658974 - 7.95807864051312e-13*I
2560.33896686341 - 1.36424205265939e-12*I

As you can see, they're all imaginary, which should not be possible. The imaginary part is very small on all the solutions. My guess is that Sage uses some numerical approximations to obtain the solutions which is why it seemingly violates mathematics. But what do you think? Thanks!

edit retag flag offensive close merge delete


Perhaps using more precision can help p.roots(ring=RealField(300)) p.roots(ring=ComplexField(300))

achrzesz gravatar imageachrzesz ( 2012-10-17 06:21:31 +0200 )edit

1 Answer

Sort by ยป oldest newest most voted

answered 2012-10-17 06:33:03 +0200

Volker Braun gravatar image

You should tell us how you construct your polynomial and what its parent is if you want meaningful advice. Basically, if the polynomial is over an exact ring like the rationals then the roots will be exact (if they are rational). If the polynomial is over real floating-point ring the real roots will be numerically computed. If the polynomial is over a complex floating-point ring the roots will be numerically computed and complex.

sage: R.<x> = QQ[]
sage: (x^3-8).roots()
[(2, 1)]
sage: (x^3-2).roots()   # one real root but not rational
sage: (x^3-2).roots(ring=CDF)
[(1.25992104989, 1), (-0.629960524947 - 1.09112363597*I, 1), (-0.629960524947 + 1.09112363597*I, 1)]

sage: R.<x> = CDF[]
sage: (x^3-8).roots()
[(2.0, 1), (-1.0 - 1.73205080757*I, 1), (-1.0 + 1.73205080757*I, 1)]
sage: (x^3-2).roots()
[(1.25992104989, 1), (-0.629960524947 - 1.09112363597*I, 1), (-0.629960524947 + 1.09112363597*I, 1)]

Its unavoidable that numerical root solvers sometimes return a tiny imaginary part.

edit flag offensive delete link more

Your Answer

Please start posting anonymously - your entry will be published after you log in or create a new account.

Add Answer

Question Tools


Asked: 2012-10-17 02:21:52 +0200

Seen: 2,782 times

Last updated: Oct 17 '12