Programa de Python: Interpolación Segmentaria o Splines. Primeramente se recuerda que la interpolación hace referencia a la obtención de nuevos puntos partiendo del conocimiento de un conjunto conocido de puntos. Los cuales son obtenidos por medio de muestreo o a partir de un experimento y se pretende construir una función que los ajuste. Así pues, para la construcción de polinomios de un alto grado plantea muchos problemas. Por un lado, la forma de la función polinómica de grado alto a menudo no responde al fenómeno debido al gran número de extremos e inflexiones. Por otro lado, su cálculo es muy complicado, lo que limita su utilidad en análisis numérico. Es a menudo más conveniente dividir el intervalo de interés en subintervalos más pequeños y usar en cada intervalo polinomios de grado relativamente bajo, tratando de que la función a trozos definida de este modo tenga un aspecto final adecuado al fenómeno que estamos representando. La idea central es que en vez de usar un solo polinomio para interpolar los datos, podemos usar segmentos de polinomios y unirlos adecuadamente para formar nuestra interpolación. Podemos decir, que una función Spline está formada por varios polinomios, cada uno definido en un intervalo y que se unen entre si bajo ciertas condiciones de continuidad. Entonces, para Splines de grado k, dada nuestra tabla de datos: 𝒙
𝒙𝟎
𝒙𝟏
…
𝒙𝒏
𝒚
𝑦0
𝑦1
…
𝑦𝑛
Donde suponemos que x0
𝑆(𝑥𝑖 ) = 𝑦𝑖 , para toda i=0,1,…,n.
𝑆(𝑥) es un polinomio de grado ≤k en cada subintervalo [𝑥𝑖−1 , 𝑥𝑖 ]
𝑆(𝑥) tiene derivada continua hasta de orden k-1 en [𝑥0 , 𝑥𝑛 ]
Funciones Splines de grado 1. Dados los n+1 puntos 𝒙
𝒙𝟎
𝒙𝟏
…
𝒙𝒏
𝒚
𝑦0
𝑦1
…
𝑦𝑛
Una función spline de grado 1 que interpole los datos es simplemente unir cada uno de los puntos mediante segmentos de recta, como sigue:
Claramente esta función cumple con las condiciones de la spline de grado 1. Así, tenemos que para este caso:
𝑆(𝑥) =
𝑆1 (𝑥) 𝑆2 (𝑥) {𝑆𝑛 (𝑥)
𝑠𝑖 𝑥 ∈ [𝑥0 , 𝑥1 ] 𝑠𝑖 𝑥 ∈ [𝑥1 , 𝑥2 ] … 𝑠𝑖 𝑥 ∈ [𝑥𝑛 , 𝑥𝑛 ]
Donde:
𝑆𝑗 (𝑥) es un polinomio de grado menor o igual que 1
S(𝑥) tiene derivada continua de orden k-1=0
S(𝑥𝑗 ) = 𝑦𝑗 , para toda j = 0,1, … , 𝑛.
Por lo tanto, la spline de grado 1 queda definida como: 𝑦0 + 𝑓[𝑥1 , 𝑥0 ](𝑥 − 𝑥0 ) 𝑠𝑖 𝑥 ∈ [𝑥0 , 𝑥1 ] 𝑦1 + 𝑓[𝑥2 , 𝑥1 ](𝑥 − 𝑥1 ) 𝑠𝑖 𝑥 ∈ [𝑥1 , 𝑥2 ] 𝑆(𝑥) = … 𝑠𝑖 𝑥 ∈ [𝑥𝑛−1 , 𝑥𝑛 ] {𝑦𝑛−1 + 𝑓[𝑥𝑛 , 𝑥𝑛−1 ](𝑥 − 𝑥𝑛−1 ) Donde 𝑓[𝑥𝑖 , 𝑥𝑗 ] es la diferencia dividida de Newton o puede ser igualmente la pendiente m.
Funciones Splines de grado 2 o cuadrática. Para asegurar que las m-esimas derivadas sean continuas en los nodos, se debe usar un polinomio de al menos (m+1)-enesimo orden. Así pues, el objetivo de los polinomios cuadráticos es el de obtener un polinomio de segundo orden para cada uno de los intervalos entre los puntos. El polinomio para cada uno de estos intervalos se representa generalmente como: 𝑓𝑖 (𝑥) = 𝑎𝑖 𝑥 2 + 𝑏𝑖 𝑥 + 𝑐𝑖 Para los n+1 puntos, existen n intervalos, y por lo tanto, 3n incógnitas constantes por evaluar. Por lo tanto se requieren 3n ecuaciones o condiciones para evaluar las incógnitas. Estas son: 1.- Los valores de las funciones deben ser iguales en los nodos interiores. Esta condición se representa mediante (con 2n-2 condiciones): 2 𝑎𝑖−1 𝑥𝑖−1 + 𝑏𝑖−1 𝑥𝑖−1 + 𝑐𝑖−1 = 𝑓(𝑥𝑖−1 )
(1)
2 𝑎𝑖 𝑥𝑖−1 + 𝑏𝑖 𝑥𝑖−1 + 𝑐𝑖 = 𝑓(𝑥𝑖−1 )
(2)
con i=2 hasta n
2.- La primera y la última función deben pasar a través de los puntos finales. Esto agrega dos ecuaciones adicionales (con 2 condiciones): 𝑎𝑖 𝑥02 + 𝑏𝑖 𝑥0 + 𝑐𝑖 = 𝑓(𝑥0 )
(3)
𝑎𝑛 𝑥𝑛2 + 𝑏𝑛 𝑥𝑛 + 𝑐𝑛 = 𝑓(𝑥𝑛 )
(4)
3.- Las primeras derivadas en los nodos interiores deben ser iguales. La primera derivada de la ecuación es (con n-1 condiciones): 𝑓𝑖 (𝑥) = 𝑎𝑖 𝑥 2 + 𝑏𝑖 𝑥 + 𝑐𝑖 → 𝑓 , (𝑥) = 2𝑎𝑥 + 𝑏 Por lo tanto
2𝑎𝑖−1 𝑥𝑖−1 + 𝑏𝑖−1 = 2𝑎𝑖 𝑥𝑖−1 + 𝑏𝑖
(5)
con i=2 hasta n
4.-Se supone que la segunda derivada es cero en el primer punto. Ya que la segunda derivada de la ecuación es 2ª, esta condición se expresa matemáticamente como (con 1 condición): 𝑎1 = 0
(6)
La interpretación visual de esta última condición es que los primeros dos puntos se conectan mediante una línea recta. Interpolación segmentaria de grado 3 o cubica. El objetivo de la interpolación segmentaria cubica es obtener polinomios de tercer orden para cada uno de los intervalos entre nodos, de la forma: 𝑓𝑖 (𝑥) = 𝑎𝑖 𝑥 3 + 𝑏𝑖 𝑥 2 + 𝑐𝑖 𝑥 + 𝑑𝑖 Por lo tanto, para los n+1 puntos, existen n intervalos y 4n incógnitas constantes por evaluar. Como se hizo para los polinomios cuadráticos, ahora se requieren de 4n condiciones para evaluar las incógnitas. Estas son: 1.- Los valores de las funciones deben ser iguales en los nodos interiores. Esta condición se representa mediante (con 2n-2 condiciones): 3 2 𝑎𝑖−1 𝑥𝑖−1 + 𝑏𝑖−1 𝑥𝑖−1 + 𝑐𝑖−1 𝑥𝑖−1 + 𝑑𝑖−1 = 𝑓(𝑥𝑖−1 )
(1)
3 2 𝑎𝑖 𝑥𝑖−1 + 𝑏𝑖 𝑥𝑖−1 + 𝑐𝑖 𝑥𝑖−1 + 𝑑𝑖 = 𝑓(𝑥𝑖−1 )
(2)
con i=2 hasta n
2.- La primera y la última función deben pasar a través de los puntos finales. Esto agrega dos ecuaciones adicionales (con 2 condiciones): 𝑎1 𝑥03 + 𝑏1 𝑥02 + 𝑐1 𝑥0 + 𝑑1 = 𝑓(𝑥0 )
(3)
𝑎𝑛 𝑥𝑛3 + 𝑏𝑛 𝑥𝑛2 + 𝑐𝑛 𝑥𝑛 + 𝑑𝑛 = 𝑓(𝑥𝑛 )
(4)
3.- Las primeras derivadas en los nodos interiores deben ser iguales (con n-1 condiciones). La primera derivada de la ecuación es:
𝑓𝑖 (𝑥) = 𝑎𝑖 𝑥 3 + 𝑏𝑖 𝑥 2 + 𝑐𝑖 𝑥 + 𝑑𝑖 → 𝑓 , (𝑥) = 3𝑎𝑥 2 + 𝑏𝑥 + 𝑐 2 2 Por lo tanto 3𝑎𝑖−1 𝑥𝑖−1 + 2𝑏𝑖−1 𝑥𝑖−1 + 𝑐𝑖−1 = 3𝑎𝑖 𝑥𝑖−1 + 2𝑏𝑖 𝑥𝑖−1 + 𝑐𝑖 (5) con i=2 hasta n
4.- Las segundas derivadas en los nodos interiores deben ser iguales (con n-1 condiciones). La segunda derivada de la ecuación es: 𝑓𝑖 (𝑥) = 𝑎𝑖 𝑥 3 + 𝑏𝑖 𝑥 2 + 𝑐𝑖 𝑥 + 𝑑𝑖 → 𝑓 , (𝑥) = 6𝑎𝑥 + 2𝑏 Por lo tanto 6𝑎𝑖−1 𝑥𝑖−1 + 2𝑏𝑖−1 = 6𝑎𝑖 𝑥𝑖−1 + 2𝑏𝑖
(6)
con i=2 hasta n
5.- Las segundas derivadas en los nodos finales son cero (2 condiciones). 6𝑎1 𝑥0 + 2𝑏0 = 0 6𝑎𝑛 𝑥𝑛 + 2𝑏𝑛 = 0 Con el proceso de la segmentaria cuadrática o cubica se sigue el mismo proceso en la parte final, la cual consiste en ir agregando los coeficientes obtenidos de las correspondientes 𝑎𝑖 , 𝑏𝑖 , 𝑐𝑖 𝑜 𝑑𝑖 en su respectiva columna. 𝑎1
𝑏1
𝑐1
𝑎2
𝑏2
𝑐2
… 𝑎𝑛
𝑏𝑛
𝑎1
𝑏1
𝑐1
𝑑1
𝑎2
𝑏2
𝑐2
… 𝑎𝑛
𝑑2
𝑐𝑛
Para la cuadrática 𝑏𝑛
𝑐𝑛
𝑑𝑛
Para la cubica
En el caso de la matriz para la cuadrática se puede omitir la ecuación y columna de a1 y obtener así una matriz de grado n-1. Posteriormente se pasa a resolver la matriz, de lo cual se obtienen los coeficientes para las ecuaciones segmentarias.
𝑆(𝑥) =
𝑆1 (𝑥) 𝑆2 (𝑥) {𝑆𝑛 (𝑥)
𝑠𝑖 𝑥 ∈ [𝑥0 , 𝑥1 ] 𝑠𝑖 𝑥 ∈ [𝑥1 , 𝑥2 ] … 𝑠𝑖 𝑥 ∈ [𝑥𝑛 , 𝑥𝑛 ]
Donde 𝑆𝑛 (𝑥) = 𝑓𝑖 (𝑥) = 𝑎𝑖 𝑥 3 + 𝑏𝑖 𝑥 2 + 𝑐𝑖 𝑥 + 𝑑𝑖 𝑜 𝑓𝑖 (𝑥) = 𝑎𝑖 𝑥 2 + 𝑏𝑖 𝑥 + 𝑐𝑖 A continuación se presenta el código desarrollado en Python para la resolución de este método, las explicaciones de cada sección se expresan en la imagen y corresponden a la letra de color rojo y que contiene un # al inicio.
Código de Segmentaria Lineal.
Código de Segmentaria Cuadrática.
Código de Segmentaria Cubica.
Menú del Programa General (Contiene las funciones anteriores).
x
f(x)
Ejercicio 1.
3.0
2.5
Utilizando los 3 puntos indicados en la tabla, establecer el sistema de ecuaciones que resulta de la interpolación segmentaria cubica. Resolver y comparar con la interpolación segmentaria cuadrática para x=5.
4.5
1.0
7.0
2.5
Observaciones. Como se puede notar por los resultados obtenidos mostrados en el cuadro rojo al evaluar el x=5 y con más ayuda aun debido a la gráfica, se puede observar que el resultado en los tres distintos tipos de segmentación es muy variado, esto debido a que la lineal hace movimiento muy bruscos de una línea a otra. En la cuadrática como se muestra, primero es lineal y esta peculiaridad le da el problema de que su continuación serpentea mucho lo que hace que los datos no sean muy apegados a lo que realmente pueden ser, lo que quiere decir a mi gusto que da una mala interpolación. Por el contrario como se nota la cubica cumple con una continuidad en sus pendientes ósea que lleva una curvatura suave, lo que a mi parecer ayuda a que sus interpolaciones sean más correctas. Además gracias a la gráfica se puede notar que los tres métodos en el primer subintervalo contienen cierta cercanía pero en un segundo subintervalo es cuando se comienza a ver claramente sus diferencias.
x
f(x)
0.55
300
0.62
250
0.8
150
Ejercicio 2. Utilizando los 3 puntos indicados en la tabla, establecer el sistema de ecuaciones que resulta de la interpolación segmentaria cubica. Resolver para x=0.7 y comparar con interpolación segmentaria cuadrática.
Observaciones. Al observar el recuadro rojo de la página anterior donde se obtienen los resultados obtenidos de la evaluación de x=0.7 en la interpolación segmentaria se puede notar que en este caso existe menos diferencias entre los valores interpolados por cada método, del cual como conocemos que valor es el real obtenido en el fenómeno corresponde a 200 podemos notar que la interpolación más cercada a la realidad es la cuadrada con una diferencia de 1.5 y le ha ganado a la cubica que tiene una diferencia de 1.6, pero, si vemos el grafico podemos notar que en realidad los tres método en este caso llevar una forma muy similar, de lo que yo puedo interpretar que también es un punto a tener en cuenta el cómo se comportan los datos, puesto que son muy zigzagueantes el ganador claro seria el método cubico, pero ya que estos datos seguían una forma descendiente muy apegada a una ecuación cuadrática o cubica simple, pues no habría mucho problema entre cada método.
Ejercicio 3. X
-1
1
2
4
y
-1
1
5
-2
Observaciones. Debido a que los dos ejercicios anteriores me parecieron que mostraban muy poco el comportamiento del Spline con respecto a cuándo se presentan muchos puntos me di a la tarea de realizar otra evaluación pero ahora en este caso con cuatro puntos conocidos. En este ejercicio no hare caso de las evaluaciones del cuadro rojo y me centrare en la gráfica, de la cual se puede observar como la cuadrática y la lineal se comporta de la misma forma en el primer subintervalo, y es a partir del segundo y en especial en el tercero donde se presenta la mayor diferencia. Como se puede notar la segmentaria cubica es la que lleva las de ganar puesto que no tiene grandes incrementos en los nodos a diferencia de la cuadrática, y es aquí donde me queda en claro que para acercamientos reales al interpolar confiaría más en la cubica, de ahí la lineal y por último la cuadrática. La lineal me parece interesante porque puede llegar a ser la más precisa y sencilla de calcular siempre y cuando se conozcan múltiples puntos del fenómeno.
Conclusión. De manera general puedo concluir que las interpolaciones segmentarias son sin duda alguna la mejor formar de obtener datos, puesto que a diferencia del método de LaGrange o de Newton mientras más puntos conocidos para la interpolación terminan afectándose las curvaturas, por lo tanto el subdividir todo el intervalo en subintervalos ayuda a realizar aproximaciones más reales. Ahora en cuanto a los tres métodos, como dije en las observaciones de cada método segmentario los cuales son lineal, cuadrática y cubica, la que me pareció que era menos precisa fue la cuadrática pues el movimiento de sus curvas era muy exagerado, después seguía la lineal la cual me parece muy correcta para casos donde se conozcan muchos puntos pues te da un acercamiento a los datos reales bastante aceptable y además es fácil de calcular las ecuaciones del intervalo, por último y como el método más exacto hasta ahora me parece es el cubico puesto que sus curvaturas conllevan unas pendientes mas uniformes y no exageradas, para mi gusto es el método a usar por excelencia.