I’m a bit stuck on substitutions, for example:
@variables x y
eq = (1/x)^2
substitute(eq, Dict([1/x => y]))
julia> y^2
whereas
@variables x y
eq = 1/x^2
substitute(eq, Dict([1/x => y]))
julia> 1 / (x^2)
I was expecting the two to be equal. Further,
@variables x y z
eq = x/y
substitute(eq, Dict([1/y => z]))
julia> x/y
I was expecting x*z
.
Substitution of monomials also doesn’t work the way I would expect:
eq = (x^2)^2
substitute(eq, Dict([x^2 => y]))
julia> x^4
I was expecting y^2. Is there other functionality that lets me do these substitutions? I’m trying to write some code that polynomializes nonlinear ODEs, and that relies on substitutions of this kind.
That seems like a bug to me. Consider filing an issue at Symbolics.jl
. @ChrisRackauckas and @shashi may have more insight about this of course.
1 Like
Thanks, I will file an issue.
The MWE
using Symbolics
@variables x y
eq = (1/x)^2
@show substitute(eq, Dict([1/x => y]))
eq = 1/x^2
@show substitute(eq, Dict([1/x => y]))
eq = 1/x^2
@show substitute(eq, Dict([x => 1/y]))
yielding
substitute(eq, Dict([1 / x => y])) = y^2
substitute(eq, Dict([1 / x => y])) = 1 / (x^2)
substitute(eq, Dict([x => 1 / y])) = 1 / ((1 / y)^2)
indicates to me that this could be a matter of simplification vs. substitution. Are there certain rules in the CAS community which prescribe order of operations? Difficult, it seems (Knuth-Bendix, or so).
Edit: improving example.