scipy interpolate给出了不同的结果

时间:2018-04-06 09:37:02

标签: python scipy interpolation radius

我尝试使用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这个方法,但它给出了与上面相同的结果。

1 个答案:

答案 0 :(得分: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()

我认为产出不同的原因是显而易见的。 enter image description here

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

enter image description here