scipy结果线性插值结果不一致

时间:2013-05-07 08:36:39

标签: python numpy scipy interpolation

我需要对包含'n'个独立变量和因变量的数据执行线性插值。我目前正在使用scipy.interpolate.LinearNDInterpolator来执行插值。但是,当我通过将所有(变量的)值与常量相乘来改变数据集的范围时,插值完全改变后的结果。

让我用一个具体的例子说明这一点:

 X = [[0.00000000e+00, 1.00000000e+00], [0.00000000e+00, 8.00000000e+00], [0.00000000e+00, 1.60000000e+01], [0.00000000e+00, 3.20000000e+01], 
      [0.00000000e+00, 6.40000000e+01], [0.00000000e+00, 1.28000000e+02], [1.00000000e-06, 1.00000000e+00], [1.00000000e-06, 8.00000000e+00], 
      [1.00000000e-06, 1.60000000e+01], [1.00000000e-06, 3.20000000e+01], [1.00000000e-06, 6.40000000e+01], [1.00000000e-06, 1.28000000e+02], 
      [1.00000000e-06, 2.56000000e+02], [1.00000000e-06, 5.12000000e+02], [1.00000000e-05, 1.00000000e+00], [1.00000000e-05, 8.00000000e+00], 
      [1.00000000e-05, 1.60000000e+01], [1.00000000e-05, 3.20000000e+01], [1.00000000e-05, 6.40000000e+01], [1.00000000e-05, 1.28000000e+02], 
      [1.00000000e-05, 2.56000000e+02], [1.00000000e-05, 5.12000000e+02], [1.00000000e-04, 1.00000000e+00], [1.00000000e-04, 8.00000000e+00], 
      [1.00000000e-04, 1.60000000e+01], [1.00000000e-04, 3.20000000e+01], [1.00000000e-04, 6.40000000e+01], [1.00000000e-04, 1.28000000e+02], 
      [1.00000000e-04, 2.56000000e+02], [1.00000000e-04, 5.12000000e+02], [1.00000000e-03, 1.00000000e+00], [1.00000000e-03, 8.00000000e+00], 
      [1.00000000e-03, 1.60000000e+01], [1.00000000e-03, 3.20000000e+01], [1.00000000e-03, 6.40000000e+01], [1.00000000e-03, 1.28000000e+02], 
      [1.00000000e-02, 1.00000000e+00], [1.00000000e-02, 8.00000000e+00], [1.00000000e-02, 1.60000000e+01], [1.00000000e-02, 3.20000000e+01], 
      [1.00000000e-02, 6.40000000e+01], [1.00000000e-02, 1.28000000e+02]]
 y = [0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 0.00000000e+00, 6.99000000e-17, 5.60000000e-16, 1.12011400e-15, 2.24034300e-15, 
      4.48080000e-15, 7.56193140e-14, 2.17896343e-13, 5.02450401e-13, 6.99000000e-16, 5.60000000e-15, 1.12011430e-14, 2.24034290e-14, 4.48080000e-14, 8.96171430e-14, 
      1.79235429e-13, 3.58472001e-13, 6.99000000e-15, 5.60000000e-14, 1.12011429e-13, 2.24034286e-13, 4.48080000e-13, 8.96171429e-13, 1.79235429e-12, 3.58472000e-12, 
      6.99000000e-14, 5.60000000e-13, 1.10000000e-12, 2.20000000e-12, 4.50000000e-12, 9.00000000e-12, 6.99000000e-13, 5.60000000e-12, 1.12000000e-11, 2.24000000e-11, 
      4.48000000e-11, 8.95000000e-11]

当我对值[7.10000000e-05, 18]执行插值时,我得到结果7.95281146e-14。如果我将第一列乘以10^3而将结果列乘以10^12,那么我得到的结果就完全不同了。我得到的0.09352相当于9.352e-14

  • 有人可以说明为什么scipy会在这些情况下给出不同的结果吗?
  • 这些结果中的哪一个是对的? (我尝试使用excel,但我很快意识到scipy使用了不同的技术)。
  • 我该如何解决这个问题?

2 个答案:

答案 0 :(得分:2)

正如Robert Kern所述,答案是两个答案都是正确的。然而,他们回答了不同的问题。

当在点(x, y)处插入散乱数据时,算法必须知道问题的答案:“哪个数据点最接近(x, y)。现在,显而易见的方法这个,以及算法中使用的Delaunay三角剖分是基于,是使用欧几里德距离:

distance = sqrt((x[i] - x)**2 + (y[i] - y)**2)

现在,如果你将x坐标缩放1e3,那么“哪个点最接近”问题的答案显然会随着y坐标变得不那么重要而改变。

正确的选择是使用欧几里德距离有意义的缩放。如果你正在做物理学,那么x坐标和y坐标应该具有相同的单位或者都是无量纲的。

答案 1 :(得分:1)

这是机器精度的问题。直言不讳地说,你的y值甚至超出了舍入误差的大小,对于双精度浮点数约为1.1e-16

请查看此参考,以获得更好的解释What Every Computer Scientist Should Know About Floating-Point Arithmetic