在 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.tck
:f
关于 x
的偏导数可以计算为
Z_x = sp.interpolate.bisplev(xt, yt, f.tck, dx=1, dy=0)
编辑:从this answer, it looks like the result of interp2d
本身可以接受dx
和dy
的可选参数:
Z_x = f(xt, yt, dx=1, dy=0)
我正在使用 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.tck
:f
关于 x
的偏导数可以计算为
Z_x = sp.interpolate.bisplev(xt, yt, f.tck, dx=1, dy=0)
编辑:从this answer, it looks like the result of interp2d
本身可以接受dx
和dy
的可选参数:
Z_x = f(xt, yt, dx=1, dy=0)