Higher-dimensional Interpolation¶
Contents
Two-dimensional interpolation¶
There are two types of two-dimensional interpolation classes, the first is based on a function defined on a two-dimensional grid (though the spacings between grid points need not be equal). The class interp2_direct implements bilinear or bicubic interpolation, and is based on D. Zaslavsky’s routines at https://github.com/diazona/interp2d (licensed under GPLv3). A slightly slower (but a bit more flexible) alternative is successive use of interp_base objects, implemented in interp2_seq .
If data is arranged without a grid, then interp2_neigh performs nearest-neighbor interpolation. At present, the only way to compute :ref:`contour lines on data which is not defined on a grid is to use this class or one of the multi-dimensional interpolation classes described below the data on a grid and then use contour afterwards.
Multi-dimensional interpolation¶
Multi-dimensional interpolation for table defined on a grid is
possible with tensor_grid. See the documentation
for o2scl::tensor_grid::interpolate()
,
o2scl::tensor_grid::interp_linear()
and
o2scl::tensor_grid::rearrange_and_copy()
. Also, if you
want to interpolate rank-1
indices to get a vector result, you can
use o2scl::tensor_grid::interp_linear_vec()
.
If the data is not on a grid, then inverse distance weighted interpolation is performed by interpm_idw.
An experimental class for multidimensional-dimensional kriging is also provided in interpm_krige .
Interpolation on a rectangular grid¶
dontinclude ex_interp2.cpp skip Example: until End of example
This example creates a sample 3 by 3 grid of data with the function \(\left[ \sin \left( x/10 + 3 y/10 \right) \right]^2\) and performs some interpolations and compares them with the exact result. include ex_interp2.scr
Contour lines¶
This example generates contour lines of the function f[ z = f(x,y) = 15 exp left[ - frac{1}{20^2}left( x-20 right)^2 - frac{1}{5^2}left(y-5right)^2right] + 40 exp left[ - frac{1}{500}left( x-70 right)^2 - frac{1}{2^2}left(y-2right)^2right] f]
dontinclude ex_contour.cpp skip Example: until End of example
The figure below shows contour lines in the region f$ xin(0,121), yin(0,9) f$. The data grid is represented by plus signs, and the associated generated contours. The figure clearly shows the peaks at f$ (20,5) f$ and f$ (70,2) f$ .
image html ex_contour_plot1.png “Contour example plot”
The :ref:`contour class can also use interpolation to attempt to refine the data grid. The new contours after a refinement of a factor of 5 is given in the figure below.
image html ex_contour_plot2.png “Contours after regrid_data()”