如何用Python对向量场进行插值?

Bas*_*asj 3 python interpolation numpy vector

我有一个 2D 矢量场(实际上它是 3D,但如果我们知道如何用 2D 实现它,我认为它会很容易推广到 3D),如下所示:

import matplotlib.pyplot as plt, numpy as np
x = [0, 0, 1, 1, 2, 2, 0, 1, 2]
y = [1, 2, 1, 2, 1, 2, 1.5, 1.5, 1.5]
u = [0.5, -1, 0, 0, 0.25, 1, 0, 0, 0.75]
v = [1, 1, 1, 1, 1, 1, 1, 1, 1]
plt.quiver(x, y, u, v)
plt.show()
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述

如何平滑地插值这个向量场?

我知道如何使用np.polyfit,但我不知道如何对向量场进行插值。

示例:我想插入[0,2]x[1,2]数百个箭头。

Han*_*rse 6

使用 NumPymeshgrid和 SciPy 的interpolate.griddata方法,这可能是一个快速且可行的解决方案:

import matplotlib.pyplot as plt
import numpy as np
from scipy import interpolate

x = [0, 0, 1, 1, 2, 2, 0, 1, 2]
y = [1, 2, 1, 2, 1, 2, 1.5, 1.5, 1.5]
u = [0.5, -1, 0, 0, 0.25, 1, 0, 0, 0.75]
v = [1, 1, 1, 1, 1, 1, 1, 1, 1]

plt.figure(1)
plt.quiver(x, y, u, v)

xx = np.linspace(0, 2, 10)
yy = np.linspace(1, 2, 10)
xx, yy = np.meshgrid(xx, yy)

points = np.transpose(np.vstack((x, y)))
u_interp = interpolate.griddata(points, u, (xx, yy), method='cubic')
v_interp = interpolate.griddata(points, v, (xx, yy), method='cubic')

plt.figure(2)
plt.quiver(xx, yy, u_interp, v_interp)
plt.show()
Run Code Online (Sandbox Code Playgroud)

插值图的输出:

输出

调整调用中要创建的点数np.linspace,可以为您提供更多或更少的箭头。

希望有帮助!