Método de interpolação que não adiciona extremos desnecessários

Esta questão é meia programação, mas também meia matemática. Quero interpolar um conjunto de pontos por uma curva sem adicionar extremos desnecessários, ficando "próximos à interpolação linear", mantendo uma curva que parece suave. Sei que essa formulação é vaga, mas espero que comece com um exemplo mais claro. Vamos analisar o seguinte trecho de código e o resultado:

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

Eu esperava um interpolante que tivesse apenas dois extremos (em torno de x ~ 0 ex ~ 2), enquanto aqui temos 5 extremos. É o que a maioria das pessoas desenha se pedirmos que juntem os pontos com uma curva suave à mão. Existe uma maneira de atingir esse objetivo (em python).

Atualização: Observe que o xfig tem algo próximo (chamado "desenho de spline aproximado") com os inconvenientes de que a curva não passa exatamente pelos pontos especificados. Eu preferiria uma curva que passe exatamente pelos pontos especificados, mas gostaria do método xfig se ninguém souber uma solução melhor.

questionAnswers(3)

yourAnswerToTheQuestion