RE: Inverse Interpolating Functions
- To: mathgroup at smc.vnet.net
- Subject: [mg29244] RE: [mg29221] Inverse Interpolating Functions
- From: "David Park" <djmp at earthlink.net>
- Date: Thu, 7 Jun 2001 01:14:49 -0400 (EDT)
- Sender: owner-wri-mathgroup at wolfram.com
Ted's improvement is certainly more elegant and general, but I think that if the function is decreasing we have to reverse the lists and range. So, I think this is more correct. InverseInterpolatingFunction[(f_InterpolatingFunction)? (Less @@ #1[[4,2]] || Greater @@ #1[[4,2]] & )] := If[f[[4,2,1]] < f[[4,2,-1]], InterpolatingFunction[ {{f[[4,2,1]], f[[4,2,-1]]}}, f[[2]], {f[[4,2]]}, {f[[4,1]], f[[3,1]]}], InterpolatingFunction[ {Reverse[{f[[4,2,1]], f[[4,2,-1]]}]}, f[[2]], {Reverse[f[[4,2]]]}, {f[[4,1]], Reverse[f[[3,1]]]}]] There is also another method, which is using Mathematica more correctly, but which doesn't seem to give any better results. I show this below. Here is a sample case again. f = FunctionInterpolation[Sin[x], {x, -(Pi/2), Pi/2}, InterpolationPoints -> 401, InterpolationOrder -> 5] InterpolatingFunction[{{-1.5708,1.5708}},<>] g1 = InverseInterpolatingFunction[f] InterpolatingFunction[{{-1.,1.}},<>] This is the alternative method. g2 = Interpolation[Transpose[{f[[4,2]], f[[3,1]]}]] InterpolatingFunction[{{-1.,1.}},<>] Plot[g1[f[x]] - x, {x, -Pi/2, Pi/2}, Frame -> True, PlotRange -> All]; Plot[f[g1[x]] - x, {x, -1, 1}, Frame -> True, PlotRange -> All]; Plot[g2[f[x]] - x, {x, -Pi/2, Pi/2}, Frame -> True, PlotRange -> All]; Plot[f[g2[x]] - x, {x, -1, 1}, Frame -> True, PlotRange -> All]; The problem is that there is significant error near the end of the domains. Otherwise, it is quite good. And it works better for functions that don't approach zero slope. I would still be interested in knowing what is the best method to obtain an inverse InterpolatingFunction for a monotonic function. David Park djmp at earthlink.net http://home.earthlink.net/~djmp/ > From: Ersek, Ted R [mailto:ErsekTR at navair.navy.mil] To: mathgroup at smc.vnet.net > > Dave Park wrote about making an interpolating function for the inverse of > f[x] when we already have an interpolating function of f[x] which is > monotonic. I give you an implementation that works if the samples are > monotonically increasing or decreasing. I also think this > implementation is > a little more elegant and direct than the one you had. > > > In[1]:= > InverseInterpolatingFunction[(f_InterpolatingFunction)? > (Less@@Part[#,4,2]||Greater@@Part[#,4,2]& )] := > InterpolatingFunction[{{f[[4,2,1]],f[[4,2,-1]]}}, f[[2]], {f[[4,2]]}, > {f[[4,1]], f[[3,1]]}] > > > How mathematically sound is this? I don't know, but FunctionInterpolation > adaptively samples a function so that the interpolation meets certain > criteria for precision and accuracy. Who knows how well the same samples > work for making an interpolation of the inverse function. > > One thing that could be useful is a version that would take the function > whose inverse we want to approximate and return a good > InterpolatingFunction > of the inverse. If adaptive sampling shows that the function > isn't monotonic > over the range of interest we would get back $Failed. Then we > could do for > example: > > In[3]:= > g = InverseInterpolatingFunction[ Sin[x]+x, {x,0, Pi/2} ]; > > > In[4]:= > g[1.5] > > Out[4]= 0.789793 > > > In[5]:= > Sin[0.789793] + 0.789793 > > Out[5]= 1.5 > > > I did a little bit of experimenting to try and get this working, > but it was > taking too much time. If we have a version that does what I show > above, it > wouldn't care if the function was a symbolic expression or an > InterpolatingFunction. I might work on it sometime. > > ----- > Ted Ersek > Download Mathematica tips, tricks from > http://www.verbeia.com/mathematica/tips/Tricks.html >