Cálculo Numérico – Programación Aplicada INTERPOLACIÓN SEGMENTARIA O SPLINES La construcción de polinomios de interpolación de grado alto aunque justificable teóricamente 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 subintervalo 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. Cabe mencionar que entre todas, las splines cúbicas han resultado ser las más adecuadas. Definición. (Splines de grado k) Dada nuestra tabla de datos, donde suponemos que x0 < x1 < L < x n , y dado k un número entero positivo, una función de interpolación spline de grado k, para la tabla de datos, es una función S (x ) tal que : i) S ( xi ) = y i , para toda i = 0, 1, ..., n . ii) S (x ) es un polinomio de grado ≤ k en cada subintervalo [xi −1 , xi ] . iii) S (x ) tiene derivada continua hasta de orden k − 1 en [x0 , x n ] . FUNCIONES SPLINES DE GRADO 1 Dados los n + 1 puntos 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: 1 Ing. Adriana M. Apaza – JTP Cálculo Numérico Cálculo Numérico – Programación Aplicada Claramente esta función cumple con las condiciones de la spline de grado 1. Así, tenemos que para este caso: s1 ( x ) si s ( x ) s s( x) = 2 M sn ( x ) si x ∈ [x0 , x1 ] x ∈ [x1 , x2 ] x ∈ [xn −1 , xn ] donde: i) S j (x) es un polinomio de grado menor o igual que 1 ii) S (x ) tiene derivada continua de orden k-1=0. iii) S ( x j ) = y j , para j = 0,1,K , n . Por lo tanto, la spline de grado 1 queda definida como: si y0 + f [x1 , x0 ]( x − x0 ) y + f [x , x ]( x − x ) si 1 2 1 1 s( x ) = M yn −1 + f [xn , xn −1 ]( x − xn −1 ) si x ∈ [x0 , x1 ] x ∈ [x1 , x2 ] x ∈ [xn −1 , xn ] donde f [ xi , x j ] es la diferencia dividida de Newton. FUNCIONES SPLINES DE GRADO 2 Veamos un ejemplo concreto, consideremos los siguientes datos: procedamos a calcular la interpolación por splines de grado 2. Primero que nada, vemos que se forman tres intervalos: [3, 4.5], [4.5, 7], [7, 9] En cada uno de estos intervalos, debemos definir una función polinomial de grado 2, como sigue: a1 x 2 + b1 x + c1 s( x ) = a2 x 2 + b2 x + c2 a x2 + b x + c 3 3 3 si si si x ∈ [3,4.5] x ∈ [4.5,7 ] x ∈ [7,9] Hacemos que la spline pase por los puntos de la tabla de datos, es decir, se debe cumplir que: 2 Ing. Adriana M. Apaza – JTP Cálculo Numérico Cálculo Numérico – Programación Aplicada s(3) = 2.5, s (4.5) =1, s(7) = 2.5, s(9) = 0.5 Así, se forman las siguientes ecuaciones: s(3) = 2.5 ⇒ 9a1 + 3b1 + c1 = 2.5 ( 4.5) 2 a1 + 4.5b1 + c1 = 1 s ( 4.5) = 1 ⇒ 2 ( 4.5) a2 + 4.5b2 + c2 = 1 49 a2 + 7b2 + c2 = 2.5 s ( 7 ) = 2.5 ⇒ 49a3 + 7b3 + c3 = 2.5 s (9) = 0.5 ⇒ 81a3 + 9b3 + c3 = 0.5 Hasta aquí, tenemos un total de 6 ecuaciones con 9 incógnitas. El siguiente paso es manejar la existencia de las derivadas continuas. En el caso de las splines de grado 2, necesitamos que la spline tenga derivada continua de orden k-1=1, es decir, primera derivada continua. Calculamos primero la primera derivada: 2a1 x + b1 s′( x ) = 2a2 x + b2 2a x + b 3 3 si si si x ∈ [3,4.5] x ∈ [4.5,7] x ∈ [7,9] Vemos que esta derivada está formada por segmentos de rectas, que pudieran presentar discontinuidad en los cambios de intervalo. Es decir, las posibles discontinuidades son x = 4.5 y x = 7 . Por lo tanto para que s ′(x) sea continua, se debe cumplir que: 2a1 (4.5) + b1 = 2a 2 (4.5) + b2 ⇒ 9a1 + b1 = 9a 2 + b2 También debe cumplirse que: 2a 2 (7) + b2 = 2a 3 (7) + b3 ⇒ 14a 2 + b2 = 14a 3 + b3 Así, tenemos un total de 8 ecuaciones vs. 9 incógnitas; esto nos da un grado de libertad para elegir alguna de las incógnitas. Elegimos por simple conveniencia a1 = 0 . De esta forma, tenemos un total de 8 ecuaciones con 8 incógnitas. Estas son las siguientes: 3b1 + c1 = 2.5 49a3 + 7b3 + c3 = 2.5 4.5b1 + c1 = 1 81a 3 + 9b3 + c3 = 0.5 20.25a 2 + 4.5b2 + c 2 = 1 b1 = 9a 2 + b2 49a 2 + 7b2 + c 2 = 2.5 14a 2 + b2 = 14a 3 + b3 Este sistema de ecuaciones tiene la siguiente forma matricial: 3 Ing. Adriana M. Apaza – JTP Cálculo Numérico Cálculo Numérico – Programación Aplicada 3 4 .5 0 0 0 0 1 0 1 0 0 0 0 0 1 0 0 0 0 0 0 20.25 4.5 1 0 0 0 49 7 1 0 0 0 0 0 0 49 7 0 0 0 0 81 9 0 −9 −1 0 0 0 0 14 1 0 − 14 − 1 0 b1 2.5 0 c1 1 0 a2 1 0 b2 2.5 = 1 c2 2.5 1 a3 0.5 0 b3 0 0 c3 0 Se obtiene la siguiente solución: b1 = −1 c1 = 5.5 a 2 = 0.64 a 3 = −1.6 b2 = −6.76 b3 = 24.6 c 2 = 18.46 c3 = −91.3 Sustituyendo estos valores (junto con a1 = 0 ), obtenemos la función spline cuadrática que interpola la tabla de datos dada: − x + 5.5 si x ∈ [3,4.5] 2 s( x ) = 0.64 x − 6.76 x + 18.46 si x ∈ [4.5,7] − 1.6 x 2 + 24.6 x − 91.3 si x ∈ [7,9] La gráfica que se muestra a continuación, contiene tanto los puntos iniciales de la tabla de datos, así como la spline cuadrática. 5 4 3 2 1 3 4.5 7 9 -1 El siguiente caso, que es el más importante en las aplicaciones, sigue exactamente los mismos pasos del ejemplo que acabamos de resolver, solamente que en vez de trabajar con polinomios cuadráticos, lo hace con polinomios cúbicos. FUNCIONES SPLINES CUBICAS Dados n + 1 datos: 4 Ing. Adriana M. Apaza – JTP Cálculo Numérico Cálculo Numérico – Programación Aplicada Una spline cúbica que interpola estos datos, es una función S (x ) definida como sigue: s0 ( x ) si s ( x ) si s(x ) = 1 M sn −1 ( x ) si donde cada x ∈ [x0 , x1 ] x ∈ [x1 , x2 ] x ∈ [xn −1 , xn ] si ( x) es un polinomio cúbico; si ( xi ) = y i , para toda i = 0,1,..., n y tal que s (x) tiene primera y segunda derivadas continuas en [x 0 , x n ] . Ejemplo 1. Interpolar los siguientes datos mediante una spline cúbica: Solución. Definimos un polinomio cúbico en cada uno de los intervalos que se forman: a1 x 3 + b1 x 2 + c1 x + d1 s (x ) = 3 2 a2 x + b2 x + c2 x + d 2 si si x ∈ [2,3] x ∈ [3,5] A continuación, hacemos que se cumpla la condición de que la spline debe pasar por los puntos dados en la tabla. Así, tenemos que: s(2) = −1 ⇒ 8a1 + 4b1 + 2c1 + d1 = −1 s(3) = 2 ⇒ 27a1 + 9b1 + 3c1 + d1 = 2 s(5) = −7 ⇒ 125a2 + 25b2 + 5c2 + d 2 = −7 Ahora calculamos la primera derivada de s (x) : 3a x 2 + 2b1 x + c1 s ′( x ) = 1 2 3a 2 x + 2b2 x + c 2 si si x ∈ [2,3] x ∈ [3,5] Al igual que en el caso de las splines cuadráticas, se presentan ecuaciones que pueden presentar discontinuidad en los cambios de intervalo; las posibles discontinuidades son los puntos donde se cambia de intervalo, en este caso x = 3 . Para evitar esta discontinuidad, evaluamos x = 3 en los dos polinomios e igualamos: 3a1 (3) 2 + 2b1 (3) + c1 = 3a 2 (3) 2 + 2b2 (3) + c 2 ⇒ 27a1 + 6b1 + c1 = 27a 2 + 6b2 + c 2 Análogamente procedemos con la segunda derivada: 6 a x + 2b1 s ′′( x ) = 1 6 a 2 x + 2b2 si si x ∈ [2,3] x ∈ [3,5] Para lograr que s ′′(x) sea continua: 6a1 (3) + 2b1 = 6a 2 (3) + 2b2 ⇒ 18a1 + 2b1 = 18a 2 + 2b2 5 Ing. Adriana M. Apaza – JTP Cálculo Numérico Cálculo Numérico – Programación Aplicada En este punto contamos con 6 ecuaciones y 8 incógnitas, por lo tanto tenemos 2 grados de libertad; en general, se agregan las siguientes 2 condiciones: s ′′( x 0 ) = 0 s ′′( x n ) = 0 De lo cual vamos a obtener: s′′(2) = 0 ⇒ 6a1 (2) + 2b1 = 0 ∴12a1 + 2b1 = 0 s′′(5) = 0 ⇒ 6a2 (5) + 2b2 = 0 ∴ 30a2 + 2b2 = 0 Con lo cual, hemos completado un juego de 8 ecuaciones vs. 8 incógnitas, el cual es el siguiente: 8a1 + 4b1 + 2c1 + d 1 = −1 27 a1 + 9b1 + 3c1 + d 1 = 2 27 a 2 + 9b2 + 3c 2 + d 2 = 2 125a 2 + 25b2 + 5c 2 + d 2 = −7 27 a1 + 6b1 + c1 = 27 a 2 + 6b2 + c 2 18a1 + 2b1 = 18a 2 + 2b2 12a1 + 2b1 = 0 30a 2 + 2b2 = 0 Cuya forma matricial es la siguiente: 8 27 0 0 27 18 12 0 4 2 1 0 0 0 9 3 1 0 0 0 0 0 0 27 9 3 0 0 0 125 25 5 6 1 0 − 27 −6 −1 2 2 0 0 0 0 − 18 0 −2 0 0 0 0 0 0 30 2 0 0 a1 − 1 0 b1 2 1 c1 2 1 d1 − 7 = 0 a2 0 0 b2 0 0 c2 0 0 d 2 0 Obtenemos la siguiente solución: a1 = −1.25 a 2 = 0.625 b1 = 7.5 b2 = −9.375 c1 = −10.75 c 2 = 39.875 d 1 = 0 .5 d 2 = −50.125 Sustituyendo estos valores en nuestra función inicial, vemos que la spline cúbica para la tabla de datos dada, queda definida como sigue: − 1.25 x 3 + 7.5 x 2 − 10.75 x + 0.5 s (x ) = 3 2 0.625 x − 9.375 x + 39.875 x − 50.125 si si x ∈ [2,3] x ∈ [3,5] Mostramos la gráfica correspondiente a este ejercicio, 6 Ing. Adriana M. Apaza – JTP Cálculo Numérico Cálculo Numérico – Programación Aplicada Prácticamente ni se nota que se trata de dos polinomios diferentes. Esto es debido a las condiciones que se impusieron sobre las derivadas de la función. Esta finura casi artística, es la que permite aplicar las splines cúbicas, para cuestiones como el diseño de letras por computadoras, o bien a problemas de aplicación donde la interpolación que se necesita es de un carácter bastante delicado, como podría tratarse de datos médicos sobre algún tipo de enfermedad. Ejemplo 2. Interpolar los siguientes datos utilizando splines cúbicas: Solución. Nuevamente, definimos un polinomio cúbico en cada uno de los intervalos: a1 x 3 + b1 x 2 + c1 x + d1 s ( x ) = a2 x 3 + b2 x 2 + c2 x + d 2 a x3 + b x 2 + c + d 3 3 3 3 x ∈ [− 1,1] x ∈ [1,2] x ∈ [2,4] si si si Después, hacemos que la spline pase por los puntos dados en la tabla. Así, tenemos que: s ( −1) = −1 implica que, − a1 + b1 − c1 + d1 = −1 s (1) = 1 implica que, a1 + b1 + c1 + d1 = 1 a 2 + b2 + c 2 + d 2 = 1 s ( 2) = 5 implica que, 8a 2 + 4b2 + 2c2 + d1 = 5 8a3 + 4b3 + 2c3 + d 2 = 5 Y finalmente s ( 4) = −2 implica que, 64a 3 + 16b3 + 4c3 + d 2 = −2 Enseguida, calculamos la primera derivada: 7 Ing. Adriana M. Apaza – JTP Cálculo Numérico Cálculo Numérico – Programación Aplicada 3a1 x 2 + 2b1 x + c1 s′( x ) = 3a2 x 2 + 2b2 x + c2 3a x 2 + 2b x + c 3 3 3 si1 si si x ∈ [− 1,1] x ∈ [1,2] x ∈ [2,4] Vemos entonces, que las posibles discontinuidades de s′(x ) son x = 1 y x = 2 . Por lo tanto, para hacer que s′(x ) sea continua, igualamos las ecuaciones correspondientes en ambos valores: 3a1 + 2b1 + c1 = 3a2 + 2b2 + c2 12 a2 + 4b2 + c2 = 12 a3 + 4b3 + c3 Ahora procedemos a calcular la segunda derivada: 6a1 x + 2b1 s′′( x) = 6a2 x + 2b2 6a x + 2b 3 3 si si si x ∈ [− 1,1] x ∈ [1,2] x ∈ [2,4] Nuevamente, las posibles discontinuidades son x = 1 y x = 2 . Por lo tanto, para que s′′(x) sea continua, se igualan las ecuaciones en ambos valores: 6a1 + 2b1 = 6a2 + 2b2 → 3a1 + b1 = 3a2 + b2 12 a2 + 2b2 = 12 a3 + 2b3 → 6 a2 + b2 = 6 a3 + b3 Finalmente, se agregan las condiciones de que la doble derivada se anule en los puntos inicial y final de la tabla. En este caso, s′′(−1) = 0 → −6a1 + 2b1 = 0 → −3a1 + b1 = 0 s′′( 4) = 0 → 24 a3 + 2b3 = 0 → 12 a3 + b3 = 0 Con esto tenemos un juego de doce ecuaciones con doce incógnitas: − a1 + b1 − c1 + d1 = −1 a1 + b1 + c1 + d1 = 1 a2 + b2 + c2 + d 2 = 1 8a2 + 4b2 + 2c2 + d 2 = 5 8a3 + 4b3 + 2c3 + d 3 = 5 64 a3 + 16b3 + 4c3 + d 3 = −2 3a1 + 2b1 + c1 = 3a2 + 2b2 + c2 12 a2 + 4b2 + c2 = 12 a3 + 4b3 + c3 3a1 + b1 = 3a2 + b2 6 a2 + b2 = 6 a3 + b3 − 3a1 + b1 = 0 12 a3 + b3 = 0 8 Ing. Adriana M. Apaza – JTP Cálculo Numérico Cálculo Numérico – Programación Aplicada Este sistema tiene la siguiente forma matricial: −1 1 0 0 0 0 3 0 3 0 − 3 0 1 −1 1 1 0 0 0 0 0 0 1 1 0 0 0 0 2 0 1 0 1 0 0 0 0 0 0 − 3 − 2 −1 0 12 4 1 0 − 3 −1 0 0 6 1 0 0 0 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0 1 8 0 0 0 1 4 0 0 0 1 2 0 0 0 1 1 0 0 0 0 0 0 0 0 0 a1 − 1 0 b1 1 0 c1 1 0 d1 5 1 a2 5 64 16 4 1 b2 − 2 = 0 0 0 0 c2 0 − 12 − 4 − 1 0 d 2 0 0 0 0 0 a3 0 − 6 − 1 0 0 b3 0 0 0 0 0 c3 0 12 1 0 0 d3 0 0 0 0 0 8 0 0 0 0 4 0 0 0 0 2 Obtenemos la solución: a1 = 51 140 a2 = − b1 = 153 140 21 297 b2 = 10 35 c1 = 89 140 c2 = − d1 = − 153 40 a3 = 24 288 b3 = − 35 35 c3 = 1867 732 d3 = − 70 35 473 48 d2 = 70 35 Por lo tanto, la spline cúbica es: 51 3 153 2 89 140 x + 140 x + 140 x − 153 si x ∈ [− 1,1] 40 21 3 297 2 473 48 s( x) = − 10 x + 35 x − 70 x + 35 si x ∈ [1,2] 3 2 24 x − 288 x + 1867 x − 732 si x ∈ [2,4] 35 70 35 35 Finalmente, mostramos la gráfica correspondiente 8 6 4 2 -1 1 2 4 -2 En forma general 9 Ing. Adriana M. Apaza – JTP Cálculo Numérico Cálculo Numérico – Programación Aplicada Dada una función f definida en [a, b] y un conjunto de números, llamados los nodos a = x0 < x1 < ... < x n = b , un interpolante cúbico de trazador, S, para f es una función que satisface las siguientes condiciones: [ ] a) S es un polinomio cúbico, denotado Sj, en el subintervalo x j , x j +1 para cada j = 0, 1,..., n − 1 ; b) S ( x j ) = f ( x j ) para cada j = 0, 1,..., n ; c) S j +1 ( x j +1 ) = S j ( x j +1 ) para cada j = 0, 1,..., n − 2 ; d) S ′j +1 ( x j +1 ) = S ′j ( x j +1 ) para cada j = 0, 1,..., n − 2 ; e) S ′j′+1 ( x j +1 ) = S ′j′ ( x j +1 ) para cada j = 0, 1,..., n − 2 ; f) se satisface una del siguiente conjunto de condiciones de frontera: S ′′( x0 ) = S ′′( x n ) = 0 (frontera libre) S ′( x0 ) = f ′( x0 ) y S ′( x n ) = f ′( x n ) (frontera sujeta) La ecuación b) indica que el spline cúbico se ajusta a cada uno de los puntos, que es continua c), y que es continua en pendiente y curvatura d) y e), a lo largo de toda la región generada por los puntos. Para construir el interpolante cúbico de trazador para una función f dada, se pueden aplicar las condiciones de la definición a los polinomios cúbicos. S j ( x) = a j + b j ( x − x j ) + c j ( x − x j ) 2 + d j ( x − x j ) 3 para cada j = 0, 1,..., n − 1 . Para x = x j : S j ( x j ) = a j = f ( x j ) y si se aplica la condición (c), a j +1 = S j +1 ( x j +1 ) = S j ( x j +1 ) = a j + b j ( x j +1 − x j ) + c j ( x j +1 − x j ) 2 + d j ( x j +1 − x j ) 3 para cada j = 0, 1,..., n − 2 . introducimos la notación h j = x j +1 − x j para cada j = 0, 1,..., n − 1 . Si, además definimos a n = f ( x n ) , se puede ver que esto implica que la ecuación a j +1 = a j + b j h j + c j h j + d j h j 2 3 De una manera similar, definimos para cada j = 0, 1,..., n − 1 . bn = S ′( x n ) y observamos S ′j ( x) = b j + 2c j ( x − x j ) + 3d j ( x − x j ) 2 para x = x j : S ′j ( x j ) = b j para cada j = 0, 1,..., n − 1 . Aplicando la condición (d), b j +1 = S ′j +1 ( x j +1 ) = S ′j ( x j +1 ) = b j + 2c j h j + 3d j h j para cada j = 0, 1,..., n − 1 . 2 Otra relación entre los coeficientes se puede obtener S ′j′( x ) = 2c j + 6d j ( x − x j ) 10 Ing. Adriana M. Apaza – JTP Cálculo Numérico Cálculo Numérico – Programación Aplicada S ′j′ ( x j ) = 2c j para x = x j : para cada j = 0, 1,..., n − 1 . Aplicando la condición (e) y definiendo cn = S ′′( x n ) 2 : c j +1 = S ′j′+1 ( x j +1 ) = S ′j′′( x j +1 ) = c j + 3d j h j para cada j = 0, 1,..., n − 1 . Despejando d j de la ecuación anterior y sustituyendo este valor dj = c j +1 − c j (1) 3h j a j +1 = a j + b j h j + c j h j + 2 hj a j +1 . = a j + b j h j + (c j +1 − c j ) 3 hj = a j + bjhj + 2 hj 2 3 (2c j + c j +1 ) 2 3 (2c j + c j +1 ) (2) b j +1 = b j + 2c j h j + 3d j h j = b j + 2c j h j + (c j +1 − c j ) h j = b j + (c j + c j +1 )h j 2 b j +1 = b j + (c j + c j +1 )h j (3) para cada j = 0, 1,..., n − 1 . y luego con una reducción del índice, para b j −1 , b j = b j −1 + ( c j + c j −1 ) h j −1 (4) De (2) despejo b j , bj. = (a j +1 . - a j ) hj − hj 3 ( 2c j + c j +1 ) (5) con una reducción del índice b j−1. = (a j . - a j−1) h j−1 − (c j + 2c j−1) (6) h j−1 3 Reemplazando (5) y (6) en (4), tenemos b j = b j −1 + (c j + c j −1 )h j −1 (a j +1 − a j ) hj − hj 3 (4) (2c j + c j +1 ) = (a j − a j −1 ) h j −1 − h j −1 3 (c j + 2c j −1 ) + h j −1 (c j + c j −1 ) Operando algebraicamente, nos queda h j −1c j −1 + 2(h j −1 + h j )c j + h j + c j +1 = 3 3 (a j +1 − a j ) − (a j − a j −1 ) (7) hj h j −1 para cada j = 1, 2, ..., n − 1 . Este sistema tiene como incógnitas sólo a {c } {h } j n −1 j j =0 y {a } n −1 j j =0 están dados por el espaciamiento entre los nodos n j {x } n j =0 j =0 ya que los valores y los valores de f en los nodos. 11 Ing. Adriana M. Apaza – JTP Cálculo Numérico Cálculo Numérico – Programación Aplicada Nótese que una vez que se conocen los valores de c j encontrar las constantes restantes b j de la ecuación (4) y d j de la ecuación (1) y construir los polinomios cúbicos Sj es una cuestión sencilla. Si se cumplen las condiciones de frontera libre, S ′′( x0 ) = S ′′( x n ) = 0 implican que 0 = S ′′( x0 ) = 2c0 + 6d 0 ( x0 − x0 ) ⇒ c0 = 0 cn = S ′′( x n ) 2 = 0 ⇒ cn = 0 Las dos ecuaciones c0 = 0 y c n = 0 junto con las ecuaciones en (7) producen un sistema lineal descripto por la ecuación vectorial Ax = b , donde A es la matriz de (n+1) por (n+1). 1 0 0 h0 2(h0 + h1 ) h1 0 h3 2(h1 + h2 ) 0 h2 A= 0 hn−2 0 0 3 3 (a 2 − a1 ) − (a1 − a 0 ) h1 h0 b= M 3 (a n − a n−1 ) − 3 (a n −1 − a n − 2 ) hn −1 hn − 2 0 2(hn −2 + hn−1 ) 0 0 hn −1 1 c 0 c 1 x = c 2 M c n 12 Ing. Adriana M. Apaza – JTP Cálculo Numérico Cálculo Numérico – Programación Aplicada 13 Ing. Adriana M. Apaza – JTP Cálculo Numérico