Q: simplify and alternatives

33 views
Skip to first unread message

Audrius-St

unread,
Jun 20, 2020, 10:27:50 PM6/20/20
to sympy
Hello,

A question regarding simplify()

For example, simplify() followed by factor() successfully reduces the rather long expression in (x, px, y, py)

(24*px**3*x**4*sqrt(x**2 + y**2) - 72*px**3*x**2*y**2*sqrt(x**2 + y**2) + 9*px**3*y**4*sqrt(x**2 + y**2) +
180*px**2*py*x**3*y*sqrt(x**2 + y**2) - 135*px**2*py*x*y**3*sqrt(x**2 + y**2) - 36*px*py**2*x**4*sqrt(x**2 + y**2) +
243*px*py**2*x**2*y**2*sqrt(x**2 + y**2) - 36*px*py**2*y**4*sqrt(x**2 + y**2) + 22*px*x**4 + 14*px*x**2*y**2 - 8*px*y**4 -
45*py**3*x**3*y*sqrt(x**2 + y**2) + 60*py**3*x*y**3*sqrt(x**2 + y**2) + 30*py*x**3*y + 30*py*x*y**3)/(x**2 + y**2)**5

to the desired simpler form

(24*px**3*x**4 - 72*px**3*x**2*y**2 + 9*px**3*y**4 + 180*px**2*py*x**3*y - 135*px**2*py*x*y**3 - 36*px*py**2*x**4 +
243*px*py**2*x**2*y**2 - 36*px*py**2*y**4 + 22*px*x**2*sqrt(x**2 + y**2) - 8*px*y**2*sqrt(x**2 + y**2) - 45*py**3*x**3*y +
60*py**3*x*y**3 + 30*py*x*y*sqrt(x**2 + y**2))/(x**2 + y**2)**(9/2)

However, simplify() is, understandably, time consuming.
Also, I would like to follow the the advice in introductory blurb in the simplify() documentation regarding "robustness".

My questions:

1. Is it possible to determine which algorithms simplify() chooses to use?

2. I've reviewed the sympy documentation, but have not been able to identify other simplification algorithms that would apply.
This is probably due to my lack of familiarity with this aspect of sympy. Any suggestions would be appreciated.



Aaron Meurer

unread,
Jun 21, 2020, 3:25:53 AM6/21/20
to sympy
On Sat, Jun 20, 2020 at 8:27 PM Audrius-St <audrius....@gmail.com> wrote:
>
> Hello,
>
> A question regarding simplify()
>
> For example, simplify() followed by factor() successfully reduces the rather long expression in (x, px, y, py)
>
> (24*px**3*x**4*sqrt(x**2 + y**2) - 72*px**3*x**2*y**2*sqrt(x**2 + y**2) + 9*px**3*y**4*sqrt(x**2 + y**2) +
> 180*px**2*py*x**3*y*sqrt(x**2 + y**2) - 135*px**2*py*x*y**3*sqrt(x**2 + y**2) - 36*px*py**2*x**4*sqrt(x**2 + y**2) +
> 243*px*py**2*x**2*y**2*sqrt(x**2 + y**2) - 36*px*py**2*y**4*sqrt(x**2 + y**2) + 22*px*x**4 + 14*px*x**2*y**2 - 8*px*y**4 -
> 45*py**3*x**3*y*sqrt(x**2 + y**2) + 60*py**3*x*y**3*sqrt(x**2 + y**2) + 30*py*x**3*y + 30*py*x*y**3)/(x**2 + y**2)**5
>
> to the desired simpler form
>
> (24*px**3*x**4 - 72*px**3*x**2*y**2 + 9*px**3*y**4 + 180*px**2*py*x**3*y - 135*px**2*py*x*y**3 - 36*px*py**2*x**4 +
> 243*px*py**2*x**2*y**2 - 36*px*py**2*y**4 + 22*px*x**2*sqrt(x**2 + y**2) - 8*px*y**2*sqrt(x**2 + y**2) - 45*py**3*x**3*y +
> 60*py**3*x*y**3 + 30*py*x*y*sqrt(x**2 + y**2))/(x**2 + y**2)**(9/2)
>
> However, simplify() is, understandably, time consuming.
> Also, I would like to follow the the advice in introductory blurb in the simplify() documentation regarding "robustness".
>
> My questions:
>
> 1. Is it possible to determine which algorithms simplify() chooses to use?

The only way is to look at the source code, or run it through a debugger.

>
> 2. I've reviewed the sympy documentation, but have not been able to identify other simplification algorithms that would apply.
> This is probably due to my lack of familiarity with this aspect of sympy. Any suggestions would be appreciated.

I got your desired result with factor(expand(collect(expr, sqrt(x**2 +
y**2)), deep=False)). The collect() pulls the square roots into a
single square root term, and the expand(deep=False) expands the
top-level fraction so that the square root can combine with the
denominator. The factor() then puts it into a single fraction form.

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 view this discussion on the web visit https://groups.google.com/d/msgid/sympy/f8376c85-8e49-4570-9bd0-e1363bc87cc5o%40googlegroups.com.
Message has been deleted
Message has been deleted

Audrius-St

unread,
Jun 22, 2020, 3:46:23 PM6/22/20
to sympy


On Sunday, June 21, 2020 at 3:25:53 AM UTC-4, Aaron Meurer wrote:
On Sat, Jun 20, 2020 at 8:27 PM Audrius-St <audrius...@gmail.com> wrote:
>
> Hello,
>
> A question regarding simplify()
>
> For example, simplify() followed by factor() successfully reduces the rather long expression in (x, px, y, py)
>
> (24*px**3*x**4*sqrt(x**2 + y**2) - 72*px**3*x**2*y**2*sqrt(x**2 + y**2) + 9*px**3*y**4*sqrt(x**2 + y**2) +
> 180*px**2*py*x**3*y*sqrt(x**2 + y**2) - 135*px**2*py*x*y**3*sqrt(x**2 + y**2) - 36*px*py**2*x**4*sqrt(x**2 + y**2) +
> 243*px*py**2*x**2*y**2*sqrt(x**2 + y**2) - 36*px*py**2*y**4*sqrt(x**2 + y**2) + 22*px*x**4 + 14*px*x**2*y**2 - 8*px*y**4 -
> 45*py**3*x**3*y*sqrt(x**2 + y**2) + 60*py**3*x*y**3*sqrt(x**2 + y**2) + 30*py*x**3*y + 30*py*x*y**3)/(x**2 + y**2)**5
>
> to the desired simpler form
>
> (24*px**3*x**4 - 72*px**3*x**2*y**2 + 9*px**3*y**4 + 180*px**2*py*x**3*y - 135*px**2*py*x*y**3 - 36*px*py**2*x**4 +
> 243*px*py**2*x**2*y**2 - 36*px*py**2*y**4 + 22*px*x**2*sqrt(x**2 + y**2) - 8*px*y**2*sqrt(x**2 + y**2) - 45*py**3*x**3*y +
> 60*py**3*x*y**3 + 30*py*x*y*sqrt(x**2 + y**2))/(x**2 + y**2)**(9/2)
>
> However, simplify() is, understandably, time consuming.
> Also, I would like to follow the the advice in introductory blurb in the simplify() documentation regarding "robustness".
>
> My questions:
>
> 1. Is it possible to determine which algorithms simplify() chooses to use?

The only way is to look at the source code, or run it through a debugger.


Understood.
 
>
> 2. I've reviewed the sympy documentation, but have not been able to identify other simplification algorithms that would apply.
> This is probably due to my lack of familiarity with this aspect of sympy. Any suggestions would be appreciated.

I got your desired result with factor(expand(collect(expr, sqrt(x**2 +
y**2)), deep=False)). The collect() pulls the square roots into a
single square root term, and the expand(deep=False) expands the
top-level fraction so that the square root can combine with the
denominator. The factor() then puts it into a single fraction form.

Thank you for your explanations and code - a significant improvement in performance.
 

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 sy...@googlegroups.com.
Reply all
Reply to author
Forward
0 new messages