E8.21Two-dimensional interpolation with scipy.interpolate.RectBivariateSpline
In the following code, the function
\[z(x,y) = e^{-4x^2}e^{-y^2/4}\]
is calculated on a regular, coarse grid and then interpolated onto a finer one.
rectbivariatespline
import numpy as np
from scipy.interpolate import RectBivariateSpline
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
# Regularly-spaced, coarse grid
dx, dy = 0.4, 0.4
xmax, ymax = 2, 4
x = np.arange(-xmax, xmax, dx)
y = np.arange(-ymax, ymax, dy)
X, Y = np.meshgrid(x, y)
Z = np.exp(-((2 * X) ** 2) - (Y / 2) ** 2)
interp_spline = RectBivariateSpline(y, x, Z)
# Regularly-spaced, fine grid
dx2, dy2 = 0.16, 0.16
x2 = np.arange(-xmax, xmax, dx2)
y2 = np.arange(-ymax, ymax, dy2)
X2, Y2 = np.meshgrid(x2, y2)
Z2 = interp_spline(y2, x2)
fig, ax = plt.subplots(
nrows=1, ncols=2, subplot_kw={"projection": "3d"}
)
ax[0].plot_wireframe(X, Y, Z, color="k", lw=0.5)
ax[1].plot_wireframe(X2, Y2, Z2, color="k", lw=0.5)
for axes in ax:
axes.set_zlim(-0.2, 1)
axes.set_axis_off()
fig.tight_layout()
plt.show()
Note that for our function, Z, defined using the meshgrid set up here, the RectBivariateSpline method expects the corresponding one-dimensional arrays y and x to be passed in this order (opposite to that of interp2d.) This issue is related to the way that meshgrid is indexed which is based on the conventions of MATLAB.