Метод интерполяции, который не добавляет ненужных экстремумов

Этот вопрос - наполовину программирование, но также и наполовину математика. Я хочу интерполировать набор точек по кривой, не добавляя ненужных экстремумов, оставаясь «близко к линейной интерполяции», сохраняя при этом кривую, которая выглядит гладкой. Я знаю, что эта формулировка расплывчата, но я надеюсь, что с примером она прояснится. Давайте посмотрим на следующий фрагмент кода и результат:

#! /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()

Я ожидал бы интерполант, который имеет только два экстремума (около x ~ 0 и x ~ 2), в то время как здесь у нас есть 5 экстремумов. Это то, что нарисует большинство людей, если мы попросим их соединить точки плавной кривой рукой. Есть ли способ достичь этой цели (в питоне).

Обновление: обратите внимание, что у xfig есть что-то близкое (называемое «приблизительное рисование сплайнов») с неудобствами, которые возникают из-за того, что кривая не проходит точно указанными точками. Я бы предпочел кривую, которая проходит точно через указанные точки, но я бы приветствовал метод xfig, если никто не знает лучшего решения.

Ответы на вопрос(3)

Ваш ответ на вопрос