Working on a solution to this, but there's one thing I'm unsure about.
Is it OK to also assume sqrt(x*y) == sqrt(x)*sqrt(y) in this context?

Aaron Meurer

On Tue, Oct 8, 2013 at 12:19 PM, Aaron Meurer <[email protected]> wrote:
> I guess this is just a deficiency in the root finding algorithms. For
> quadratics, it uses the quadratic formula, but as you point out, if
> you factor the polynomial, you get a simpler result. SymPy won't
> simplify sqrt(x**2) to x because it's not true unless x is
> nonnegative, but what *is* true for any complex x is that sqrt(x**2)
> is either x or -x, and so by the symmetry of the quadratic formula, it
> is OK to do this reduction.
>
> I wonder if this issue comes up in the root formulas for higher degrees as 
> well.
>
> Aaron Meurer
>
> On Tue, Oct 8, 2013 at 11:49 AM, Ondřej Čertík <[email protected]> 
> wrote:
>> On Tue, Oct 8, 2013 at 11:48 AM, Ondřej Čertík <[email protected]> 
>> wrote:
>>> On Tue, Oct 8, 2013 at 10:02 AM, Taylan Şengül <[email protected]> 
>>> wrote:
>>>> Hi all,
>>>>
>>>> I am quite new to sympy.
>>>>
>>>> When I type the following
>>>>
>>>> a = symbols('a')
>>>> m = Matrix( [ [a, 0], [0, 1] ] )
>>>> m.eigenvals()
>>>>
>>>> I expect the answer to
>>>> {a: 1,  1: 1}
>>>>
>>>> But I get
>>>>
>>>> {a/2 + sqrt((a - 1)**2)/2 + 1/2: 1, a/2 - sqrt((a - 1)**2)/2 + 1/2: 1}
>>>>
>>>> I think first the characteristic polynomial is computed and then roots are
>>>> found. This produces the mess. Wouldn't it be better to try to factor the
>>>> characteristic polynomial first and then find roots?
>>>
>>>
>>> SymPy assumes that "a" is complex, so no simplifications can be done, isn't 
>>> it?
>>> But you can tell SymPy that "a" is real, then some simplifications can be 
>>> done:
>>>
>>> In [1]: a = symbols('a')
>>>
>>> In [2]: m = Matrix( [ [a, 0], [0, 1] ] )
>>>
>>> In [3]: m.eigenvals()
>>> Out[3]:
>>> ⎧       __________                __________       ⎫
>>> ⎪      ╱        2                ╱        2        ⎪
>>> ⎨a   ╲╱  (a - 1)     1     a   ╲╱  (a - 1)     1   ⎬
>>> ⎪─ - ───────────── + ─: 1, ─ + ───────────── + ─: 1⎪
>>> ⎩2         2         2     2         2         2   ⎭
>>>
>>> In [4]: a = Symbol("a", real=True)
>>>
>>> In [5]: m = Matrix( [ [a, 0], [0, 1] ] )
>>>
>>> In [6]: m.eigenvals()
>>> Out[6]:
>>> ⎧a   │a - 1│   1     a   │a - 1│   1   ⎫
>>> ⎨─ - ─────── + ─: 1, ─ + ─────── + ─: 1⎬
>>> ⎩2      2      2     2      2      2   ⎭
>>
>>
>> Ah, I see your point --- because the eigenvalue are symmetric, you can
>> actually simplify this to "a" and 1.
>>
>> Ondrej
>>
>> --
>> 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 [email protected].
>> To post to this group, send email to [email protected].
>> 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 [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/sympy.
For more options, visit https://groups.google.com/groups/opt_out.

Reply via email to