【发布时间】: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