在 python 中微分二维三次样条

Differentiate a 2d cubic spline in python

我正在使用 interpolate.interp2d() 在函数上拟合二维样条。如何获得样条曲线的一阶导数 w.r.t。每个因变量?到目前为止,这是我的代码,Z 是我拥有的网格上的离散点

from scipy import interpolate
YY, XX = np.meshgrid(Y, X)
f = interpolate.interp2d(AA, XX, Z, kind='cubic')

所以,我需要 df/dx 和 df/dy。另请注意,我的 Y 网格不是均匀分布的。我想我可以对 Z 进行数值微分,然后拟合一条新的样条曲线,但这似乎太麻烦了。有没有更简单的方法?

您可以通过在带有可选参数 dx 和插值的 tck 属性 上使用函数 bisplev 来区分 interp2d 的输出dy.

如果您有一些已插值的网格化数据:

X = np.arange(5.)

Y = np.arange(6., 11)
Y[0] = 4  # Demonstrate an irregular mesh
YY, XX = np.meshgrid(Y, X)
Z = np.sin(XX*2*np.pi/5 + YY*YY*2*np.pi/11)

f = sp.interpolate.interp2d(XX, YY, Z, kind='cubic')

xt = np.linspace(X.min(), X.max())
yt = np.linspace(Y.min(), Y.max())

然后您可以访问 bisplev 的适当结构,如 f.tckf 关于 x 的偏导数可以计算为

Z_x = sp.interpolate.bisplev(xt, yt, f.tck, dx=1, dy=0)

编辑:从this answer, it looks like the result of interp2d本身可以接受dxdy的可选参数:

Z_x = f(xt, yt, dx=1, dy=0)