[python] 使用 scipy 的 griddata 曲面插值

0. 背景:

在做项目的时候,遇到给定空间中的几个点,插值得到空间曲面。对于 MATLAB 来说,有 griddata 这个函数可以实现;对于 Python 来说,我们可以使用 scipy 中的 griddata 也可以实现;

1. 使用的实现函数:

  • meshgrid 网格坐标的一维数组
  • griddata scipy 中的插值函数,插值得到 N 维坐标

2. 测试代码:

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()

3. 结果:

显示图像以及插值点
[python] 使用 scipy 的 griddata 曲面插值_第1张图片

4. 存在的问题:

gridata 曲面插值,可以解决曲面插值的问题。但是,存在的问题是:
曲面的边界只在输入的插值点上,不能延展。如果需要延展曲面,可以 RBF 曲面插值的方法。

你可能感兴趣的:(Python实用源码,技术分享,文档枝术,曲面插值,griddata,python,scipy,曲面拟合)