NOCIONES BÁSICAS DE LA PRÁCTICA 3 En la práctica 3 abordaremos problemas de interpolación polinomial. Concretamente, trabajaremos con la interpolación de Lagrange y el método de las diferencias divididas de Newton, para determinar el polinomio de interpolación de una función ݂: [ܽ, ܾ] ⟼ ℝ en un soporte de ݊ + 1 puntos distintos, ܵ = {ܽ = ݔ < ݔଵ < ⋯ < ݔ = ܾ}. Por simplicidad, trabajaremos siempre con soportes regulares. Para la programación de ambos algoritmos, precisamos dos instrucciones: poly y conv. La orden poly devuelve un vector cuyas componentes son los coeficientes de un polinomio del que se especifican las raíces, mientras que la instrucción conv proporciona un vector cuyas componentes son los coeficientes de un polinomio que es el producto de otros dos dados. EJEMPLO 1 Calculemos el producto de dos polinomios de primer grado, ܲ( )ݔy ܳ()ݔ, cuyas raíces son respectivamente, 2 y 3, es decir, ܲ( ݔ = )ݔ− 2 y ܳ( ݔ = )ݔ− 3: >>P=poly(2) P= 1 -2 >>Q=poly(3) Q= 1 -3 >>conv(P,Q) ans= 1 -5 6 Así, ܲ( ݔ = )ݔ(ܳ)ݔଶ − 5 ݔ+ 6. EJEMPLO 2. Representación gráfica de funciones Veamos cómo podemos representar gráficamente una función cualquiera con MatLab, haciendo uso de un soporte regular de puntos. Por ejemplo, para representar la función ݔ ݊݁ݏ = ݕen el intervalo [−3,3], procederemos como sigue: 1) Dividamos el intervalo [−3,3] en subintervalos de longitud 0.01, y consideremos los extremos de dichos subintervalos, que son un total de 600. Así, creemos un vector cuyas componentes son dichos puntos: ݔ = ݔ + ݇ℎ = −3 + 0.01 ݇, 0 ≤ ݇ ≤ 600. A continuación, hallamos ݔ ݊݁ݏ , 0 ≤ ݇ ≤ 600, y dibujamos los puntos (ݔ , ݔ ݊݁ݏ ). En MatLab haríamos: >>x=-3:0.01:3;% h=0.01 >>y=sin(x); >>plot(x,y) De este modo, obtenemos la representación gráfica siguiente: Página 1 2) Si ahora queremos representar gráficamente las funciones ݔ ݊݁ݏ = ݕe = ݕcos ݔ simultáneamente sólo hemos de hacer >>z=cos(x); >>plot(x,y,x,z) EJEMPLO 3. Polinomio de interpolación de Lagrange Ahora creemos una carpeta, por ejemplo, PRÁCTICA3, en la que almacenar los ficheros *.m que construyamos de aquí en adelante. Con el editor de MatLab, hemos creado el fichero lagran.m, con el que calcularemos el polinomio de interpolación de Lagrange de una función conocida en un soporte de puntos ܵ = {ܽ = ݔ < ݔଵ < ⋯ < ݔ = ܾ}. Para ello hemos tenido en cuenta que el polinomio de interpolación de Lagrange viene dado por ܲ ( = )ݔ ݕ ܮ ()ݔ, ୀ donde ܮ ()ݔ, 0 ≤ ݇ ≤ ݊, son los polinomios de Lagrange asociados al soporte ܵ. Así, hallemos el polinomio de interpolación de Lagrange de grado 2 de la función ݁ ௫ en el intervalo [−2,2], para lo cual deberemos considerar un soporte de 3 puntos. Página 2 >>format long >>X=-2:2:2% Vector cuyas componentes son los puntos del soporte >>Y=exp(X);% Imágenes de los puntos del soporte >>p2=lagran(X,Y)% Hallamos el polinomio de interpolación de Lagrange p2 = 0.690548922770908 1.813430203923510 1.000000000000000 El programa nos devuelve un vector de 3 componentes, correspondientes a los coefiencientes polinomio buscado, esto es, ܲଶ ( = )ݔ0.690548922770908 ݔଶ + 1.813430203923510 ݔ+ 1.000000000000000. Resulta de gran utilidad comprobar gráficamente si el polinomio hallado aproxima bien a la función en el intervalo. Por tanto, representaremos gráficamente tanto la función como el polinomio de interpolación usando la misma técnica del ejemplo 2: >>x=-2:0.05:2;% Puntos de abscisa >>y=exp(x);% Ordenada de los puntos para dibujar la función >>z2=polyval(p2,x);% Ordenada de los puntos para dibujar el polinomio >>plot(x,y,x,z2,X,Y,'o') Con la última orden, hemos dibujado primero la gráfica de la función ݁ = ݕ௫ , “x,y”, después ܲ = ݕଶ ()ݔ, “x,z2”, y con “X,Y,'o'”, hemos dibujado los puntos (ݔ , ݕ ), ݕ = ݁ ௫ೖ , 0 ≤ ݇ ≤ 2 . Por defecto, la primera gráfica se dibuja en azul y la segunda en verde. A continuación, podemos hallar el error cometido calculando de forma aproximada ԡ݁ ௫ − ܲଶ ԡஶ,[ିଶ,ଶ] = máx௫∈[ିଶ,ଶ] |݁ ௫ − ܲଶ (|)ݔ. Para ello, en lugar de usar la expresión que hemos estudiado en las clases de teoría, podemos determinar el error aproximadamante evaluando |݁ ௫ − ܲଶ ( |)ݔen los puntos de abscisa que hemos utilizado para la representación gráfica. De este modo, haremos >>error2=norm(y-z2,inf) error2 = 0.855427489272089 Página 3 Si deseamos una aproximación mejor, podemos hallar los polinomios de grado 4 y grado 8, y hallar los errores cometidos procediendo como antes: >>X=-2:1:2;% Puntos del soporte regular con h=1 >>Y=exp(X); >>p4=lagran(X,Y) )% Polinomio de interpolación de Lagrange de grado 4 p4 = Columns 1 through 4 0.049156095985221 0.212743003426569 0.493924538830023 0.962458190217232 Column 5 1.000000000000000 >>z4=polyval(p4,x); >>error4=norm(y-z4,inf) error4 = 0.045799198578959 >>X=-2:0.5:2;% Puntos del soporte regular con h=0.5 >>Y=exp(X); >>p8=lagran(X,Y)% Polinomio de interpolación de Lagrange de grado 8 p8 = Columns 1 through 4 0.000026952284535 0.000220091717558 0.001383939794793 0.008283334452106 0.166704405097319 0.499999343699899 0.999993362376823 Columns 5 through 8 0.041670399036014 Column 9 1.000000000000000 >>z8=polyval(p8,x); >>error8=norm(y-z8,inf) error8 = 3.461632872792109e-005 Vemos cómo, a medida que aumentamos el grado del polinomio, el error va disminuyendo. Para la representación gráfica no hay más que hacer >> plot(x,y,x,z4,X,Y,'o') >> plot(x,y,x,z8,X,Y,'o') Página 4 ݁ = ݕ௫ , ܲ = ݕସ ()ݔ. ݁ = ݕ௫ , )ݔ(଼ܲ = ݕ. EJEMPLO 4. Método de Newton y fenómeno de Runge En este ejemplo, usaremos el método de Newton de las diferencias divididas para determinar el polinomio de interpolación de una función en un soporte. En el fichero newpoly.m guardaremos la programación de este algoritmo. Recordemos que el polinomio de interpolación de la función ݂: [ܽ, ܾ]: ↦ ℝ en el soporte ܵ = {ܽ = ݔ < ݔଵ < ⋯ < ݔ = ܾ} usando el método de las diferencias finitas de Newton viene dado por ܲ (ݔ[݂ = )ݔ ] + ݂[ݔ , ݔଵ ]( ݔ− ݔ ) + ݂[ݔ , ݔଵ , ݔଶ ]( ݔ− ݔ )( ݔ− ݔଵ ) + ⋯ + +݂[ݔ , ݔଵ , ݔଶ , … , ݔ ]( ݔ− ݔ )( ݔ− ݔଵ ) … ( ݔ− ݔିଵ ), donde ݂[ݔ , ݔଵ , … , ݔ ] = [௫భ ,௫భ ,…,௫ೖ ]ି[௫బ ,௫భ ,…,௫ೖషభ ] ௫ೖ ି௫బ . En la programación del método creamos una matriz cuadrada ܦde orden ݊ + 1 tal que ()ܦ, = ݂[ݔି , ݔିାଵ , … , ݔ ], para ݆ ≤ ݇. En consecuencia, ()ܦ, = ()ܦ,ିଵ − ()ܦିଵ,ିଵ , 1 ≤ ݇, ݆ ≤ ݊ + 1, ݔ − ݔି donde ݂[ݔ , … , ݔ ] = ()ܦ, , para 1 ≤ ݇ ≤ ݊. Consideremos ahora la función ݂( |ݔ| = )ݔen el intervalo [−1,1]. Comencemos hallando el polinomio de interpolación de grado 4: >>X=-1:0.5:1;% Puntos del soporte >>Y=abs(X);% Imágenes de los puntos del soporte >>p4=newpoly(X,Y)% Cálculo del polinomio p4 = Columns 1 through 4 -1.333333333333333 0.000000000000000 2.333333333333334 Column 5 Página 5 0 0 Hallamos una aproximación del error y representamos gráficamente la función y el polinomio: >>x=-1:0.01:1; >>y=abs(x); >>z4=polyval(p4,x); >>error4=norm(y-z4,inf) error4 = 0.147200000000000 >>plot(x,y,x,z4,X,Y,'o') Comprobemos ahora si, con polinomios de grado superior, obtenemos una aproximación mejor. Hallemos primero el polinomio de grado 8: >>X=-1:0.25:1; >>Y=abs(X); >>p8=newpoly(X,Y) p8 = Columns 1 through 4 -16.253968253968253 0 31.288888888888881 -0.000000000000014 Columns 5 through 8 -19.111111111111121 -0.000000000000002 5.076190476190476 Column 9 0 >>error8=norm(y-z8,inf) error8 = 0.315753154229042 Vemos que el error ha aumentado. Probemos a calcular el polinomio de grado 20: >>X=-1:0.1:1; >>Y=abs(X); Página 6 0 >>p20=newpoly(X,Y) p20 = 1.0e+006 * Columns 1 through 4 -0.399687285690876 -0.000000000000000 1.541147151590405 -0.000000000000003 -0.000000000000013 2.130618240512224 -0.000000000000015 -0.000000000000005 0.336889537488304 -0.000000000000001 0.006791040339104 -0.000000000000000 0.000013375428064 0 Columns 5 through 8 -2.465031365769913 Columns 9 through 12 -1.087518134777227 Columns 13 through 16 -0.062822061891601 -0.000000000000000 Columns 17 through 20 -0.000399497228521 -0.000000000000000 Column 21 0 >>z20=polyval(p20,x); >>error20=norm(y-z20,inf) error20 = 93.253981746703161 Comprobamos que el error aumenta con el grado del polinomio de interpolación. Este comportamiento se conoce fenómeno de Runge. Representemos gráficamente la función y ambos polinomios: |ݔ| = ݕ, )ݔ( ଼ܲ = ݕ. |ݔ| = ݕ, ܲ = ݕଶ ()ݔ. Obsérvese cómo la aproximación en la parte central del intervalo es mucho mejor que en los extremos, donde el polinomio aproxima mucho peor. Página 7