创建 aw = f(x,y,z) 函数的插值

计算科学 Python 插值 scipy 麻木的
2021-12-02 10:55:30

我正在尝试完成一系列插值函数。这个问题更多地与组织数据有关,而不是如何进行插值。

使用 RegularGridInterpolator,我创建了这个函数:

def interp_3d(x,y,z,fxyz,x_desired,y_desired,z_desired):
    interp_func = RegularGridInterpolator((x,y,z), fxyz)
    return interp_func([x_desired,y_desired,z_desired])

它获取三个一维数组 (x,y,z) 和函数答案 (f(x,y,z)) 以返回插值函数。我遇到的问题与提供给我的数据格式以及函数如何接收它有关。数据以表格形式出现在我面前:

x   y   z   f(x,y,z)
26600   5000    0.05    0.01
26600   5000    0.10    0.02
26600   5000    0.15    0.03
26600   5000    0.20    0.04
26600   5000    0.25    0.05
26600   10000   0.05    0.01
26600   10000   0.10    0.02
26600   10000   0.15    0.03
26600   10000   0.20    0.04
40000   5000    0.00    0.00
40000   5000    0.05    0.01
40000   5000    0.10    0.02
40000   5000    0.15    0.03

我必须在 fxyz = [[[],[],[],[]]] 的数组中组织 f(x,y,z) 函数。

  • 我该怎么做?

  • 假设数据以这种形式出现,你们是否推荐另一种方法来创建这个插值函数?

  • 有什么建议吗?

1个回答

正如我在评论中提到的,您的数据不是在常规网格上定义的,这就是您不应该使用该功能的原因。

中可用的一个选项scipy.interpolategriddata,您可以在其中传递您的点和值,并在您传递的另一组点中进行插值。他们都不需要定期。一个警告是,您将获得数据凸包上的插值(除非您使用最近邻方法)。

下面是一个例子。

import numpy as np
from scipy.interpolate import griddata
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D

# Data
data = np.array([
        [2.66e+04, 5.00e+03, 5.00e-02, 1.00e-02],
        [2.66e+04, 5.00e+03, 1.00e-01, 2.00e-02],
        [2.66e+04, 5.00e+03, 1.50e-01, 3.00e-02],
        [2.66e+04, 5.00e+03, 2.00e-01, 4.00e-02],
        [2.66e+04, 5.00e+03, 2.50e-01, 5.00e-02],
        [2.66e+04, 1.00e+04, 5.00e-02, 1.00e-02],
        [2.66e+04, 1.00e+04, 1.00e-01, 2.00e-02],
        [2.66e+04, 1.00e+04, 1.50e-01, 3.00e-02],
        [2.66e+04, 1.00e+04, 2.00e-01, 4.00e-02],
        [4.00e+04, 5.00e+03, 0.00e+00, 0.00e+00],
        [4.00e+04, 5.00e+03, 5.00e-02, 1.00e-02],
        [4.00e+04, 5.00e+03, 1.00e-01, 2.00e-02],
        [4.00e+04, 5.00e+03, 1.50e-01, 3.00e-02]])
x, y, z, f = data.T

# Interpolation
grid_x, grid_y, grid_z = np.mgrid[26600:40000:5j, 5000:10000:5j, 0.05:0.20:5j]
grid_f = griddata(data[:, :3], f, (grid_x, grid_y, grid_z))

# Visualization
fig = plt.figure(figsize=(7, 3))
ax0 = fig.add_subplot(121, projection='3d')
ax0.scatter(x, y, z, c=f)
ax1 = fig.add_subplot(122, projection='3d')
ax1.scatter(grid_x.flatten(), grid_y.flatten(), grid_z.flatten(),
            c=grid_f.flatten())
plt.show()

您在哪里获得以下结果。左侧是您的原始数据集,插值在右侧。

在此处输入图像描述