# Interpolación cúbica monótona

En el campo matemático del análisis numérico, la interpolación cúbica monótona es una variante del interpolador cúbico de Hermite que preserva la monotonicidad del conjunto de datos que se está interpolando.
La interpolación lineal preserva la monotonicidad (es decir, que la altura de la serie de puntos y de la curva sea siempre ascendente o descendente, sin cambios en el signo de la pendiente), pero la interpolación cúbica no la garantiza.

## Interpolación cúbica monótona de Hermite

La interpolación monótona se puede lograr usando el interpolador cúbico de Hermite con las tangentes $m_{i}$ modificadas para garantizar la monotonicidad del spline de Hermite resultante.
También está disponible un algoritmo para la interpolación monótona quíntica de Hermite.

### Selección del polinomio interpolante

Hay varias formas de seleccionar tangentes de interpolación para cada punto del conjunto de datos. Esta sección describirá el uso del método de Fritsch-Carlson. Téngase en cuenta que solo se requiere una pasada del algoritmo.
Considérese que los puntos del conjunto de datos $(x_{k},y_{k})$ se indexen en orden para $k=1,\,\dots \,n$.
* Calcular las pendientes de las rectas secantes entre puntos sucesivos:$\delta _{k}={\frac {y_{k+1}-y_{k}}{x_{k+1}-x_{k}}}$ para $k=1,\,\dots \,n-1$.
* Estas asignaciones son provisionales, y pueden ser reemplazadas en los pasos restantes. Inicialícense las tangentes en cada punto de datos interior como el promedio de las secantes,$m_{k}={\frac {\delta _{k-1}+\delta _{k}}{2}}$ para $k=2,\,\dots \,n-1$. Para los puntos finales, utilizar las diferencias de un solo lado: $m_{1}=\delta _{1}\quad {\text{ y }}\quad m_{n}=\delta _{n-1}\,$. Si $\delta _{k-1}$ y $\delta _{k}$ tienen signos opuestos, configurar $m_{k}=0$.
* Para $k=1,\,\dots \,n-1$, siempre que $\delta _{k}=0$ (donde dos $y_{k}=y_{k+1}$ sucesivos sean iguales), establecer $m_{k}=m_{k+1}=0,$ ya que el spline que conecta estos puntos siempre debe decrecer (o crecer) a medida que se avanza según el eje x para preservar la monotonicidad. Ignorar los pasos 4 y 5 para aquellos $k\,$.
* Dejar $\alpha _{k}=m_{k}/\delta _{k}\quad {\text{ y }}\quad \beta _{k}=m_{k+1}/\delta _{k}$. Si $\alpha _{k}$ o $\beta _{k}$ es negativo, entonces los puntos de datos de entrada no son estrictamente monótonos y $(x_{k},\,y_{k})$ es un extremo local. En tales casos, aún se pueden generar curvas monótonas "por partes" eligiendo $m_{k}=0\,$ si $\alpha _{k}<0$ o $m_{k+1}=0\,$ si $\beta _{k}<0$, aunque la monotonicidad estricta no es posible globalmente.
* Para evitar sobrepaso y garantizar la monotonicidad, se debe cumplir al menos una de las tres condiciones siguientes:
       (a) La función $\phi _{k}=\alpha _{k}-{\frac {(2\alpha _{k}+\beta _{k}-3)^{2}}{3(\alpha _{k}+\beta _{k}-2)}}>0\,$, 'o
       (b) $\alpha _{k}+2\beta _{k}-3\leq 0\,$, 'o
       (c) $2\alpha _{k}+\beta _{k}-3\leq 0\,$.
       Solo la condición (a) es suficiente para garantizar una monotonicidad estricta: $\phi _{k}$ debe ser positivo.
       Una forma sencilla de satisfacer esta restricción es restringir el vector $(\alpha _{k},\,\beta _{k})$ a un círculo de radio 3. Es decir, si es $\alpha _{k}^{2}+\beta _{k}^{2}>9\,$, establecer $\tau _{k}={\frac {3}{\sqrt {\alpha _{k}^{2}+\beta _{k}^{2}}}}\,$, y cambiar la escala de las tangentes mediante $m_{k}=\tau _{k}\,\alpha _{k}\,\delta _{k}\quad {\text{ y }}\quad m_{k+1}=\tau _{k}\,\beta _{k}\,\delta _{k}\,$.
       Como alternativa, es suficiente restringir $\alpha _{k}\leq 3$ y $\beta _{k}\leq 3\,$. Para lograr esto, si es $\alpha _{k}>3{\text{ o }}\beta _{k}>3\,$, configurar $m_{k}=3\,\delta _{k}\,$.

### Interpolación cúbica

Después del preprocesamiento anterior, la evaluación del spline interpolado es equivalente a la del interpolador cúbico de Hermite, utilizando los datos $x_{k}$, $y_{k}$ y $m_{k}$ para $k=1,\,\dots \,n$.
Para evaluar en $x$, buscar el índice $k$ en la secuencia donde $x$ se encuentra entre $x_{k}$ y $x_{k+1}$, es decir: $x_{k}\leq x\leq x_{k+1}$. Calcular
    $\Delta =x_{k+1}-x_{k}\quad {\text{ y }}\quad t={\frac {x-x_{k}}{\Delta }}$
entonces, el valor interpolado es
    $f_{\text{ interpolada }}(x)=y_{k}\cdot h_{00}(t)+\Delta \cdot m_{k}\cdot h_{10}(t)+y_{k+1}\cdot h_{01}(t)+\Delta \cdot m_{k+1}\cdot h_{11}(t)$
donde $h_{ii}$ son las funciones básicas para el interpolador cúbico de Hermite.

## Código de ejemplo

El siguiente código en JavaScript toma un conjunto de datos y produce una función de interpolación monótona mediante un spline cúbico: