【发布时间】:2026-02-06 02:55:01
【问题描述】:
我有一条复杂的曲线,定义为表格中的一组点,如下所示(完整表格为here):
# x y
1.0577 12.0914
1.0501 11.9946
1.0465 11.9338
...
如果我使用以下命令绘制此表:
plt.plot(x_data, y_data, c='b',lw=1.)
plt.scatter(x_data, y_data, marker='o', color='k', s=10, lw=0.2)
我得到以下信息:
我手动添加了红点和线段。我需要的是一种为每个点计算这些段的方法,即:找到从这个 2D 空间中的给定点到插值曲线的最小距离的方法。
我不能使用到数据点本身的距离(生成蓝色曲线的黑点),因为它们的间隔不相等,有时它们很近,有时它们相距很远,这深深影响了我的结果更进一步。
由于这不是一条表现良好的曲线,我不太确定我能做什么。我尝试用UnivariateSpline 对其进行插值,但它返回的拟合度很差:
# Sort data according to x.
temp_data = zip(x_data, y_data)
temp_data.sort()
# Unpack sorted data.
x_sorted, y_sorted = zip(*temp_data)
# Generate univariate spline.
s = UnivariateSpline(x_sorted, y_sorted, k=5)
xspl = np.linspace(0.8, 1.1, 100)
yspl = s(xspl)
# Plot.
plt.scatter(xspl, yspl, marker='o', color='r', s=10, lw=0.2)
我也尝试增加插值点的数量,但结果一团糟:
# Sort data according to x.
temp_data = zip(x_data, y_data)
temp_data.sort()
# Unpack sorted data.
x_sorted, y_sorted = zip(*temp_data)
t = np.linspace(0, 1, len(x_sorted))
t2 = np.linspace(0, 1, 100)
# One-dimensional linear interpolation.
x2 = np.interp(t2, t, x_sorted)
y2 = np.interp(t2, t, y_sorted)
plt.scatter(x2, y2, marker='o', color='r', s=10, lw=0.2)
任何想法/指针将不胜感激。
【问题讨论】:
-
这个问题不是凸的 (en.wikipedia.org/wiki/Convex_optimization)... 这意味着优化技术通常不能保证给出全局最小值。也就是说,模拟退火是尝试在不完美世界中找到全局最优值的一种选择。
标签: python numpy scipy interpolation spline