Substitute powers and powers of fractions

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.

1 Like

Symbolics performs subtree matching to subsitute. That is why it does not work for (1/(x^2)) here. This type of general substitution can get be complicated to implement as you need to search all possible rewrites of an expression to figure out if any one of them will allow substitution, but maybe there are simple but effective things we can do to start with.