is_real should return the right thing regardless of the form of the expression. See also https://code.google.com/p/sympy/issues/detail?id=4011.
I would avoid expanding unless that's the only way to tell. Also note that in general, the real solution from a cubic cannot be written without a nested I. Aaron Meurer On Wed, Sep 11, 2013 at 6:22 AM, Thilina Rathnayake <thilina.r...@gmail.com> wrote: > Hi Mario, > > Thank you for the reply. > > `solutions = [s.expand(complex=True) for s in solutions]` worked for me, now > `im()` > and `is_real()` return the correct results. > > Of course the solutions were correct, the problem was with `im()` and > `is_real()` not being > able to calculate the correct results. May be they should be modified to > simplify > (in this case, expand) the inputs before doing anything else? > > Regards, > Thilina. > > > > On Wed, Sep 11, 2013 at 5:02 PM, mario <mario.pern...@gmail.com> wrote: >> >> The solutions are correct but the real solution is not written in a >> simple form >> >> >> >>> solutions = solve(2*x**3 - 3*x**2 - 3*x - 1) >> >>> solutions[1].n() >> 2.26116669667966 - 0.e-23*I >> >>> solutions = [s.expand(complex=True) for s in solutions] >> >>> solutions[1] >> 1/2 + 3**(1/3)/2 + 3**(2/3)/2 >> >> >> >> On Wednesday, September 11, 2013 12:36:56 PM UTC+2, Thilina Rathnayake >> wrote: >>> >>> Hi All, >>> >>> I am trying to implement the solutions for cubic Thue equation and to do >>> that >>> I have to solve cubic equations. I use `solve()` to do this. But I am >>> having a little >>> trouble filtering out real solutions from the solution list returned by >>> `solve()`. >>> >>> I tried the following. >>> >>>> In [5]: from sympy.abc import x >>>> In [6]: solutions = solve(2*x**3 - 3*x**2 - 3*x - 1) >>>> >>>> In [8]: for s in solutions: >>>> ...: print(sympify(s).is_real) >>>> ...: >>>> None >>>> None >>>> None >>> >>> >>> But one of the solutions in this equation is real. See below: >>> http://www.wolframalpha.com/input/?i=2*x**3+-+3*x**2+-+3*x+-+1 >>> >>> That is also included in the list returned by `solve()` >>> >>>> In [9]: solutions[0] >>>> Out[9]: 1/2 - (-3)**(1/3)/2 + (-3)**(2/3)/2 >>> >>> >>> But, Interestingly, >>> >>>> In [10]: for s in solutions: >>>> ....: print(im(s)) >>>> ....: >>>> -3**(5/6)/4 + 3*3**(1/6)/4 >>>> im((-3)**(2/3)/(-1/2 + sqrt(3)*I/2))/2 - im((-3)**(1/3)*(-1/2 + >>>> sqrt(3)*I/2))/2 >>>> im((-3)**(2/3)/(-1/2 - sqrt(3)*I/2))/2 - im((-3)**(1/3)*(-1/2 - >>>> sqrt(3)*I/2))/2 >>> >>> >>> `im()` of `solutions[0]` should be zero. Am I doing something wrong here >>> or is this a bug? >>> Are there any other methods to find whether a number is purely real or >>> not? >>> >>> Thank you in advance. >>> >>> Regards, >>> Thilina. >>> >> -- >> 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+unsubscr...@googlegroups.com. >> To post to this group, send email to sympy@googlegroups.com. >> Visit this group at http://groups.google.com/group/sympy. >> For more options, visit https://groups.google.com/groups/opt_out. > > > -- > 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+unsubscr...@googlegroups.com. > To post to this group, send email to sympy@googlegroups.com. > Visit this group at http://groups.google.com/group/sympy. > For more options, visit https://groups.google.com/groups/opt_out. -- 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+unsubscr...@googlegroups.com. To post to this group, send email to sympy@googlegroups.com. Visit this group at http://groups.google.com/group/sympy. For more options, visit https://groups.google.com/groups/opt_out.