# How to "invert" a rule

The subject is a bit cryptic, I know, but here is what I'd like to do: Let's say I am solving an ODE like this:

s = DSolve[{x'[t] == 1, y'[t] == x[t] t, x == x0,
y == y0}, {x[t], y[t]}, t]


which gives

{{x(t)->t+x0,y(t)->1/6 (2 t^3+3 t^2 x0+6 y0)}}


I could then apply the new rule to the second one that comes out of the DSolve to obtain y[t] as a function of x[t].

Now I'd like to convert the first of the replacement rules with one that replaces t, so the rule should look like this:

t -> -x0 + x[t]


I think the way to accomplish this would be to convert the Head Rule of my first rule to an Equal, and feed that into Solve. I tried to do that, but I can't get this to work.

This works for me:

Solve[Hold[s[[1, 1, 1]]] == s[[1, 1, 2]], t] // ReleaseHold


One needs the Hold because without it Solve will not work with x[t].

EDIT: Another way would be

Solve[(Equal @@@ Flatten[s])[] /. x[t] -> xt, t] /. xt -> x[t]


this works more like the OP suggested by "replacing" the rules of s by equations. The problem with that however is that I do not know how to get Solve to work with implicit functions like x[t], this is why I needed those two replacements.

In general the issue with both solutions will be expressions like x[t] for both methods it would be nice to find an automatic solution for this. Maybe there is a way to tell solve to see all expressions just as variables not as functions but I have not found one.

• Of course! I was hell-bent on using a rule to replace the -> with a ==, but I can just do it manually as you did. Thanks!
– Pirx
Sep 21, 2016 at 17:57