Расширьте линию, чтобы плавно соединиться с точкой - PullRequest
0 голосов
/ 01 октября 2018

У меня есть кривая, которая выглядит следующим образом: enter image description here У меня есть все точки данных до максимального значения a_max = 903 Мне нужно продлить эту кривую как можно более плавно с дополнительным ограничением, котороеоно должно достигать y = 0, когда k = 1000

Я знаю, что, вероятно, должен использовать:

  from scipy.interpolate import spline

, но я не вижу, как наложить ограничение.

1 Ответ

0 голосов
/ 01 октября 2018

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

РЕДАКТИРОВАТЬ: параболическая подгонка путем взвешивания данных таким образом, чтобы первая точка набора данных и [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

И для сравнения:

  • зеленый: без гирь
  • красный: с гирьками
  • синийкружок: [1000, 0]

enter image description here

Дополнительно:

Код иДанные, из которых получены графики выше:

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')
...