Re: How to invert a function

*To*: mathgroup at smc.vnet.net*Subject*: [mg81146] Re: How to invert a function*From*: Jean-Marc Gulliet <jeanmarc.gulliet at gmail.com>*Date*: Fri, 14 Sep 2007 03:30:45 -0400 (EDT)*Organization*: The Open University, Milton Keynes, UK*References*: <fcb3f3$ff9$1@smc.vnet.net>

Teodoro wrote: > this is my first post ro the Mathematica group, so, please be patient ... > The problem I'm trying to solve is a little bit more complex, but > anyway I was able to reproduce the unwanted behaviour using a "toy" example. > As far as I understand the fragment of code > > m = 7.984136668700428`*^-14; p = 38.64734299516908`; n = > 9.185777`*^-7; q = 7.729468599033817`; r = -9.18579746734159`*^-7; > f[y_] = m Exp[p y]; > g[x_] := Solve[f[y] == x, y] > h[x_] := y /. g[x] > > allows me to get y as a function of x. To check that h[x] is indeed > the inverse of f[y] (you already know the solution !) one can run > > Evaluate[f[h[z]]] > Evaluate[h[f[z]]] > > for any value of z you get again z: > > z -> h[z] -> f[h[z]=z > z -> f[z] -> h[f[z]=z > > or > > Plot[Evaluate[h[x]], {x, 1, 20}, PlotRange -> {Full}] > > and get a straight line. > However, when I try to invert > > f[y_] = m Exp[p y]+n Exp[q y]+r > > I get some result, but the result is WRONG ! > In another system I get the correct behaviour, even with more complex > functions ... > I can guess that somewhere in the answers I can get the one I need, > but the Forum is so immense ! Few random comments. Using /inexact/ numbers (i.e. floating-point numbers, also called machine-size precision numbers) with *Solve* is a very bad idea for *Solve* has been designed to seek /symbolic/ (i.e. exact) solutions. To express a symbolic inverse, use *InverseFunction* (c.f. a recent thread on this subject). To get the numerical inverse of a function at a point, you may use *FindRoot* as explained in the documentation center at ref/FindRoot -> Applications -> "Computing Inverse Function." Depending on what your initial function is made of, you should check the documentation center at guide/InverseFunctions to see whether an exact symbolic form already exists (i.e. is provided by Mathematica). Computing the symbolic inverse of a function every time you want to evaluate it at a point is a waste of time and resources. Compute the inverse first (that is simplify the expression first, perhaps using some assumptions on the parameters, compute the inverse with *Solve* or *Reduce*, check the conditions, and simplify the solution, finally give a name to this solution). Regards, -- Jean-Marc