Вы находитесь на странице: 1из 14

Prctica de interpolacin con MATLAB

J. Mas X. Casabn Noviembre 2005 J. Marn

ndice
1. Introduccin 2. Un ejemplo de interpolacin con MATLAB 2.1. Interpolacin con la orden interp1 . . . . . . . . . . . . . . . 2.2. Interpolacin con la orden polyfit . . . . . . . . . . . . . . . 2.3. Comparacin de resultados. . . . . . . . . . . . . . . . . . . . . . 3. Ejercicios 4. La orden spline de MATLAB 4.1. Ejemplo de uso de spline: Dibujo de una circunferencia . . . . 4.1.1. Clculo de las cerchas y dibujo del resultado . . . . . . . 5. La orden pchip 6. Ejercicios 1 2 2 5 6 8 9 11 12 12 13

1.

Introduccin

En esta prctica vamos a aprender a utilizar las rdenes de interpolacin de MATLAB y realizaremos algunos ejemplos con ellas. Para interpolacin en una variable MATLAB dispone de dos rdenes: interp1 Esta orden tiene varias opciones para realizar la interpolacin, entre las que no gura la interpolacin polinomial. Precisamente en la versin 6 de MATLAB se aadieron nuevas opciones a esta orden y la opcin cubic cambi de comportamiento. Describiremos el uso de esta orden a partir de la versin 6. 1

polyfit Esta orden permite realizar la interpolacin polinomial, aunque en realidad est pensada para el ajuste de curvas por el mtodo de mnimos cuadrados.

2.

Un ejemplo de interpolacin con MATLAB

Vamos a interpolar la funcin seno a partir de unos pocos puntos usando distintos mtodos y a comparar los resultados obtenidos. Para ello calcularemos de forma exacta (ms bien casi exacta puesto que el seno se calcula con error de truncamiento) el valor de la funcin seno correspondiente a 0, 1, 2, ..., 10 radianes y usaremos estos datos como puntos soporte para calcular por interpolacin el valor del seno en puntos separados entre s 0,25 radianes. Generacin de los datos. Generamos los datos con las rdenes x = 0:10; y = sin(x); Podemos ver grcamente estos puntos con la orden plot(x, y, o)

Generacin de los puntos donde calculamos el valor interpolando Para generar los puntos igualmente separados entre 0 y 10 con una separacin de 0,25 radianes introducimos la orden xi = 0: .25: 10;

2.1.

Interpolacin con la orden interp1

Veamos primero cmo interpolar con la orden interp1 de MATLAB y sus distintas opciones.

Interpolacin con la orden interp1 de MATLAB con la opcin por defecto. Para calcular la interpolacin por defecto utilizamos yi = interp1(x, y, xi); podemos ver grcamente el resultado con la orden plot(x, y, o, xi, yi) como se aprecia en la gura la interpolacin por defecto de MATLAB consiste en construir la poligonal que pasa por los puntos soporte. Interpolacin con la opcin nearest de MATLAB. Para calcular la interpolacin con la opcin nearest escribimos yn = interp1(x, y, xi, nearest); Podemos ver grcamente el resultado con la orden plot(x, y, o, xi, yn) como se puede apreciar se obtiene una funcin formada por segmentos horizontales. A cada punto de xi se le asigna el valor de la ordenada soporte correspondiente a la abcisa soporte ms prxima. Interpolacin con la opcin linear de MATLAB. Para utilizar la interpolacin lineal utilizamos la orden yl = interp1(x, y, xi, linear); Se puede consultar el resultado grcamente con la orden plot(x, y, o, xi, yl) y se observa que esta es la opcin por defecto. Podemos comprobar el resultado con la orden all(yi == yl) como la respuesta es 1 eso indica que ambos vectores son idnticos, es decir todas sus componentes coinciden.

Interpolacin con la opcin spline de MATLAB Otra opcin de la orden interp1 de MATLAB es spline, que calcula la cercha que pasa por los puntos soporte. Se calcula con la orden: ys = interp1(x,y,xi,spline); cuyo resultado podemos ver grcamente con la orden plot(x,y,o,xi,ys) En este caso la funcin interpolante es una funcin polinmica a trozos. Los polinomios son de grado 3 y se eligen de forma que la funcin sea de clase C (2) , en particular para que lo sea en los puntos soporte. Adems en el caso de MATLAB las dos condiciones adicionales que se utilizan hacen que la funcin sea de clase C () en los puntos soporte (x1 , f1 ) y (xn1 , fn1 ), lo que equivale a que el primer y segundo polinomio coinciden as como el penltimo y el ltimo. Esta cercha es la conocida como no-nudo. MATLAB puede calcular otro tipo de cerchas utilizando la orden spline que se describe en el apartado 4. Adems de calcular valores para la funcin de interpolacin correspondiente puede devolver toda la informacin sobre la misma. Interpolacin con la opcin pchip o cubic de MATLAB Para utilizar la interpolacin cbica utilizamos la orden yc = interp1(x,y,xi,cubic); grcamente plot(x,y,o,xi,yc) en este caso la funcin interpolante es una funcin polinmica a trozos. En cada subintervalo se construye un polinomio de tercer grado que pasa por los extremos del mismo, igual que se hara al interpolar por splines, la diferencia es que en este caso no se fuerza a que los valores de las derivadas primera y segunda en los puntos soporte coincidan para polinomios contiguos, en su lugar se eligen las derivadas primeras de forma que coincidan para polinomios contiguos en los puntos soporte y que la funcin resultante sea montona cuando lo sean los datos. Si se observa la grca se ve que la funcin interpolante crece desde 0 hasta 2 porque los puntos soporte crecen, precisamente en este punto tiene un mximo local y luego es montona decreciente hasta 5, donde tiene un mnimo local, para luego volver a ser montona creciente hasta 8, donde hay otro mximo local, pasando

luego a ser montona decreciente. Los extremos locales siempre se encuentran en puntos soporte. El acrnimo pchip proviene de piecewise cubic Hermite interpolation, interpolacin de Hermite cbica a trozos1 . En la seccin 5 se describe el uso de la orden pchip que puede calcular valores para la funcin de interpolacin correspondiente o puede devolver toda la informacin sobre la misma.

2.2.

Interpolacin utilizando el polinomio de interpolacin (orden polyfit

Como se ha mencionado en la pgina 2 la orden de MATLAB que calcula el polinomio de interpolacin es polyfit. Esta funcin est pensada para resolver el problema de ajustar datos por el mtodo de los mnimos cuadrados, si se le pide un ajuste exacto se obtiene el polinomio de interpolacin. Por ello requiere tres parmetros: el primero es el vector con los datos de las abcisas soporte, el segundo el vector con los datos de las ordenadas soporte y el tercero es el grado del polinomio con el que se quieren ajustar los datos, en el caso de interpolacin este grado es una unidad menos que el nmero de puntos soporte. En nuestro ejemplo podramos usar pol = polyfit(x, y, length(x)-1) donde el grado del polinomio se ha indicado restando una unidad al nmero de elementos del vector la x, el nmero de elementos de este vector la es el valor devuelto por la orden length(x). En general si tenemos n + 1 puntos soporte podemos poner n en lugar de length(x)-1. El resultado es un vector con los coecientes del polinomio de interpolacin (siendo el primer coeciente el principal, es decir el correspondiente al trmino de mayor grado). Se observa que se produce un aviso, al que de momento no atenderemos pues los resultados que se obtienen son sucientemente precisos. Para calcular el valor del polinomio de interpolacin en los puntos en que venimos interpolando podemos escribir yp = polyval(pol,xi); el resultado se puede ver grcamente con la orden plot(x,y,o,xi,yp)
En las versiones 5 de MATLAB la opcin cubic se calculaba de forma diferente, esta forma se puede utilizar todava como v5cubic, pero no se utilizar en esta prctica
1

2.3.

Comparacin de resultados.

Vamos ahora a calcular los errores que se han cometido por los distintos mtodos. En primer lugar los valores exactos exact = sin(xi); y calculamos el error de la interpolacin con la opcin nearest en todos los puntos generados con la orden: errorn = exact-yn; para tener una idea del error calculamos el mximo error cometido en todos los puntos de xi con la orden: norm(errorn,inf) Una medida que recoge todos los errores se puede obtener calculando la norma eucldea del vector error, que es: norm(errorn) De la misma forma se obtienen ambos errores para la interpolacin lineal y las restantes opciones utilizadas errorl = exact - yl; norm(errorl, inf) norm(errorl) errors = exact - ys; norm(errors, inf) norm(errors) errorc = exact - yc; norm(errorc, inf) norm(errorc) errorp = exact - yp; norm(errorp, inf) norm(errorp) Los resultados se resumen en el cuadro 1. Como es de esperar las dos primeras opciones no dan resultados demasiado buenos, la opcin de interpolacin cbica de Hermite a trozos tampoco es demasiado satisfactoria, los mejores resultados se obtienen con el polinomio de interpolacin, siendo bastante buenos los de la cercha.

Mtodo Prximo (nearest) Lineal (linear) Cercha (spline) Cbica (cubic) Polinomio

Mximo error en un punto 0,4689 0,1221 0,0223 0,1064 0,0043

Norma eucldea del error 1,3814 0,3878 0,0416 0,2702 0,0057

Cuadro 1: Comparacin de errores por los distintos mtodos. Comparacin grca de los mtodos. Podemos ver grcamente todos los mtodos usados con las siguientes expresiones. plot(x,y,o, xi,exact, xi,yl, xi,yc, xi,ys, xi,yp) title(Interpolacin por distintos mtodos) legend(soporte,sen x,lineal,cubica,... spline,polinomica,0)
Nota: Como se aprecia en la grca MATLAB va cambiando de color al realizar las diferentes grcas. Si se desea imprimir la grca en una impresora en blanco y negro, los colores no se distinguirn. En este caso conviene indicar el tipo de trazo a realizar, para que se utilice slamente el color negro aadiremos una k. Por ejemplo plot(x,y,ko, xi,exact,k-, xi,yl,k--, xi,yc,k-.,... xi,ys,k:, xi,yp,k*-) title(Interpolacin por distintos mtodos) legend(soporte,sen x,lineal,cubica,... spline,polinomica,0)

La orden interp1 Como hemos visto esta orden permite realizar distintos tipos de interpolacin. Se le puede llamar de varias formas: YI = interp1(X, Y, XI) donde X es un vector (la o columna) con las abcisas soporte e Y es un vector (la o columna) con las ordenadas soporte. El vector XI contiene los puntos donde queremos conocer los valores de la funcin interpolante, estos valores se devuelven en YI. En muchos casos XI se reduce a un escalar. Por ejemplo si queremos conocer el valor aproximado del seno en 6,1 radianes en el ejemplo anterior utilizando interpolacin por cerchas, escribiramos v = interp1(x, y, 6.1, spline).

Si Y es una matriz con tantas las como componentes tiene el vector X y k columnas, se resuelven k problemas de interpolacin. En todos ellos las abcisas soporte estn dadas por el vector X y las ordenadas para el i-simo problema estn dadas por Y(:,i). El resultado es una matriz con k columnas, correspondientes a los distintos problemas de interpolacin. Si las abcisas soporte son los primeros nmeros naturales puede omitirse, es decir que las rdenes interp1(1:N,Y,XI) e interp1(Y,XI) producen el mismo resultado (asumiendo que X e Y tienen los tamaos adecuados). Por ltimo, como ya se ha visto, se puede especicar el mtodo de interpolacin.

3.

Ejercicios

Ejercicio 1 El chero poblSpain.mat 2 contiene datos sobre la poblacin de Espaa durante el siglo pasado, la primera columna corresponde a los aos y la segunda al nmero de habitantes en millones. Con esos datos estimar la poblacin en el ao 1945 usando interpolacin lineal, por cerchas, por interpolacin de Hermite cbica a trozos y por el polinomio de interpolacin. Dieren muchos los resultados? Ejercicio 2 Repetir el ejercicio anterior pero estimando ahora la poblacin en el ao 1905. Repetir la comparacin. Qu mtodo parece ms recomendable? Ejercicio 3 Si se usa alguna de las funciones interpolantes para estimar un valor fuera del intervalo determinado por los puntos soporte se dice que se est extrapolando. Extrapolar a partir de los datos anteriores el valor para la poblacin de Espaa en 2001 (usar la cercha, la funcin de interpolacin de Hermite cbica a trozos y el polinomio de interpolacin). Sabiendo que el censo de 2001 proporciona un valor de 40847371 habitantes, qu puede decirse de la extrapolacin? Ejercicio 4 Considerar los siguientes datos extraidos de un trabajo de investigacin de Akima sobre interpolacin (no son por tanto datos de un experimento real) x y 0 2 3 5 6 8 9 11 12 14 15 10 10 10 10 10 10 10,5 15 50 60 85

Comparar grcamente los resultados de la interpolacin por splines y por interpolacin de Hermite cbica a trozos. Calcular y dibujar el polinomio de interpolacin.
Se cargan los datos en la memoria con la orden load poblSpain o con la secuencia adecuada de mens.
2

Ejercicio 5 Repetir el ejercicio anterior (sin usar ahora el polinomio de interpolacin) para los datos siguientes correspondientes a clculos radioqumicos de LLL x y 7,99 0 8,09 2,76429E 5 8,19 4,37498E 2 0,169183 8,7 9,2 0,469428 0,943740 10 12 0,998636 0,999919 15 0,999994 20 Los datos estn en el chero FC. Interpolar el valor en 8. Dibujar los datos y una funcin que se ajuste a los mismos. Extrapolar el valor en x = 25. Ejercicio 6 El programa difdiv calcula la tabla de las diferencias divididas. Si las coordenadas de los puntos soporte estn almacenadas en los vectores x e y, T=difdiv(x,y), devuelve una matriz T con las correspondientes diferencias divididas. Utilizarlo para calcular las diferencias divididas correspondientes a los datos x y 3,0 2,0 1,0 0 1,0 2,0 58,0 24,0 6,0 2,0 6,0 12,0 3,0 26,0

Se observa que a partir de un cierto orden son todas nulas. Por qu? Calcular el polinomio de interpolacin correspondiente a estos datos utilizando la forma de Newton.

4.

La orden spline de MATLAB

La orden interp1 de MATLAB permite la interpolacin mediante cerchas, pero slo del tipo no nudo. La orden spline permite calcular tambin la cercha cuya primera derivada en los extremos del intervalo de interpolacin tiene valores conocidos. De hecho la orden permite ambas opciones. Veamos cmo funcionan en un ejemplo. Ejemplo 1 Supongamos que tenemos los puntos (0, 1), (1, 3), (2, 2) y (3, 1), y que sabemos que la derivada de la funcin f de la que provienen cumple f (0) = 1 y f (3) = 1, con las siguientes rdenes 9

x = 0: 3; y = [1 3 2 1]; t = 0: .1: 3; ys1 = spline(x, y, t); y2 = [1 y -1]; ys2 = spline(x, y2, t); plot(x, y, o, t, ys1, r, t, ys2, b) legend(soporte, no-nudo, primera derivada, 0) introducimos los datos, generamos un vector de puntos, t, donde interpolar, interpolamos usando la cercha con la condicin de no nudo. Generamos luego un nuevo vector que aade a la informacin de las ordenadas soporte las dos derivadas en los extremos del intervalo de interpolacin, ntese que el primer dato es la derivada en 0 y el ltimo la derivada en 3, se calcula la cercha que cumple esta condicin y nalmente se dibujan los puntos soporte y ambas cerchas, en color rojo la no nudo y en azul la que cumple la condicin adicional de las derivadas. La orden spline puede usarse tambin con slo dos argumentos, en este caso la respuesta es una estructura con toda la informacin sobre la cercha ys3 = spline(x, y) ys3 = form: breaks: coefs: pieces: order: dim: pp [0 1 2 3] [3x4 double] 3 4 1

que informa sobre la forma del resultado, un polinomio a trozos (piecewise polynomial), de los puntos donde se cambia de polinomio, del tamao de la matriz que almacena los coecientes, del nmero de polinomios, del nmero de coecientes de cada polinomio y de la dimensin (una variable). Con la orden ys3.coefs veremos cules son estos coecientes (hay que tener en cuenta que MATLAB aplica un desplazamiento y el resultado no est expresado tal como podramos esperar para denir directamente la funcin a trozos). Sin embargo la principal utilidad es que esta estructura puede guardarse y utilizarse en clculos posteriores con la orden ppval. En efecto y = ppval(ys3, 1.5) proporciona el valor de la cercha en x = 1,5. 10

Igual que ocurre con interp1 se pueden resolver varios problemas de interpolacin a la vez, siempre que las abcisas soporte sean las mismas para todos los problemas. La orden spline(x,Y), donde x es un vector (la o columna) e Y una matriz con tantas columnas como elementos tenga x, y k las, resuelve k problemas de interpolacin. En todos ellos las abcisas soporte son las componentes del vector x y las ordenadas del i-simo problema son las componentes de la i-sima la de Y, es decir Y(i,:). Hay que tener en cuenta que la forma de considerar las ordenadas soporte en la matriz Y es el contrario que en la orden interp1. Esta caracterstica se utiliza en el siguiente apartado.

4.1.

Ejemplo de uso de spline: Dibujo de una circunferencia

En este ejemplo vamos a usar la orden spline de MATLAB para dibujar la circunferencia de centro en el origen y radio 1 a partir de muy pocos datos y usando interpolacin por cerchas. Este es el mismo ejemplo que se puede encontrar en la ayuda HTML de la orden de MATLAB. La ecuacin paramtrica de la circunferencia con centro en el origen y radio 1 es x(t) = cos t y(t) = sen t (1)

donde t es un parmetro que vara en un intervalo cualquiera de longitud 2. Si elegimos el intervalo [ 0, 2 ] la circunferencia se empieza a dibujar por el punto (1, 0) y en sentido contrario al de las agujas del reloj se recorre la circunferencia pasando por este orden por los puntos (0, 1), (1, 0) y (0, 1) para cerrarse nuevamente en (1, 0). Estos puntos corresponden respectivamente a los valores 0, /2, , 3/2 y 2 del parmetro t y es prcticamente la nica informacin que vamos a utilizar. Como la cercha requiere de otras dos condiciones para estar completamente determinada, y ya que sabemos que la tangente a la circunferencia en el punto inicial (t = 0) y nal (t = 2) (que es el mismo el (1, 0)) es vertical, utilizaremos estos datos. Como derivando las ecuaciones paramtricas respecto de t y sustituyendo por el valor correspondiente (0 y 2) obtenemos que x (0) = x (2) = 0 y que y (0) = y (2) = 1, que son los datos que precisamos. Debe quedar claro que necesitamos interpolar tanto los valores de x como los de y, ya que en este caso la variable independiente es t. Introduccin de los datos Los valores de t que generan los puntos de la circunferencia que vamos a utilizar, los obtenemos con la orden 11

t = pi * (0:.5:2); con lo que obtenemos el vector de componentes 0, /2, , 3/2 y 2. Introducimos ahora una matriz con dos las, en la primera la estarn los valores de x conocidos, aadiendo como primera y ltima componente los valores de la derivada en 0 y 2. En la segunda la estn los valores conocidos para y aadiendo al principio y al nal los valores de la derivada en 0 y 2. Es decir x (0) x(0) x(/2) x() x(3/2) x(2) x (2) y (0) y(0) y(/2) y() y(3/2) y(2) y (2) que se calculan utilizando las ecuaciones paramtricas dadas en (1). Los resultados se introducen en MATLAB como xy = [0 1 0 -1 0 1 0; 1 0 1 0 -1 0 1];

4.1.1.

Clculo de las cerchas y dibujo del resultado

Con estos datos vamos a calcular el valor de las cerchas (una para las x y otra para las y) usando la orden spline en una serie de puntos que generamos previamente tt = pi * (0:.01:2); val = spline(t, xy, tt); plot(val(1,:), val(2,:)) axis equal la primera la de val tiene los valores interpolados para x y la segunda los correspondientes para la y. Para comparar con la circunferencia la dibujamos tambin de color rojo hold on plot(cos(tt), sin(tt), r) hold off

5.

La orden pchip

pchip resuelve el problema de interpolacin utilizando la interpolacin cbica de Hermite a trozos. Al igual que la orden spline muestra la informacin sobre la funcin interpolante, que es una funcin denida a trozos y en cada uno de ellos es un polinomio de tercer grado. En este caso no hay opciones adicionales.

12

Ejemplo 2 Este ejemplo muestra un caso en que la naturaleza de los datos aconseja interpolar utilizando interpolacin cbica de Hermite a trozos. x = -3: 3; y = [-1 -1 -1 0 1 1 1]; t = -3: .01: 3; plot(x,y,o, t,[pchip(x,y,t); spline(x, y, t)]) legend(data, pchip, spline, 4)

6.

Ejercicios
1. Utilizando la cercha no nudo. 2. Utilizando pchip 3. Aadiendo los puntos correspondientes a t = /4, t = 3/4, t = 5/4 y t = 7/4, y usando las condiciones adicionales de la derivada. 4. Comparar grcamente los resultados.

Ejercicio 7 Repetir el dibujo de la circunferencia de la seccin 4.1

Ejercicio 8 Utilizando interpolacin mediante splines dibujar la elipse con centro en el origen y semiejes de longitudes 2 y 1, es decir que pasa por los puntos (2, 0) y (0, 1) (Tener en cuenta la simetra y el valor de las derivadas) Sabiendo que las ecuaciones paramtricas de esta elipse son x = 2 sen t y = cos t , t [ 0, 2 ]

comparar el resultado obtenido por interpolacin con la grca exacta. Ejercicio 9 El problema de interpolacin podra resolverse de la siguiente forma: Dados los puntos soporte (x0 , f0 ), . . . , (xn , fn ), para encontrar el polinomio P (x) = an xn + an1 xn1 + + a1 x + a0 que pase por todos ellos, basta sustituir x por cada uno de los xi , i = 0, 1, 2, . . . , n y exigir que el resultado sea el correspondiente fi , de esta forma se obtiene el sistema de n + 1 ecuaciones lineales, con n + 1 incgnitas (los coecientes aj , j = 0, 1, 2, . . . , n) siguiente: n1 an xn + an1 x0 + + a1 x0 + a0 = f0 0 n1 an xn + an1 x1 + + a1 x1 + a0 = f1 1 n n1 an xn + an1 xn + + a1 xn + a0 = fn 13

cuya solucin proporciona los coecientes del polinomio de interpolacin. La matriz de coecientes de este sistema es una matriz que se llama matriz de Vandermonde y se genera fcilmente con la orden vander de MATLAB (consultar la ayuda correspondiente). Se pide: Escribir un archivo de funcin que calcule el polinomio de interpolacin de esta forma. Los argumentos de entrada deben ser dos vectores, el primero conteniendo las abcisas soporte y el segundo las ordenadas. La salida debe ser un vector con los coecientes del polinomio. Ejercicio 10 El chero estrella.mat contiene los datos de unas observaciones astronmicas de una estrella de tipo variable cefeida y representan variaciones de la magnitud aparente (variable mag) en funcin del tiempo (variable T). a) Hacer una grca de la magnitud donde aparezcan los datos y la interpolacin de los mismos por splines. b) Se sabe que la magnitud es peridica y los datos corresponden a un periodo. Estimar la derivada en T = 1 a partir de los datos, mediante la frmula centrada de segundo orden y teniendo en cuenta que el valor de la funcin para T = 1,2 es igual que para T = 0,2 por la periodicidad de la funcin. c) Calcular la spline cuyas derivadas en los dos extremos son iguales al valor de la derivada estimado en el apartado anterior. Representar grcamente esta interpolacin. d) Comparar grcamente los resultados obtenidos anteriormente con los obtenidos por interpolacin cbica de Hermite a trozos y por el polinomio de interpolacin. Ejercicio 11 Se aplica una fuerza para trasladar un objeto 120 metros, la fuerza realizada sobre el objeto se ha medido cada 10 metros y viene dada, en Newtons, en el chero fuerza.mat. Calcular aproximadamente la fuerza aplicada cuando el objeto se encuentra a 55 metros del origen, utilizando las diferentes opciones de interpolacin.

14

Вам также может понравиться