【发布时间】:2013-10-01 13:35:18
【问题描述】:
我有一个不均匀间隔的 (x,y) 值列表。 Here 是本题使用的存档。
我能够在值之间进行插值,但我得到的不是等间距的插值点。这是我的工作:
x_data = [0.613,0.615,0.615,...]
y_data = [5.919,5.349,5.413,...]
# Interpolate values for x and y.
t = np.linspace(0, 1, len(x_data))
t2 = np.linspace(0, 1, 100)
# One-dimensional linear interpolation.
x2 = np.interp(t2, t, x_data)
y2 = np.interp(t2, t, y_data)
# Plot x,y data.
plt.scatter(x_data, y_data, marker='o', color='k', s=40, lw=0.)
# Plot interpolated points.
plt.scatter(x2, y2, marker='o', color='r', s=10, lw=0.5)
结果:
可以看出,在图中原始点分布更密集的部分,红点更靠近。
我需要一种方法来根据给定的步长值(比如 0.1)在 x、y 中生成插值 等距
正如 askewchan 正确指出的那样,当我的意思是“等距 in x, y”时,我的意思是曲线中的两个连续插值点应该彼此远离(欧几里得直线距离)由相同的值。
我尝试了 unubtu 的答案,它适用于平滑曲线,但似乎不适合不太平滑的曲线:
发生这种情况是因为代码以欧几里得方式而不是直接在曲线上计算点距离,并且我需要 曲线上 的距离在点之间相同。能否以某种方式解决此问题?
【问题讨论】:
-
“equispaced in x, y”是否表示沿曲线的切线等距?
-
@askewchan 对不起,我表达得模棱两可。我将重构问题以使其更清楚。
-
换句话说,你想要
dx = step / sqrt(1 + (y')**2) -
您需要将插值构建为函数
y(x),然后在某个数组x上调用它,该数组不是线性间隔的,而是与 x (dx) 中的每一步间隔为您的所需的步长(例如 ds)除以(1 + 斜率平方)的 sqrt。这是因为曲线段的弧长的长度为 ds = sqrt(1 + slope^2)*dx(来自勾股定理 ds^2 = dx^2 + dy^2) -
"...应该彼此保持距离...",如何测量距离?是直线还是沿曲线的距离?
标签: python numpy scipy interpolation