Services & Resources / Wolfram Forums
-----
 /
MathGroup Archive
2007
*January
*February
*March
*April
*May
*June
*July
*August
*September
*October
*Archive Index
*Ask about this page
*Print this page
*Give us feedback
*Sign up for the Wolfram Insider

MathGroup Archive 2007

[Date Index] [Thread Index] [Author Index]

Search the Archive

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


  • Prev by Date: Re: LegendreP error (bug?) in Mathematica
  • Next by Date: Re: Joint Histogram
  • Previous by thread: How to invert a function
  • Next by thread: Re: How to invert a function