scipy.interpolate.Rbf()的插值不准确

时间:2018-08-06 06:39:35

标签: python numpy scipy interpolation

当我执行以下代码时

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

x_coarse, y_coarse = np.mgrid[0:5, 0:5]
x_fine, y_fine = np.mgrid[1:4:0.23,1:4:0.23]
data_coarse = np.ones([5,5])

rbfi = Rbf(x_coarse.ravel(), y_coarse.ravel(), data_coarse.ravel())

interpolated_data = rbfi(x_fine.ravel(), y_fine.ravel()).reshape([x_fine.shape[0], 
                                                                  y_fine.shape[0]])

plt.imshow(interpolated_data)

数组interpolated_data的值范围从0.988到1.002,相应的图如下所示:

Plot of the array 'data_fine'

但是,我希望在这种简单的插值情况下,插值会更接近正确的值,即1.000。

我认为内插值的变化是由内插点到给定数据点的距离不同引起的。

我的问题是:有没有办法避免这种行为?我怎么能得到一个插值,该插值不受插值点到数据点的距离的加权,并且除了interpolated_data中的1.000之外什么都给我什么?

1 个答案:

答案 0 :(得分:3)

  

我希望在这种简单的插值情况下,

毫无根据的期望。顾名思义,RBF插值使用径向基函数。默认情况下,基函数sqrt((r/epsilon)**2 + 1),其中r是到数据点的距离,而epsilon是正参数。这样的函数的加权和不可能完全相同。 RBF插值不同于线性或双线性插值。这是适合于粗略数据的粗略插值。

通过设置一个非常大的epsilon,您可以接近1;仅仅因为它使基础函数在网格上几乎相同。

rbfi = Rbf(x_coarse.ravel(), y_coarse.ravel(), data_coarse.ravel(), epsilon=10)
# ... 
print(interpolated_data.min(), interpolated_data.max())
# outputs 0.9999983458255883 1.0000002402521204 

但是这不是一个好主意,因为当数据不是恒定时,内插中会有太多的远程影响。

  

除了interpolated_data 1.000之外什么都没有给我吗?

那将是线性插值。 LinearNDInterpolatorRbf的语法相似,因为它返回一个可调用对象。

linear = LinearNDInterpolator(np.stack((x_coarse.ravel(), y_coarse.ravel()), axis=-1), 
                              data_coarse.ravel())
interpolated_data = linear(x_fine.ravel(), y_fine.ravel()).reshape([x_fine.shape[0], y_fine.shape[0]])
print(interpolated_data.min(), interpolated_data.max())
# outputs 1.0 1.0 

还有一个griddata,它具有更多的插值模式。