rumigaculum.com

  • Aumentar tamaño del tipo
  • Tamaño del tipo predeterminado
  • Disminuir tamaño del tipo
Inicio Computación y cálculo numérico Ajuste de una curva mediante una función polinómica definida a tramos

Ajuste de una curva mediante una función polinómica definida a tramos

E-mail Imprimir PDF

Introducción

El ajuste de una curva mediante una función analítica resulta muy útil en determinados contextos, pues sobre el ajuste es posible efectuar una serie de manipulaciones matemáticas para las que la curva original muchas veces no se presta (integración, cálculo de tendencias...). En los textos clásicos de cálculo numérico se describen una serie de técnicas de ajuste, generalmente sencillas, consistentes muchas veces en encontrar la función que, dentro de una familia conocida de funciones, ajusta de la mejor manera un conjunto de puntos (x, y) dado. La medida de la bondad de dicho ajuste puede definirse de varias maneras, siendo la minimización del error cuadrático medio (ECM) un criterio usado con mucha frecuencia. Elegir una función dentro de su familia no significa más que dar valor concreto a una serie de parámetros contenidos en la expresión matemática de dicha familia.

La anterior forma de ajuste está tan universamente extendida que muchos softwares generalistas la incorporan "de serie" en su vasto arsenal de algoritmos. Un ejemplo notable lo brinda la hoja de cálculo Excel, donde es posible ajustar cualquier curva mediante familias de funciones lineales, polinómicas, potenciales, exponenciales... El problema surge cuando la forma de la curva a ajustar es tan caprichosa que se resiste al ajuste mediante una única función de los tipos anteriores. En tal caso deberemos optar por encadenar varias de estas funciones sencillas, una detrás de otra, hasta cubrir la curva original. Las funciones de esta cadena pertenecen, de manera general, a la misma familia, y dado que las funciones polinómicas (entre las que se incluyen las lineales) son las más sencillas de manipular, el ajuste por tramos hace uso de polinomios casi de manera exclusiva.

Ajuste polinómico a tramos

Supongamos que pretendemos ajustar la curva de la siguiente figura:

 

curva_original

 

Aun no queriendo remedar las fluctuaciones de la parte izquierda, enseguida se advierte que no es posible un ajuste satisfactorio con una única función sencilla. Esta curva se presta, más bien, a un ajuste por tramos.

Si buceamos en nuestros libros de introducción al cálculo numérico es posible que lo único parecido que encontremos sea el uso de esplines cúbicos. En efecto: dispongamos varios puntos sobre la curva anterior, a modo de partición, y tracemos entre cada dos puntos adyacentes un polinomio de tercer grado. Supongamos que la partición consta de n puntos. Cada polinomio queda completamente definido al dar valor a sus cuatro coeficientes. Tenemos entonces 4(n-1) incógnitas que resolver. En cuanto a las ecuaciones que podemos definir son:

  • n: que son los puntos de la partición por los que debe pasar nuestra función polinómica a tramos.
  • n-2: al imponer la continuidad entre polinomios adyacentes.
  • n-2: al imponer la continuidad a la derivada primera entre polinomios adyacentes.
  • n-2: al imponer la continuidad a la derivada segunda entre polinomios adyacentes.

Hemos definido así  4n-6 ecuaciones. Aún nos faltan otras dos para igualar al número de incógnitas. La manera general de actuar es imponer un valor de derivada segunda igual a cero en los puntos extremos de la partición. Hecho lo anterior obtendríamos un ajuste como el que sigue:

 

esplines_cubicos

 

El resultado es del todo decepcionante. La función a tramos pasa por todos los puntos que hemos indicado. Vemos además que lo hace suavemente, sin cambios de pendiente en los puntos de la partición. Sin embargo, apenas observamos ajuste alguno de la curva original. Esto es debido a que el método de los esplines cúbicos es un método de interpolación, no de ajuste. En efecto, no podemos ajustar la curva original porque no hacemos uso de la información que la misma nos brinda. Apenas nos hemos limitado a tomar seis puntos aislados. Parece claro que obligar a la función de ajuste a pasar por dichos puntos es contraproducente. Mejor sería usar un algoritmo que, respetando los valores de abscisa (eje X) de la partición, eligiese los valores de ordenada (eje Y) de manera que se obtuviese un verdadero ajuste de la curva original. He aquí un ejemplo:

 

ecm_esplines_cubicos

 

He aquí un buen ajuste de la curva original. Los valores de abscisa (eje X) de los puntos de la partición son idénticos a los del caso anterior; sin embargo ahora los valores de ordenada (eje Y) han tenido la libertad de moverse arriba o abajo para, usando igualmente polinomios de tercer grado, llegar a un resultado óptimo. Podemos afirmar que, para los seis puntos de la partición dada, y respetando los valores de abscisa elegidos, el algoritmo usado consigue el ajuste de menor error cuadrático medio (ECM).

Matemática del ajuste

La matemática de un ajuste definido a tramos es algo más compleja que la de una interpolación por esplines cúbicos. En la página de descargas encontrará el lector interesado dos artículos en pdf:

  • Modelo matemático de ajuste ECM - Quebrada: se describe la metodología para un ajuste por tramos usando líneas rectas, formando así una línea quebrada o en zigzag.
  • Modelo matemático de ajuste ECM - Esplines Cúbicos: se describe la metodología para un ajuste por tramos usando polinomios de tercer grado (esplines cúbicos).

Los dos documentos anteriores comparten la misma esencia, si bien el segundo modelo es algo más laborioso que el primero.

Proyecto Fitter

Fitter es un desarrollo en C++ para el ajuste polinómico a tramos (ora mediante quebradas, ora mediante esplines cúbicos)  de una curva. Puede resolver dos problemas distintos:

  1. Dada una curva y una partición de tamaño dado, calcula los polinomios de ajuste óptimos, en el sentido del menor error cuadrático medio.
  2. Dada una curva y una partición inicial (semilla), aproxima la partición del mismo tamaño (esto es, con el mismo número de puntos) que genere el ajuste por tramos con el menor error cuadrático medio.

Para resolver el segundo problema hemos hecho uso del microentorno de desarrollo Optimizer. Una mirada al código fuente de Fitter nos permitirá comprobar que para integrar Optimizer en este nuevo proyecto no hemos necesitado tocar ni una sola linea de código del microentorno original, lo que prueba su notable modularidad y desacoplamiento.

En lo que respecta a la metodología empleada, se han seguido fielmente los modelos matemáticos expuestos más arriba.

En cuanto a la bondad de los ajustes, si bien la resolución del primer problema no plantea ninguna dificultad para Fitter, el éxito en la búsqueda de la partición óptima es sumamente dependiente de la calidad de la partición semilla inicial, y cuando se produce la convergencia, el tiempo de cálculo no es del todo óptimo. Esto nos induce a pensar que tal vez los métodos de optimización basados en el gradiente no sean los más adecuados para resolver este tipo de problemas. No obstante los resultados obtenidos con Fitter pueden considerarse, de manera general, bastante aceptables.

Share