IMO это не проблема интерполяции.Вы хотите экстраполировать - и в идеале вы знаете теоретический тип кривой, основанный на физике или любых данных, которые у вас там есть.Это должно означать: если вы знаете, что эти данные являются полиномиальной функцией 2-й степени, установите их с такой функцией:
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')
И посмотрите, уверены ли вы ...
![enter image description here](https://i.stack.imgur.com/ohZqq.png)
РЕДАКТИРОВАТЬ: параболическая подгонка путем взвешивания данных таким образом, чтобы первая точка набора данных и [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')
![enter image description here](https://i.stack.imgur.com/jRRlk.png)
И для сравнения:
- зеленый: без гирь
- красный: с гирьками
- синийкружок: [1000, 0]
![enter image description here](https://i.stack.imgur.com/khWZK.png)
Дополнительно:
Код иДанные, из которых получены графики выше:
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')