[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: Reverse interpolation?




Martin Schultz <martin.schultz@dkrz.de> writes:

> Simon de Vet wrote:
...
> > I want to get better results. Instead of finding that entry #5 is the
> > closest match to my known altitude, and using #5 as the subscript in my
> > data array, I'd like to find that, based on a linear interpolation,
> > entry #5.32850 is an exact match, and using this value in an
> > interpolation on my data array.
> > 
> > I understand how to use a subscript to find an interpolated value. How
> > would I go in the opposite direction, using a value to find a subscript?
> > 
> > Thanks. I hope this isn't too confusing. I'm having a bad brane day.
> > 
> > Simon
> 
> 
> Hi Simon,
> 
>    I have dealt with similar problems (vertical regridding, to
> give the kid a name), and I tend to resort on the spline routine
> in these instances. Please find attached a piece of code that I
> used to vertically regrid OH concentration fields. Just be
> careful about end effects. For this application I overwrote the
> topmostfour levels of the target grid with the values from the
> top level of the old grid.
> 
...
>             newxx = Spline( oldy, oldx, newy, 5. )
...

If you are trying to match a lot of values, then I agree that the
spline interpolation is one of the best solutions.  However, I have
had bad experiences with the SPLINE function.  It tends to have
problems when the points are too far apart, and it's also pretty slow.
I found the Numerical Recipes version of spline interpolation to be
much better (built in functions SPL_INTERP and SPL_INIT).

If v1 is vector of values sampled at original altitudes a1, and you
want to resample at new altitudes a2, then you do something like this:

v2 = spl_interp(a1, v1, spl_init(a1, v1), a2)

Now v2 has the newly sampled values.  In principle a2 can be one value
so even if you want a single value the spline interpolation can be
useful, and even pretty fast.

IDL version 5.3 apparently has a new function called VALUE_LOCATE
which can do fast search of a reference array.  From there you can do
a linear interpolation.  The IDL Astronomy Library procedure called
TABINV may do what you want.  The versions that use VALUE_LOCATE and
don't use it are here, and here, respectively:

http://idlastro.gsfc.nasa.gov/ftp/v53/tabinv.pro
http://idlastro.gsfc.nasa.gov/ftp/pro/math/tabinv.pro

Craig

-- 
--------------------------------------------------------------------------
Craig B. Markwardt, Ph.D.         EMAIL:    craigmnet@cow.physics.wisc.edu
Astrophysics, IDL, Finance, Derivatives | Remove "net" for better response
--------------------------------------------------------------------------