我尝试使用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这个方法,但它给出了与上面相同的结果。
答案 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()
相同范围(5,1e2)的等效图,但点数不同(3对10):