NOCIONES BÁSICAS DE LA PRÁCTICA 3

Anuncio
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
Descargar