Scipy SmoothBivariateSpline偏导数计算报错问题求助
Scipy光滑样条求偏导数报错问题解决
问题描述
我尝试对Scipy中拟合的光滑样条求x方向的二阶偏导数,代码如下:
spline = SmoothBivariateSpline(x,y,z,kx=3,ky=1) splinedxx = spline.partial_derivative(2,0)
执行后出现如下错误:
File "C:\Users\xxxxx\AppData\Roaming\Python\Python39\site-packages\scipy\interpolate\_fitpack2.py", line 988, in partial_derivative newc, ier = dfitpack.pardtc(tx, ty, c, kx, ky, dx, dy) dfitpack.error: ((0 <= nuy) && (nux < ky)) failed for 7th argument nuy: pardtc:nuy=0
求一阶偏导数时也会出现相同错误,请问是我的操作有误还是数据导致的问题?
问题原因与解决
这个报错是因为你设置的ky=1(y方向的样条阶数为1),而partial_derivative依赖的底层函数pardtc有硬性约束:当对x求导(即dy=0)时,必须满足dx < ky。你这里求一阶导dx=1、二阶导dx=2,都不满足dx < 1的条件,因此触发错误。
解决方法有两种:
- 提升y方向的样条阶数,比如将
ky设为3(与kx一致),此时dx=2 < 3满足约束,代码可正常执行:spline = SmoothBivariateSpline(x,y,z,kx=3,ky=3) splinedxx = spline.partial_derivative(2,0) - 如果业务场景必须保持
ky=1,可以先通过SmoothBivariateSpline得到拟合后的节点和系数,再用RectBivariateSpline重构样条,它的求导逻辑没有这个限制:spline = SmoothBivariateSpline(x,y,z,kx=3,ky=1) # 提取拟合后的节点与系数 tx, ty, c = spline.get_residual() rect_spline = RectBivariateSpline(tx, ty, c, kx=3, ky=1) splinedxx = rect_spline.partial_derivative(2,0)
内容的提问来源于stack exchange,提问作者Gabriella Chaos
相关产品推荐
相关产品推荐

