Этот вопрос является полупрограммированием, но также и половиной математики. Я хочу, чтобы интерполировать множество точек кривой без добавления ненужных экстремумов, остающихся «близкими к линейной интерполяции», сохраняя при этом кривую, которая выглядит гладко. Я знаю, что эта формулировка расплывчата, но я надеюсь, что она станет более ясной с примера. Давайте посмотрим на следующий фрагмент кода и результат:Метод интерполяции, который не добавляет лишних экстремумов
#! /usr/bin/python
import numpy as np
from scipy.interpolate import interp1d
import matplotlib.pyplot as plt
fig = plt.figure()
ax = fig.add_subplot(1,1,1)
ax.spines['left'].set_position('zero')
ax.spines['right'].set_color('none')
ax.spines['bottom'].set_position('zero')
ax.spines['top'].set_color('none')
ax.xaxis.set_ticks_position('bottom')
ax.yaxis.set_ticks_position('left')
list_points=[(-3,0.1),(-2,0.15),(0,4),(2,-6),(4,-2),(7,-0.15),(8,-0.1)]
(xp,yp)=zip(*list_points)
fun=interp1d(xp,yp,kind='cubic')
xc=np.linspace(min(xp),max(xp),300)
plt.plot(xp,yp,'o',color='black',ms=5)
plt.plot(xc,fun(xc))
fun2=interp1d(xp,yp,kind='linear')
plt.plot(xc,fun2(xc))
plt.show()
Я бы ожидать интерполянт, что есть только два экстремума (около х ~ 0 и х ~ 2) в то время как здесь мы имеем 5 экстремумы. Это то, что большинство людей будет рисовать, если мы попросим их присоединиться к точкам с гладкой кривой вручную. Есть ли способ достичь этой цели (на питоне).
Обновление: обратите внимание, что xfig имеет что-то близкое (называемое «приблизительным сплайн-чертежом») с неудобствами, которые кривая не проходит точно по указанным точкам. Я бы предпочел кривую, которая проходит точно через указанные точки, но я бы приветствовал метод xfig, если никто не знает лучшего решения.
Хммм из любопытства , Это не слесарь, почему функция должна быть гладкой? При интерполяции вы всегда получите конечный набор точек.Поэтому вы никогда не сможете точно сказать, было ли оригинальное изображение гладким или нет. – luk32