Python 延伸线以平滑地与点连接

Python 延伸线以平滑地与点连接,python,interpolation,spline,Python,Interpolation,Spline,我有一条像这样的曲线: 我拥有所有数据点,直到最大值a_max=903 我需要以最平滑的方式延长这条曲线,并附加一个约束,即当k=1000时,它必须达到y=0 我知道我可能必须使用: from scipy.interpolate import spline 但我不知道如何施加约束。我认为这不是插值问题。你想要外推——理想情况下,你知道基于物理或任何数据的曲线的理论类型。应该是指:如果您知道该数据是一个二次多项式函数,请使用以下函数进行拟合: a_coeff = np.polyfit(k,

我有一条像这样的曲线: 我拥有所有数据点,直到最大值a_max=903 我需要以最平滑的方式延长这条曲线,并附加一个约束,即当k=1000时,它必须达到y=0

我知道我可能必须使用:

  from scipy.interpolate import spline

但我不知道如何施加约束。

我认为这不是插值问题。你想要外推——理想情况下,你知道基于物理或任何数据的曲线的理论类型。应该是指:如果您知道该数据是一个二次多项式函数,请使用以下函数进行拟合:

a_coeff = np.polyfit(k, a, 2)
k2 = np.arange(1001)

plt.plot(k2 , a_coeff[0]*k2**2 + a_coeff[1]*k2 + a_coeff[2], 'g')
看看你是否相信

编辑:通过称量数据进行抛物线拟合,使数据集的第一个点和[1000,0]最重要:

k_forfit = np.append(k, 1000)

a_forfit = np.append(a, 0)

weight = np.ones(len(k_forfit))

weight[0] = weight[-1] = 1000

a_coeff = np.polyfit(k_forfit, a_forfit, 2, w=weight)

plt.figure()
plt.plot(k, a)

plt.plot(k2 , a_coeff[0]*k2**2 + a_coeff[1]*k2 + a_coeff[2], 'g')

作为比较:

  • 绿色:没有重量
  • 红色:有重量
  • 蓝色圆圈:[1000,0]

补充:

产生上述图表的代码和数据:


这正是关键所在。我不确定理论曲线应该是什么,它可能是抛物线。但我需要以最平滑的方式将它延长到1000,我不认为二次函数会是,这听起来像是“可能是抛物线”是到目前为止你最好的猜测。我的意思是它可能是一个普拉博拉,而不是它一定会是普拉博拉。此外,不确定使用prabola拟合是否会得出x=1000 y时的值为0…您可以对要拟合的数据点应用权重,即让
[0,0]
[1000,0]
比所有其他数据点都重要得多。我将编辑…好的,我看到这解决了端点的问题。但现在我还看到,我目前拥有的最后一个数据点和第一个“拟合”数据点之间存在“差距”。我也需要消除这种差距
x = np.linspace(0, 903, 200)
y = -.005*(x-480)**2+1200

plt.figure()
plt.plot(x, y+(np.random.random(200)-.5)*100)
y2 = np.polyfit(x, y, 2)
plt.plot(np.arange(1000), y2[0]*np.arange(1000)**2 + y2[1]*np.arange(1000) +y2[2], 'g')
y2 = np.polyfit(x_forfit, y_forfit, 2, w=weight)
plt.plot(np.arange(1000), y2[0]*np.arange(1000)**2 + y2[1]*np.arange(1000) +y2[2], 'r')
plt.plot(1000, 0, 'bo')