# Expression manipulation in Symbolics

**URL:** <https://discourse.julialang.org/t/expression-manipulation-in-symbolics/57486>\
**Category:** Modelling & Simulations\
**Tags:** symbolics\
**Created:** [March 18, 2021, 4:41pm UTC](https://discourse.julialang.org/t/expression-manipulation-in-symbolics/57486 "2021-03-18T16:41:44Z")\
**Posts on this page:** 5\
**Page:** 1

<div class="post-metadata">

**Author:** ![klaff](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/klaff/32/7637_2.png) [@klaff](https://discourse.julialang.org/u/klaff)\
**Post date:** [March 18, 2021, 4:41pm UTC](https://discourse.julialang.org/t/expression-manipulation-in-symbolics/57486/1 "2021-03-18T16:41:44Z")

</div>

Playing with `Symbolics` like so:

```julia
julia> @variables a b c
(a, b, c)

julia> par(x,y) = 1/(1/x+1/y)
par (generic function with 1 method)

julia> ex1 = par(a, par(b,c))
(a^-1 + ((b^-1 + c^-1)^-1)^-1)^-1

julia> simplify(ex1)
(a^-1 + b^-1 + c^-1)^-1

julia> par2(x,y) = x*y/(x+y)
par2 (generic function with 1 method)

julia> ex2 = par2(a, par2(b, c))
a*b*c*((a + b*c*((b + c)^-1))^-1)*((b + c)^-1)

julia> simplify(ex2)
a*b*c*((a + b*c*((b + c)^-1))^-1)*((b + c)^-1)

julia>

```

`ex1` and `ex2` are equivalent expressions but don’t simplify to the same expression. Are there tools coming to let one guide what `simplify` is doing?

P.S. I did `build_function`s from both of these and the function derived from `ex2` computes slightly faster, although not as fast as if I make one from a manually created `ex3` as follows:

```julia
julia> ex3 = a*b*c/(a*b+a*c+b*c)
a*b*c*((a*b + a*c + b*c)^-1)

```

---

<div class="post-metadata">

**Author:** ![ChrisRackauckas](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/chrisrackauckas/32/77_2.png) [@ChrisRackauckas](https://discourse.julialang.org/u/ChrisRackauckas)\
**Post date:** [March 18, 2021, 6:23pm UTC](https://discourse.julialang.org/t/expression-manipulation-in-symbolics/57486/2 "2021-03-18T18:23:53Z")

</div>

Open an issue. This is more of an issue than a Discourse post.

---

<div class="post-metadata">

**Author:** ![klaff](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/klaff/32/7637_2.png) [@klaff](https://discourse.julialang.org/u/klaff)\
**Post date:** [March 18, 2021, 6:30pm UTC](https://discourse.julialang.org/t/expression-manipulation-in-symbolics/57486/3 "2021-03-18T18:30:49Z")

</div>

Will do.

[https://github.com/JuliaSymbolics/Symbolics.jl/issues/132](https://github.com/JuliaSymbolics/Symbolics.jl/issues/132)

---

<div class="post-metadata">

**Author:** ![czylabsonasa](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/czylabsonasa/32/8663_2.png) [@czylabsonasa](https://discourse.julialang.org/u/czylabsonasa)\
**Post date:** [March 18, 2021, 6:51pm UTC](https://discourse.julialang.org/t/expression-manipulation-in-symbolics/57486/4 "2021-03-18T18:51:39Z")

</div>

in matlab (2020b), we get similar differences. maybe they are less “differing”…  
executing the script `simp.m`:

```matlab
clear ;
syms a b c x y ;

fun1(x,y) = 1/(1/x+1/y) ;
ex1 = fun1(a,fun1(b,c)) ;
ex1=simplify(ex1)
 
fun2(x,y)=x*y/(x+y) ;
ex2 = fun2(a,fun2(b,c)) ;
ex2=simplify(ex2)

```

gives:

```matlab
>> simp
ex1 =
1/(1/a + 1/b + 1/c)

ex2 =
(a*b*c)/(a*b + a*c + b*c)

```

---

<div class="post-metadata">

**Author:** ![klaff](https://sea2.discourse-cdn.com/julialang/user_avatar/discourse.julialang.org/klaff/32/7637_2.png) [@klaff](https://discourse.julialang.org/u/klaff)\
**Post date:** [March 18, 2021, 7:05pm UTC](https://discourse.julialang.org/t/expression-manipulation-in-symbolics/57486/5 "2021-03-18T19:05:54Z")

</div>

Thanks. Matlab seems to do a better job with the second one. `ex1` is most pleasing to my eye, but `ex2` seems to be faster on `Float64`s and `Complex`es. I assume that’s because division is much slower than multiplication or addition.
