Re: inverse function computation
- To: mathgroup at smc.vnet.net
- Subject: [mg31702] Re: inverse function computation
- From: "Carl K. Woll" <carlw at u.washington.edu>
- Date: Tue, 27 Nov 2001 02:47:55 -0500 (EST)
- Approved: Steven M. Christensen <steve@smc.vnet.net>, Moderator
- Organization: University of Washington
- References: <9tlau9$nve$1@smc.vnet.net>
- Sender: owner-wri-mathgroup at wolfram.com
Hi Margot,
One way to compute the inverse of a function is to cast the problem as a
differential equation which you can then hand off to the function NDSolve.
I've mentioned this idea in the past, and here is a summary.
The basic idea is to turn your question into a differential equation.
Mathematica's NDSolve function numerically solves differential equations,
and returns InterpolatingFunctions:
Given y-f[x[y]]==0, what is x?
Simply differentiate with respect to the dependent variable, which in this
case is y, yielding
1-f'[x[y]]x'[y]==0.
This is a differential equation for the function x[y], so we can use
NDSolve. The only thing missing is an initial condition. Of course, if the
inverse of the function f is multivalued, there will be multiple possible
initial conditions. So, we need to supply an initial condition. A function
which takes these ideas and puts them together follows:
NInverse[f_, {x0_, y0_}, {y_, min_, max_}, opts___?OptionQ] :=
NDSolve[{1 - f'[x[y]]x'[y] == 0, x[y0] == x0}, x, {y, min, max}, opts]
In the above function, f should be a pure function., the point {x0,y0} is
the initial condition, and the
function f should satisfy f[x0]==y0. The "dependent variable" y will range
from min to max. The options should be those expected by NDSolve. Obviously,
a little bit more work can be done to make the function a bit more bullet
proof. Typically, NDSolve will yield an accuracy (precision) of 6 decimal
places, so if more accuracy is desired, a more accurate PrecisionGoal and
AccuracyGoal can be given as options to the function NInverse.
In your example we have f[x_]=x+.2 Sin[x], so the pure function would be
f=#+.2 Sin[#]&, and we would use NInverse as follows:
NInverse[#+.2 Sin[#]&,{0,0},{y,0,1}]
The output would be an interpolating function over the range {0,1} giving
the values of the inverse function f^(-1).
An interpolating function has some nice advantages over an approach using
FnidRoot, since it should be faster, and the resulting function can be both
differentiated and integrated.
Carl Woll
Physics Dept
U of Washington
"Margot" <gosia_sz at softhome.net> wrote in message
news:9tlau9$nve$1 at smc.vnet.net...
> Hello,
>
> I'd like to do the following manipulation.
> Let f be a homeomorphism (known explicitly).
> I want Mathematica to compute its inverse f^{-1} and to use it
> for further computations and plots.
> I'm assuming here that f^{-1} is not explicit (take f(x)=x+0.2Sin[x] for
> instance).
>
> I'm not sure that Mathematica has an already built-in function; do you
know
> any simple algorithm?
>
> Many thanks
>
>
>