我想用python插值一个3D向量场
初始网格->;无关联的u、v、w =>;新网格-->;计算相关的u,v,w
创建样本向量场的代码:
import matplotlib.pyplot as plt
import numpy as np
from scipy.interpolate import RegularGridInterpolator
# REDUCED EXAMPLE
Nx = 8
Ny = 8
Nz = 3
grid = np.meshgrid(np.linspace(-1, 1, Nx),
np.linspace(-1, 1, Ny),
np.linspace(-1, 1, Nz))
x,y,z = grid
# CONSTRUCT u,v,w
u = np.sin(np.pi * x) * np.cos(np.pi * y) * np.cos(np.pi * z)
v = -np.cos(np.pi * x) * np.sin(np.pi * y) * np.cos(np.pi * z)
w = (np.sqrt(2.0 / 3.0) * np.cos(np.pi * x) * np.cos(np.pi * y) *
np.sin(np.pi * z))
fig = plt.figure(dpi=300)
ax = fig.gca(projection='3d')
ax.quiver(x, y, z, u, v, w, length=0.2)
plt.title("Reduced")
plt.show()
。。。我尝试创建一个插值函数:
def interpolate_field(old_points,u,v,w,new_points):
# old points zip(x,y,z) where x,y,z linspace -> regular grid
# u,v,w each of shape (NX, NY, NZ)
# mew points np.array(list(zip(xx,yy,zz))) where xx,yy,zz np.meshgrid
x, y, z = old_points
u_int_f = RegularGridInterpolator((x, y, z), u)
v_int_f = RegularGridInterpolator((x, y, z), v)
w_int_f = RegularGridInterpolator((x, y, z), w)
u_int = u_int_f(new_points)
v_int = v_int_f(new_points)
w_int = w_int_f(new_points)
return u_int, v_int, w_int
…但当我尝试应用它时:+
# New grid
NNx = 20
NNy = 20
NNz = 3
grid = np.meshgrid(np.linspace(-1, 1, NNx),
np.linspace(-1, 1, NNy),
np.linspace(-1, 1, NNz))
# Reshape for interpolation function
u_reshape = np.reshape(u, (Nx, Ny, Nz))
v_reshape = np.reshape(v, (Nx, Ny, Nz))
w_reshape = np.reshape(w, (Nx, Ny, Nz))
old_points = (x,y,z)
new_points = np.vstack(list(map(np.ravel, grid))).T
u_int, v_int, w_int = interpolate_field(old_points,
u_reshape,
v_reshape,
w_reshape,
new_points)
我得到一个错误:
ValueError: The points in dimension 0 must be strictly ascending
RegularGridInterpolator在应用网格网格之前需要一组点
因此,您可以事先通过网格:
或者,您可以尝试从插值_场函数中反转网格网格
编辑:
相关问题 更多 >
编程相关推荐