在做项目的时候,遇到给定空间中的几个点,插值得到空间曲面。对于 MATLAB 来说,有 griddata 这个函数可以实现;对于 Python 来说,我们可以使用 scipy 中的 griddata 也可以实现;
import numpy as np
import matplotlib.pyplot as plt
from scipy.interpolate import griddata
from mpl_toolkits.mplot3d import axes3d
def generate_data_3():
""" point number : 16 """
x = [0, 0, 0, 1, 2, 2, 2, 2, 4, 4, 4, 1, 6, 6, 6, 6]
y = [0, 4, 8, 12, 0, 4, 8, 13, 0, 4, 8, 15, 0, 4, 8, 11]
z = [0, 0, -3, 5, 6, 0, 0, 7, 0, 0, -3, 1, 6, -3, 0, 8]
return x, y, z
x, y, z = generate_data_3()
# target grid to interpolate to
xi = np.array(np.arange(np.min(x) - 20, np.max(x) + 20, 0.1), dtype=np.float)
yi = np.array(np.arange(np.min(y) - 20, np.max(y) + 20, 0.1), dtype=np.float)
xi, yi = np.meshgrid(xi, yi)
# interpolate
zi = griddata((x, y), z, (xi, yi), method='cubic')
# plot
fig = plt.figure()
ax = fig.add_subplot(111, projection='3d')
ax.plot_wireframe(xi, yi, zi, rstride=1, cstride=1)
plt.plot(x, y, z, 'k.')
plt.xlabel('xi', fontsize=16)
plt.ylabel('yi', fontsize=16)
plt.ylabel('zi', fontsize=16)
plt.title('point number: 16')
plt.show()
gridata 曲面插值,可以解决曲面插值的问题。但是,存在的问题是:
曲面的边界只在输入的插值点上,不能延展。如果需要延展曲面,可以 RBF 曲面插值的方法。