E.T.S. Minas: Métodos Matemáticos Tema 2: Aproximación e interpolación Practica 1
Prof: Francisco Palacios EPSEM-UPC
Septiembre 2008, versión 1.4
• Polinomio de Taylor
• Polinomio interpolador
• Forma de Lagrange
• Forma de Newton
• Polinomio de Hermite
Ejercicio 2
Vamos a obtener el polinomio de McLaurin de f(x)=sin(x) de orden 4. Representamos conjuntamente el polinomio y la función.
Representamos el error absoluto y el error relativo. Determinamos cotas superiores para los errores en los intervalos dados. Los enunciados están en la lista de problemas.
Obtenemos la serie de Taylor
> f:=sin(x);
s4:=series(f,x=0,5);
:=
f sin x( ) :=
s4 x − 1 + 6x3 O x( 5) Obtenemos el polinomio de McLaurin de orden 4.
> p4:=convert(s4,polynom);
:=
p4 x − 1 6x3 Representación conjunta de la función y el polinomio
> plot([f,p4],x=-2..2,color=[red,blue]);
x
2 1
-1 -2
1
0.5
0
-0.5
-1
Construimos una expresión correspondiente al valor absoluto del error absoluto.
> e4:=abs(f-p4);
:=
e4 sin x( ) − + x 1 6x3 Representamos el error en el intervalo [-2,2].
Page 1
> plot(e4,x=-2..2);
x 2
1 -1
-2
0.2
0.15
0.1
0.05
0
A partir del gráfico, podemos observar la cota de error =0.25 para el (valor absoluto del) error absoluto.
Construimos una expresión para el valor absoluto del error relativo.
> r4:=abs((f-p4)/f);
:=
r4
− + ( )
sin x x 1
6x3 ( ) sin x Representamos en el intervalo [-1,1].
> plot(r4,x=-1..1);
x 1
0.5 -0.5
-1
0.008
0.006
0.004
0.002
0
Determinamos, a partir del gráfico, la cota de error |r4(x)!<= 0.0097.
Ejercicio 6
En este ejercicio, calculamos el polinomio interpolador de 3 puntos de varias formas
• Directamente, usando el comando interp
• Construyendo y resolviendo un sistema de ecuaciones
• Usando los polinomios componentes de Lagrange
• Usando diferencias divididas y la forma de Newton Interpolador con interp
> xx:=[0,1,2];
yy:=[-1,1,3];
p:=interp(xx,yy,x);
:=
xx [0 1 2, , ] :=
yy Page 2[-1 1 3, , ]
:=
p 2 x − 1
Interpolador mediante sistema de ecuaciones. Este grupo de ejecución construye y resuelve el sistema de ecuaciones que determina el interpolador.
En objeto de este ejercicio es mostrar el funcionamiento de algunos recursos de Maple.
Esta no es una buena forma de calcular el polinomio interpolador.
> p2:=a0+a1*x+a2*x^2;#polinomio genérico de grado 2
`***** nodos ******`;
x0:=0;
x1:=1;
x2:=2;
`***** valores *****`;
y0:=-1;
y1:=1;
y2:=3;
`****** creamos las ecuaciones ****`;
eq0:=subs(x=x0,p2)=y0;
eq1:=subs(x=x1,p2)=y1;
eq2:=subs(x=x2,p2)=y2;
`******* resolvemos *******`;
s:=solve({eq0,eq1,eq2},{a0,a1,a2});
`****** creamos el polinomio ******`;
q:=subs(s,p2);
:=
p2 a0 + a1 x + a2 x2
***** nodos ******
:=
x0 0 :=
x1 1 :=
x2 2
***** valores *****
:=
y0 -1 :=
y1 1 :=
y2 3
****** creamos las ecuaciones ****
:=
eq0 a0 = -1 :=
eq1 a0 + + a1 a2 = 1 :=
eq2 a0 + 2 a1 + 4 a2 = 3
******* resolvemos *******
:=
s {a2 = 0,a0 = -1,a1 = 2}
****** creamos el polinomio ******
:=
q 2 x − 1
Polinomio de Lagrange. El siguiente grupo de ejecución calcula el polinomio interpolador de 3 puntos en la forma de Lagrange.
> `***** nodos ******`;
x0:=0;
x1:=1;
x2:=2;
`***** valores *****`;
y0:=-1;
y1:=1;
y2:=3;
`**** polinomios fundamentales ***`;
L0:=(x-x1)*(x-x2)/((x0-x1)*(x0-x2));
L1:=(x-x0)*(x-x2)/((x1-x0)*(x1-x2));
L2:=(x-x0)*(x-x1)/((x2-x0)*(x2-x1));
`****** polinomio interpolaor *****`;
p2:=L0*y0+L1*y1+L2*y2;
q2:=expand(p2);#expresa el polinomio en potencias de x
***** nodos ******
:=
x0 0 Page 3
:=
x1 1 :=
x2 2
***** valores *****
:=
y0 -1 :=
y1 1 :=
y2 3
**** polinomios fundamentales ***
:=
L0 1
2(x − 1 () x − 2) :=
L1 −x (x − 2) :=
L2 1
2x (x − 1)
****** polinomio interpolaor *****
:=
p2 −1 − +
2(x − 1 () x − 2) x (x − 2) 3
2x (x − 1) :=
q2 2 x − 1
Forma de Newton. El siguiente grupo de ejecución calcula las diferencias divididas para 3 puntos y el polinomio interpolador en la forma de Newton.
> `***** nodos ******`;
x0:=0;
x1:=1;
x2:=2;
`***** valores *****`;
y0:=-1;
y1:=1;
y2:=3;
`***** diferencias divididas *****`;
f0:=y0;
f1:=y1;
f2:=y2;
f01:=(f1-f0)/(x1-x0);
f12:=(f2-f1)/(x2-x1);
f012:=(f12-f01)/(x2-x0);
`****** polinomio ********`;
p2:=f0+f01*(x-x0)+f012*(x-x0)*(x-x1);
***** nodos ******
:=
x0 0 :=
x1 1 :=
x2 2
***** valores *****
:=
y0 -1 :=
y1 1 :=
y2 3
***** diferencias divididas *****
:=
f0 -1 :=
f1 1 :=
f2 3 :=
f01 2 :=
f12 2 :=
f012 0
****** polinomio ********
:=
p2 2 x − 1
Ejercicio 15
El objetivo es aproximar el valor de la integral de la función f(x)=exp(-x^2) sobre el intervalo [0,1] usando polinomios interpoladores.
Definimos la función correspondiente al integrando. Page 4
> f:=x->exp(-x^2);
:=
f x → e(−x2)
Calculamos el interpolador de f en los nodos x0=0, x1=1/2,x2=1. Representamos conjuntamente f y el interpolador
> xx:=[0,1/2,1];
yy:=map(f,xx);#calcula el valor de f(x) en los nodos de la lista xx yy:=map(evalf,yy);#calculamos una aproximación decimal
p2:=interp(xx,yy,x);
plot([f(x),p2],x=0..1,color=[red,blue]);
:=
xx ⎡
⎣⎢⎢ ⎤
⎦⎥⎥
, , 0 1
2 1 :=
yy [1 e, (-1 4 / ),e(-1)] :=
yy [1. .7788007831 .3678794412, , ] :=
p2 −.3794442500 x2 − .2526763088 x + 1.
x 0.6 0.8 1
0.4 0.2
0 1
0.9
0.8
0.7
0.6
0.5
0.4
Integramos el interpolador p2 para obtener un valor aproximado de la integral de f(x) en [0,1].
> v2:=int(p2,x=0..1);
:=
v2 .7471804289
Calculamos con el comando int el valor exacto de la integral y error cometido por la aproximación v2
> v:=int(f(x),x=0..1);#valor exacto de la integral vf:=evalf(v);#evaluación decimal de v
er:=abs(vf-v2);#error cometido con v2 :=
v 1
2erf 1( ) π :=
vf .7468241330 :=
er .0003562959 Observamos que v2 aproxima el valor exacto con 3 decimales exactos.
La secuencia de ordenes presentada abajo, realiza las siguientes acciones
• Define la función a integrar y el intervalo de integración [a,b]
• Determina (n+1) nodos igualmente espaciados en el intervalo [a.b]
• Construye el interpolador de f(x) en los nodos calculados
• Representa conjuntamente la función f(x) i el interpolador calculado
• Calcula la integral del interpolador para aproximar la integral de la función
• Calcula el valor exacto de la integral de la función y el error absoluto
> f:=x->exp(-x^2);
a:=0;
b:=1;
n:=2;#número de subintervalos h:=(b-a)/n;#separación entre puntos
xx:=[seq(a+j*h,j=0..n)]; Page 5
yy:=map(f,xx);
yy:=map(evalf,yy);
p.n:=interp(xx,yy,x);
plot([f(x),p.n],x=a..b,color=[red,blue]);
`****** valor aproximación ********`;
v.n:=int(p.n,x=a..b);
`****** valor exacto y error ******`;
v:=int(f(x),x=a..b);
vf:=evalf(v);
er.n:=abs(vf-v.n);
:=
f x → e(−x2) :=
a 0
:=
b 1
:=
n 2
:=
h 1
2 :=
xx ⎡
⎣⎢⎢ ⎤
⎦⎥⎥
, , 0 1
2 1 :=
yy [1 e, (-1 4 / ),e(-1)] :=
yy [1. .7788007831 .3678794412, , ] :=
p2 −.3794442500 x2 − .2526763088 x + 1.
x
1 0.8
0.6 0.4
0.2 0
1
0.9
0.8
0.7
0.6
0.5
0.4
****** valor aproximación ********
:=
v2 .7471804289
****** valor exacto y error ******
:=
v 1
2erf 1( ) π :=
vf .7468241330 :=
er2 .0003562959
Una vez verificado el buen funcionamiento con n=2, calculamos la aproximación con 5 puntos (n=4)
> f:=x->exp(-x^2);
a:=0;
b:=1;
n:=4;#número de subintervalos h:=(b-a)/n;#separación entre puntos xx:=[seq(a+j*h,j=0..n)];
yy:=map(f,xx);
yy:=map(evalf,yy);
p.n:=interp(xx,yy,x); Page 6
plot([f(x),p.n],x=a..b,color=[red,blue]);
`****** valor aproximación ********`;
v.n:=int(p.n,x=a..b);
`****** valor exacto y error ******`;
v:=int(f(x),x=a..b);
vf:=evalf(v);
er.n:=abs(vf-v.n);
:=
f x → e(−x2) :=
a 0
:=
b 1
:=
n 4
:=
h 1
4 :=
xx ⎡
⎣⎢⎢ ⎤
⎦⎥⎥
, , , , 0 1
4 1 2
3 4 1
:=
yy
⎡
⎣⎢⎢ ⎤
⎦⎥⎥
, , , ,
1 e
⎛
⎝⎜⎜ ⎞
⎠⎟⎟
-1
16 e(-1 4 / ) e
⎛
⎝⎜⎜ ⎞
⎠⎟⎟
-9 16 e(-1) :=
yy [1. .9394130628 .7788007831 .5697828247 .3678794412, , , , ] :=
p4 .04160629015 x4 + .4882003122 x3 − 1.184555726 x2 + .0226285650 x + 1.
x
1 0.8
0.6 0.4
0.2 0
1
0.9
0.8
0.7
0.6
0.5
0.4
****** valor aproximación ********
:=
v4 .7468337099
****** valor exacto y error ******
:=
v 1
2erf 1( ) π :=
vf .7468241330 :=
er4 .95769 10-5
Ejercicio 16: Polinomio de Hermite
El material correspondiente al polinomio de Hermite es opcional Resolución usando sistema de ecuaciones
> `***** nodos *****`;
x0:=0;
x1:=1;
`*** valores ****`;
y0:=1;
dy0:=1;#derivada en x0
Page 7
y1:=2;
dy1:=-1;
`***** polinomio genérico y derivada *********`;
h3:=a0+a1*x+a2*x^2+a3*x^3;
dh3:=diff(h3,x);
`****** ecuaciones **********`;
eq0:=subs(x=x0,h3)=y0;
eqd0:=subs(x=x0,dh3)=dy0;
eq1:=subs(x=x1,h3)=y1;
eqd1:=subs(x=x1,dh3)=dy1;
`******* resolución y polinomio *******`;
s:=solve({eq0,eqd0,eq1,eqd1},{a0,a1,a2,a3});
h3:=subs(s,h3);
>
***** nodos *****
:=
x0 0 :=
x1 1
*** valores ****
:=
y0 1 :=
dy0 1 :=
y1 2 :=
dy1 -1
***** polinomio genérico y derivada *********
:=
h3 a0 + a1 x + a2 x2 + a3 x3 :=
dh3 a1 + 2 a2 x + 3 a3 x2
****** ecuaciones **********
:=
eq0 a0 = 1 :=
eqd0 a1 = 1 :=
eq1 a0 + + + a1 a2 a3 = 2 :=
eqd1 a1 + 2 a2 + 3 a3 = -1
******* resolución y polinomio *******
:=
s {a2 = 2,a0 = 1,a3 = -2,a1 = 1} :=
h3 1 + + x 2 x2 − 2 x3 Cálculo del polinomio usando diferencias
> `***** nodos *****`;
x0:=0;
x1:=1;
`*** valores ****`;
y0:=1;
dy0:=1;#derivada en x0 y1:=2;
dy1:=-1;
`*********** diferencias *********`;
f0:=y0;
f1:=y1;
f00:=dy0;
f01:=(f1-f0)/(x1-x0);
f11:=dy1;
f001:=(f01-f00)/(x1-x0);
f011:=(f11-f01)/(x1-x0);
f0011:=(f011-f001)/(x1-x0);
`****** polinomio *******`;
h3:=f0+f00*(x-x0)+f001*(x-x0)^2+f0011*(x-x0)^2*(x-x1);
h3:=expand(h3);
***** nodos *****
:=
x0 0 :=
x1 1 Page 8
*** valores ****
:=
y0 1 :=
dy0 1 :=
y1 2 :=
dy1 -1
*********** diferencias *********
:=
f0 1 :=
f1 2 :=
f00 1 :=
f01 1 :=
f11 -1 :=
f001 0 :=
f011 -2 :=
f0011 -2
****** polinomio *******
:=
h3 1 + − x 2 x2(x − 1) :=
h3 1 + − x 2 x3 + 2 x2
Ejercicio 21
Usamos el programa del ejercicio anterior con algunos cambios. Ahora los valores se calculan usando la función f(x)=sin(x)
> f:=x->sin(x);
df:=D(f);#calcula la función derivada
`***** nodos *****`;
x0:=0;
x1:=evalf(Pi/4);
`*** valores ****`;
y0:=f(x0);
dy0:=df(x0);#derivada en x0 y1:=f(x1);
dy1:=df(x1);
`*********** diferencias *********`;
f0:=y0;
f1:=y1;
f00:=dy0;
f01:=(f1-f0)/(x1-x0);
f11:=dy1;
f001:=(f01-f00)/(x1-x0);
f011:=(f11-f01)/(x1-x0);
f0011:=(f011-f001)/(x1-x0);
`****** polinomio *******`;
h3:=f0+f00*(x-x0)+f001*(x-x0)^2+f0011*(x-x0)^2*(x-x1);
h3:=expand(h3);
:=
f sin :=
df cos
***** nodos *****
:=
x0 0 :=
x1 .7853981635
*** valores ****
:=
y0 0 :=
dy0 1 :=
y1 .7071067813 :=
dy1 .7071067811
*********** diferencias *********
:=
f0 0 :=
f1 .7071067813 :=
f00 1 :=
f01 Page 9.9003163162
:=
f11 .7071067811 :=
f001 -.1269212082 :=
f011 -.2460020205 :=
f0011 -.1516183992
****** polinomio *******
:=
h3 x − .1269212082 x2 − .1516183992 x2(x − .7853981635) :=
h3 x − .0078403959 x2 − .1516183992 x3 Valor aproximado y error
> vp:=subs(x=0.5,h3);
er:=abs(f(0.5)-vp);
:=
vp .4790876011 :=
er .0003379375 Representación gráfica
> plot([f(x),h3],x=-3..3,color=[red,blue]);
x
3 2
1 -1
-2 -3
1
0.5
0
-0.5
-1
Page 10