二维线性插值产生数据范围之外的结果

Linear interpolation in two dimensions produces results outside of the data range

我正在使用 interp2d 方法生成线性样条函数。对于某些点集,结果函数产生的结果超出了我的预期。例如:

from scipy import interpolate

x = [81, 81, 81, 83, 83, 83]
y = [ 9,  7,  5,  9,  7,  5]
z = [23.75374, 23.75416, 23.75376, 23.75621, 23.75581, 23.75686]
f = interpolate.interp2d(x, y, z, kind='linear')

print (str(f(82, 6)[0]))
print (str(f(82.5, 6.5)[0]))
print (str(f(81.5, 5.5)[0]))

产生以下输出:

8.07860599193
0.240930002164
15.9162159912

我会尝试使用这种插值方法的刚度参数,但显然它在 interp2d 中不可用。

是什么导致了这些结果?如何避免?

如何避免这种情况

在矩形网格的点进行插值时,最好通过提供网格结构数据来告诉 interp2d 这是发生了什么:x 坐标的 m 个值,y 坐标的 n 个值,以及 z形状(n,m)。使用与您相同的点,我们得到正确的结果:

x = [81, 83]
y = [9, 7, 5]
z = np.array([[23.75374, 23.75416, 23.75376], [23.75621, 23.75581, 23.75686]]).T
f = interpolate.interp2d(x, y, z, kind='linear')
print(f(82, 6)[0], f(82.5, 6.5)[0], f(81.5, 5.5)[0])

输出23.7551475 23.755569375 23.754544375

为什么会这样

样条构造例程需要三角网格来构建分段线性函数。它不知道您传递的值位于矩形网格上;它只看到一堆点,其中许多点共线并且不理解如何从它们形成三角形。所以...它添加了三个坐标在 (82.5, 5)、(82.5, 7)、(82.5, 9) 附近的顶点,以便拥有这样的三角形。问题是,因为我们在这些点上没有值,所以它们只是被认为是零。当然插值是没有价值的。

有人可能会问,为什么算法没有显示结果不稳定的警告? 它做了。在禁用安静模式的情况下将您的积分直接传递给 bisplrep

spl = interpolate.bisplrep(x, y, z, kx=1, ky=1, s=0, quiet=0)

显示

RuntimeWarning: Warning. The coefficients of the spline have been computed as the minimal norm least-squares solution of a rank deficient system. kx,ky=1,1 nx,ny=5,5 m=6 fp=0.000000 s=0.000000 warnings.warn(RuntimeWarning(_mess))

翻译:"I didn't have enough data, so I made some up"。方法 interp2d 在内部调用 bisplrep 但抑制了它的错误消息...