【问题标题】:scipy interpolate gives varying resultsscipy interpolate 给出不同的结果
【发布时间】:2018-09-16 07:14:47
【问题描述】:

在使用 scipy.interpolate.interp1d 在 Python 中读取插值函数时,我试图得到相同的答案,但是当我更改 x linspace 的大小时,我得到了不同的结果。

下面是一个简化的例子,我为插值函数提供不同的半径,它们返回的结果截然不同。我无法弄清楚为什么会发生这种情况,因此将不胜感激任何帮助。

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

plt.close('all')

M_centre = 2e30
G = 1.67e-11
m_test = 6e24
radius = np.linspace(5,1e2,1000)
radius2 = np.linspace(5,1e21,1000)
V_circ = np.sqrt(G*M_centre/radius)
V_circ2 = np.sqrt(G*M_centre/radius2)

velocities_circ = interp1d(radius,V_circ)
test_r = velocities_circ(50)
print(test_r)

velocities_circ2 = interp1d(radius2,V_circ2)
test_r2 = velocities_circ2(50)
print(test_r2)


Out: 
817312853.7629617
2584569596.664017

我想过也许 linspace 的步长会导致插值函数的读数不同,但它肯定不能改变一个数量级吗?

编辑:我也使用 numpy.interp 尝试过这种方法,但结果与上述相同。

【问题讨论】:

  • 您不会更改点数,而是更改radius 的值。 np.linspace 具有结构开始、停止、点数。不同的输入,不同的输出。试试np.linspace(5, 1e2,100)np.linspace(5, 1e2,10000)。相同的半径,相同的输出。
  • 是的,但是考虑到两个 linspaces 都通过同一个函数并且都覆盖了一个范围,包括我在哪里评估插值(即 x=50),那么它们肯定会给出相同的结果吗?抱歉,我已经看到您的编辑了.. 更改上面写的 linspaces 仍然会产生不同的结果:817312669.6680217 817312669.668102 尽管差异较小
  • 其实我写的很蠢。即使改变点数也会改变输出,但不会那么剧烈。 Interp1d 不知道生成点对的基础函数,它只是在两个相邻点之间产生线性插值。改变任何两个点,你就改变了线性插值曲线。在您的情况下,在不更改步长的情况下增加停止值会使点彼此远离。由于您的 sqrt 函数不是线性的,因此两点之间的插值不同。
  • 嗯,好吧,所以我猜增加的距离会改变结果,所以解决这个问题的唯一方法可能是执行单位转换,使得 max(radius2) = max(radius)然后在读取插值后撤消转换。谢谢 MrT!

标签: python scipy interpolation radius


【解决方案1】:

只是为了对比减少数字来快速说明问题:

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

M_centre = 2e30
G = 1.67e-11
m_test = 6e24

radius1 = np.linspace(5,1e3,10)
radius2 = np.linspace(5,1e2,10)

V_circ1 = np.sqrt(G*M_centre/radius1)
V_circ2 = np.sqrt(G*M_centre/radius2)

velocities_circ1 = interp1d(radius1,V_circ1)
test_r1 = velocities_circ1(50)
print(test_r1)

velocities_circ2 = interp1d(radius2,V_circ2)
test_r2 = velocities_circ2(50)
print(test_r2)

plt.plot(radius1, V_circ1, "ro", label = "radius1")
plt.plot(radius2, V_circ2, "bx", label = "radius2")

plt.plot(radius1, velocities_circ1(radius1), "r")
plt.plot(radius2, velocities_circ2(radius2), "b")
plt.legend()
plt.xlim(0, 400)
plt.show()

我认为不同输出的原因是显而易见的。

以及相同范围(5, 1e2)但点数不同(3 vs 10)的等效图:

【讨论】:

    猜你喜欢
    • 2018-11-05
    • 1970-01-01
    • 2016-04-22
    • 2016-05-06
    • 2018-11-28
    • 2012-01-30
    • 2019-02-15
    • 2018-10-27
    • 1970-01-01
    相关资源
    最近更新 更多