Vous êtes sur la page 1sur 20

Interpolacin

En este captulo se estudia la interpolacin y la regresin.


La regresin es el ajuste de los datos experiementales a una funcin que
describe el modelo fsico particular. Por ejemplo, en un experiemento de
movimiento rectilneo uniforme, los datos experimentales (tiempo, posicin
del mvil) se ajustan a una lnea recta, ya que la ecuacin que describe el
movimiento rectilneo uniforme es x=x0+vt.
En la interpolacin la funcin pasa por todos los puntos.
Este pequeo programa muestra la diferencia
%datos experiementales
x=0.5:0.5:3;
y=[0.7,1.2,1.3,1.2,0.8,0.3];
hold on
plot(x,y,'ro','markersize',4,'markerfacecolor','r')
xx=linspace(0,3.1,100);
%regresin
p=polyfit(x,y,2); %polinomio de segundo grado
yy=polyval(p,xx);
plot(xx,yy,'b')
%interpolacin
yy=spline(x,y,xx);
plot(xx,yy,'r')
hold off
grid on
legend('datos','regresin','interpolacin')
xlabel('x')
ylabel('y');
title('Interpolacin, regresin')

En esta pgina, comenzamos el estudio de la interpolacin lineal, continuamos


por el mtodo de Lagrange, pero veremos que la interpolacin mediante
"splines" es mucho ms adecuada.

Interpolacin lineal
La interpolacin lineal es muy sencilla. Disponemos de pares de datos
(xk,yk) k=1,2...n. Queremos conocer el valor de ypara un valor cualesquiera
de x en el intervalo x1 a xn. Supongamos que x est en el intervalo (xk,xk+1) tal
como se muestra en la figura. Trazamos la recta que pasa por los puntos (xk,yk)
y (xk+1,yk+1), cuya ecuacin es
y=(xxk)yk+1(xxk+1)yk(xk+1xk)y=(xxk)yk+1(xxk+1)yk(xk+1xk)

Creamos la funcin interpola_lineal para obtener el valor de y cuando se


proporciona el valor de x.
function y0 = interpola_lineal(x,y,x0)
y0=zeros(length(x0),1);
for j=1:length(x0)
indice=find(x>x0(j));
k=indice(1)-1;
y0(j)=((x0(j)-x(k))*y(k+1)-(x0(j)-x(k+1))*y(k))/(x(k+1)-x(k));
end
end

Probamos la funcin para interpolar linealmente los siguientes pares de datos


(0,0), (/3, sin(/3)), (2/3, sin(2/3)),(, 0). Podemos comprobar que
obtenemos los mismos resultado utilizando la funcin MATLAB interp1,
pasndole la opcin linear en el ltimo parmetro.
x=[0,pi/3,2*pi/3,pi]; %datos
y=sin(x);
xx=0:pi/90:pi; %funcin
yy=sin(xx);
x0=[pi/6,pi/2,5*pi/6]; %interpolacin lineal
y0=interpola_lineal(x,y,x0);
%y0=interp1(x,y,x0,'linear'); %esta es una funcin MATLAB
hold on
plot(xx,yy,'b')
plot(x,y,'r')
plot(x,y,'bo','markersize',4,'markerfacecolor','b')
plot(x0,y0,'ro','markersize',6,'markerfacecolor','r')
hold off
xlabel('x');
ylabel('y')
title('Interpolacin lineal')

Discutiremos en la siguiente seccin, la interpolacin mediante un polinomio


de mayor grado. Podemos calcular los coeficientes de un polinomio de tercer
grado y=a1x3+a2x2+a3x+a4 que pase por los cuatro puntos. Obtenemos un
sistema de cuatro ecuaciones con cuatro incgnitas.
a1x31+a2x21+a3x1+a4=y1a1x32+a2x22+a3x2+a4=y2a1x33
+a2x23+a3x3+a4=y3a1x34+a2x24+a3x4+a4=y4x31x32x33x34x21x22x23x24x1
x2x3x41111a1a2a3a4=y1y2y3y4{a1x13+a2x12+a3x1+
a4=y1a1x23+a2x22+a3x2+a4=y2a1x33+a2x32+a3x3+a4=y3a1x43+a2x42+a3x4+a4=y
4(x13x12x11x23x22x21x33x32x31x43x42x41)(a1a2a3a4)=(y1y2y3y4)
x=[0,pi/3,2*pi/3,pi]; %datos
y=sin(x);
xx=0:pi/90:pi; %funcin
yy=sin(xx);
x0=[pi/6,pi/2,5*pi/6]; %interpolacin lineal
A=vander(x);
p=A\y'; %coeficientes del polinomio
hold on
plot(xx,yy,'b') %datos y funcin

plot(x,y,'bo','markersize',4,'markerfacecolor','b')
yy=polyval(p,xx); %polinomio
plot(xx,yy,'r')
y0=polyval(p,x0); %valores interpolados
plot(x0,y0,'ro','markersize',6,'markerfacecolor','r')
hold off
xlabel('x');
ylabel('y')
title('Interpolacin con un polinomio de tercer gardo')

Interpolacin de Lagrange
Queremos encontrar los coeficientes de un polinomio de grado N
a1xN+a2xN-1+...+aNx+aN+1
que pase por todos los pares de datos (x1,y1), (x2,y2), ...(xN+1,yN+1). Los
coeficientes se pueden obtener resolviendo el sistema de ecuaciones:

a1xN1+a2xN11+aNx1+aN+1=y1a1xN2+a2xN12+aNx2+aN+1=
y2.....a1xNN+1+a2xN1N+1+aNxN+1+aN+1=yN+1{a1x1N+a2x1N1+aNx1+aN+1=y1
a1x2N+a2x2N1+aNx2+aN+1=y2.....a1xN+1N+a2xN+1N1+aNxN+1+aN+1=yN+1

En forma matricial
xN1xN2...xNN+1xN11xN12...xN1N+1............x1x2...xN+111...1a1
a2...aN+1=y1y2...yN+1(x1Nx1N1...x11x2Nx2N1...x21...............x
N+1NxN+1N1...xN+11)(a1a2...aN+1)=(y1y2...yN+1)

Esta matriz se conoce con el nombre de Vandermonde y se construye con el


comando vander(x), como podemos leer en el sistema de ayuda de
MATLAB, A=vander(v) devuelve una matriz de Vandermonde cuyas columnas
son las potencias del vector v, esto es A(i,j)=v(i)^(n-j)
Sea la siguiente tabla de datos tomada de una experiencia
x 0.97 1.12 2.92 3.00 3.33 3.97 6.10 8.39 8.56 9.44
y 2.58 0.43 0.06 5.74 7.44 8.07 6.37 2.51 1.44 0.52
Cuando el nmero N+1 de datos es relativamente pequeo, las primeras
columnas de la matriz A pueden guardar nmeros muy grandes, los efectos del
redondeo pueden afectar al valor de los coeficientes ai del polinomio.
Los valores del polinomio se puede obtener tambin utilizando la
funcin polyfit que emplearemos ms adelante en el ajuste por el
procedimiento de mnimos cuadrados.
x=[0.97 1.12 2.92 3.00 3.33 3.97 6.10 8.39 8.56 9.44];
y=[2.58 0.43 0.06 5.74 7.44 8.07 6.37 2.51 1.44 0.52];
n=length(x); %nmero de pares de datos
%A=vander(x);
A=zeros(n); %lneas equivalentes a utilizar vander(x)
for j=1:n
A(:,j)=(x').^(n-j);
end
p=A\y'; %sistema de ecuaciones lineales, y' es vector columna
p=polyfit(x,y,n-1) %n-1 es el grado del polinomio
xx=linspace(0.97,9.44,50); %interpolacin
yy=polyval(p,xx);
hold on
plot(x,y,'o','markersize',4,'markerfacecolor','r')
plot(xx,yy,'b')
xlabel('x')
ylabel('y')
title('Interpolacin de Lagrange');
hold off

Corremos el script interpola-1 en la ventana de comandos, obtenemos un


aviso, los coeficientes del polinomio y la representacin grfica de los datos y
del polinomio que pasa por dichos puntos.
Warning: Polynomial is badly conditioned.
p = 1.0e+004 *
0.0000
-0.0003
0.0057
-0.0595
-5.2142
3.9256
-1.1823

0.3782

-1.4951

3.6430

Un polinomio de Lagrange LN(x) de grado N es la expresin


LN(x)=(xx2)(xx3)...(xxN+1)(x1x2)(x1x3)...(x1xN+1)y1+(xx1)(xx3)...(xxN+1)(x2x1)(x2x3)...
(x2xN+1)y2+...+(xx1)(xx2)...(xxN)(xN+1x1)(xN+1x2)...(xN+1xN)yN+1LN(x)=(xx2)(xx3)...

(xxN+1)(x1x2)(x1x3)...(x1xN+1)y1+(xx1)(xx3)...(xxN+1)(x2x1)(x2x3)...
(x2xN+1)y2+...+(xx1)(xx2)...(xxN)(xN+1x1)(xN+1x2)...(xN+1xN)yN+1

Como puede probarse fcilmente este polinomio pasa por todos los puntos
(xi,yi).

Podemos elaborar una funcin denominada lagrange_3 que devuelva el valor


interpolado yy de xx cuando se le pasa los vectores x e y que guardan las
abscisas y ordenadas (xi,yi) de los datos
function yy = lagrange_3(x,y,xx)
n = length(x);
for i=1:n
w(i)=prod(xx-x([1:i-1 i+1:n]))*y(i)/prod( x(i)-x([1:i-1 i+1:n]) )
;
end
yy=sum(w);
end

Llamamos a la funcin lagrange_3 para conocer los valores interpolados


de xx=1.0 y xx=2.0
>>
>>
>>
yy
>>
yy

x=[0.97 1.12 2.92 3.00 3.33 3.97 6.10 8.39 8.56 9.44];
y=[2.58 0.43 0.06 5.74 7.44 8.07 6.37 2.51 1.44 0.52];
yy=lagrange_3(x,y,1.0)
=
10.0725
yy=lagrange_3(x,y,2.0)
= -203.7000

Alternativamente, podemos elaborar una funcin denominada lagrange_p que


devuelva los coeficientes del polinomio. El polinomio de Lagrange es la suma
de N+1 trminos. El numerador de cada trmino es el producto de N binomios
(x-xi)
function p=lagrange_p(x,y)
n=length(x); %n-1 es el grado del polinomio
if length(y)~=n
error('x e y tienen que tener la misma longitud')
end
p=zeros(1,n);
for i=1:n
pol=[y(i)];
for j=1:n
if(i~=j)
pol=conv([1 -x(j)],pol)/(x(i)-x(j)); %multiplica un
polinomio por un binomio
end
end
p=p+pol;
end
end

Para obtener el producto de los binomios del numerador de cada trmino,


utilizamos la funcin conv, vase la pginaPolinomios. Por ejemplo, queremos
multiplicar los polinomios p1=x3-2x-4 y p2=x2+3x+4
>> p1=[1 0 -2 -4];
>> p2=[1 3 4];
>> p=conv(p1,p2)
p =
1
3

-10

-20

-16

Utilizamos la funcin lagrange_p para obtener los coeficientes del polinomio


de Lagrange con los datos del ejemplo anterior.
>> x=[0.97 1.12 2.92 3.00 3.33 3.97 6.10 8.39 8.56 9.44];
>> y=[2.58 0.43 0.06 5.74 7.44 8.07 6.37 2.51 1.44 0.52];
>> p=lagrange_p(x,y)
p = 1.0e+004 *
0.0000
-0.0003
0.0057
-0.0595
0.3782
-1.4951
-5.2142
3.9256
-1.1823

3.6430

Obtenemos el mismo resultado, que resolviendo el sistema de N+1 ecuaciones


lineales.
Una vez obtenido el polinomio de Lagrange podemos calcular el valor
de y para valores de x que no estn en la tabla.
>> xx=[1.0 2.0 3.5];
>> yy=polyval(p,xx)
yy =
10.0725 -203.7000

1.8338

Para estos datos, la interpolacin de Lagrange parece que no produce buenos


resultados

Splines
Vamos a explicar mediante un ejemplo el procedimiento de interpolacin
denominado "splines", para generalizarlo despus a cualquier conjunto de
pares de datos.

Dado el conjunto de pares de datos (x1,y1), (x2,y2), (x3,y3), (x4,y4), (x5,y5) puntos
de color rojo en la fihgura. Definimos la funcin S(x)
S(x)=s1(x)x1x<x2s2(x)x2x<x3s3(x)
x3x<x4s4(x)x4x<x5si(x)=ai(xxi)3+bi(xxi)2+ci(xxi)+di

i=1,2,3,4S(x)={s1(x)x1x<x2s2(x)x2x<x3s3(x)x3x<x4s4(x)
x4x<x5si(x)=ai(xxi)3+bi(xxi)2+ci(xxi)+dii=1,2,3,4

Cada una de las funciones si(x) en color azul en la figura, es un polinomio de


tercer grado, cuya primera y segunda derivada es
dsidx=3ai(xxi)2+2bi(xxi)+cid2sidx2=6ai(xxi)

+2bii=1,2,3,4dsidx=3ai(xxi)2+2bi(xxi)+cid2sidx2=6ai(xxi)+2bii=1,2,3,4

Para calcular las 44=16 incgnitas a1,a2,a3,a4, b1,b2,b3,b4, c1,c2,c3,c4, d1,d2,d3,d4,


se imponen las siguientes condiciones:
1.

La funcin S(x) pasa por todos los puntos (xi,yi) i=1,2,3,4,5


si(xi)=yid1=y1d2=y2d3=y3d4=y4a4(x5x4)3+b
4(x5x4)2+c4(x5x4)+d4=y5si(xi)=yi{d1=y1d2=y2d3=y3d4=y4a4(x5x4)3+b4(

x5x4)2+c4(x5x4)+d4=y5

2.

La funcin S(x) es continua en x2, x3, x4.


si1(xi)=si(xi)a1(x2x1)3+b1(x2x1)2+c1(x2x1)+d1=d2a2(x3
x2)3+b2(x3x2)2+c2(x3x2)+d2=d3a3(x4x3)3+b3(x4x3)2+c3(x4x3)+d3
=d4si1(xi)=si(xi)
{a1(x2x1)3+b1(x2x1)2+c1(x2x1)+d1=d2a2(x3x2)3+b2(x3x2)2+c2(x3x2)+
d2=d3a3(x4x3)3+b3(x4x3)2+c3(x4x3)+d3=d4

3.

La derivada primera de la funcin S(x) es continua en x2, x3, x4.


s'i1(xi)=s'i(xi)3a1(x2x1)2+2b1(x2x1)+c1=c23a2(x3x2)2+2b
2(x3x2)+c2=c33a3(x4x3)2+2b3(x4x3)+c3=c4s'i1(xi)=s'i(xi)

{3a1(x2x1)2+2b1(x2x1)+c1=c23a2(x3x2)2+2b2(x3x2)+c2=c33a3(x4x3)2+2
b3(x4x3)+c3=c4

4.

Denominamos m1, m2, m3, m4, m5 al valor de la derivada segunda de si(x) en


los puntos x1, x2, x3, x4, x5.
s''i(xi)=mi2b1=m12b2=m22b3=m32b4=m46a4(x5
x4)+2b4=m5s''i(xi)=mi{2b1=m12b2=m22b3=m32b4=m46a4(x5x4)+2b4=m5

5.

La derivada segunda de S(x) es continua en los puntos x2, x3, x4


s''i1(xi)=s''i(xi)6a1(x2x1)+2b1=2b26a2(x3x2)+2b2=2b36a3(x4
x3)+2b3=2b4s''i1(xi)=s''i(xi)
{6a1(x2x1)+2b1=2b26a2(x3x2)+2b2=2b36a3(x4x3)+2b3=2b4

Supongamos que el espaciado entre dos puntos consecutivos es constante h=xixi-1, i=2,3,4,5.

Vamos a expresar las incgnitas a1,a2,a3,a4, b1,b2,b3,b4, c1,c2,c3,c4, d1,d2,d3,d4, en


trminos de h, el valor de las ordenadas yi y el valor de la derivada segunda
de S(x), mi en cada punto xi, i=1,2,3,4,5.
De (4) y (5) expresamos a1,a2, a3, a4 en trminos de m1, m2, m3, m4, m5.
a1=m2m16ha2=m3m26ha3=m4m36ha4=m5m46ha1=m2m16h
a2=m3m26ha3=m4m36ha4=m5m46h

Teniendo en cuenta (1) y (4), las ecuaciones (2) se expresan


m2m16hh3+m12h2+c1h+y1=y2m3m26hh3+m22h2+c2h+y2=y3m4m36hh
3+m32h2+c3h+y3=y4{m2m16hh3+m12h2+c1h+y1=y2m3m26hh3+m22h2+c2h+y2

=y3m4m36hh3+m32h2+c3h+y3=y4

Que nos permite despejar c1, c2, c3 en trminos de m1, m2, m3, m4, y1, y2, y3, y4
c1=y2y1hm2+2m16hc2=y3y2hm3+2m26hc3=y4y3hm4+2m36hc1=y2y1hm2+2m16h
c2=y3y2hm3+2m26hc3=y4y3hm4+2m36h

La ltima ecuacin de (1) nos permite despejar c4


m5m46hh3+m42h2+c4h+y4=y5c4=y5y4hm5+2m46hm5m46hh3+m42h2+c4h+y4=y5

c4=y5y4hm5+2m46h

Las ecuaciones (3) se expresan


3m2m16hh2+m1h+y2y1hm2+2m16h=y3y2hm3+2m26h3m3m26hh2+
m2h+y3y2hm3+2m26h=y4y3hm4+2m36h3m4m36hh2+m3h+y4y3hm4+2m36h=y5y4h
m5+2m46hm1+4m2+m3=6h2(y12y2+y3)m2+4m3+m4=6h2(y2
2y3+y4)m3+4m4+m5=6h2(y32y4+y5)
{3m2m16hh2+m1h+y2y1hm2+2m16h=y3y2hm3+2m26h3m3m26hh2+m2h+y
3y2hm3+2m26h=y4y3hm4+2m36h3m4m36hh2+m3h+y4y3hm4+2m36h=y5
y4hm5+2m46h{m1+4m2+m3=6h2(y12y2+y3)m2+4m3+m4=6h2(y22y3+y4)m3+4
m4+m5=6h2(y32y4+y5)

Tenemos tres ecuaciones y cinco incgnitas m1, m2, m3, m4, m5


Fijamos los valores de la derivada segunda m1 y m5 en los puntos extremos.
Supongamos que m1=0 y m5=0.
Hay otras posibilidades que se pueden consultar en el
documentohttp://online.redwoods.edu/instruct/darnold/laproj/Fall98/SkyMeg/
Proj.PDF
Despejamos m2, m3, m4 del sistema de tres ecuaciones

m1+4m2+m3=6h2(y12y2+y3)m2+4m3+m4=6h2(y22y3+y4)
m3+4m4+m5=6h2(y32y4+y5)410141014m2m3m4=6h2y12y2+
y3y22y3+y4y32y4+y5{m1+4m2+m3=6h2(y12y2+y3)m2+4m3+m4=6h2(y22
y3+y4)m3+4m4+m5=6h2(y32y4+y5)(410141014)
(m2m3m4)=6h2(y12y2+y3y22y3+y4y32y4+y5)

Caso general
En general, con n pares de datos tendremos el sistema
4100....01410...00141...00014.....................10000...4
m2m3m4m5...mn1=6h2y12y2+y3y22y3+y4y32y4
+y5y42y5+y6....yn22yn1+yn(4100...01410...00141...00014...0..........
.........000...14)
(m2m3m4m5...mn1)=6h2(y12y2+y3y22y3+y4y32y4+y5y42y5+y6....yn22yn
1+yn)

Fijamos los valores de los extremos del vector de las incgnitas m: m1=0, mn1=0, a continuacin, obtenemos mediante el operador divisin por la izquierda
los valores de m2, m3, ...mn-2, finalmente, se calculan:

los coeficientes a1,a2,a3,...an-1.

a1=m2m16ha2=m3m26ha3=m4m36h....
an1=mnmn16ha1=m2m16ha2=m3m26ha3=m4m36h.... an1=mnm
n16h

los coeficientes b1,b2,b3,...bn-1.

b1=m12b2=m22b3=m32.... bn1=mn12b1=m12b2=m22
b3=m32.... bn1=mn12

los coeficientes c1,c2,c3,...cn-1.

c1=y2y1hm2+2m16hc2=y3y2hm3+2m26hc3=y4y3hm4+2m36h.....cn1=ynyn1hmn+
2mn16hc1=y2y1hm2+2m16hc2=y3y2hm3+2m26hc3=y4y3hm4+2m36h.....cn1
=ynyn1hmn+2mn16h

los coeficientes d1,d2,d3,...dn-1.

d1=y1d2=y2d3=y3.... dn1=yn1d1=y1d2=y2d3=y3.... dn1=yn1

Codificacin

En primer lugar, vamos a entender como trabaja la funcin diag de MATLAB.


La funcin diag extrae vectores diagonales de la matriz A.
>> A=[1,2,3;4,5,6;7,8,9]
A =
1
2
3
4
5
6
7
8
9
>> diag(A) %diagonal principal
ans =
1
5
9
>> diag(A,1) %diagonal superior
ans =
2
6
>> diag(A,-1) %diagonal inferior
ans =
4
8

La funcin diag nos permite crear una matriz a partir de los vectores de sus
diagonales
A=diag(4*ones(3,1))+diag(ones(2,1),1)+diag(ones(2,1),-1)
A =
4
1
0
1
4
1
0
1
4

La funcin diff calcula la diferencia entre dos elementos consecutivos del


vector y
y=[y1,y2,y3,y4,y5]d1=dif(y)=[y2y1,y3y2,y4y3,y5y4]d2=dif(d1)=[y32y2
y1,y42y3y2,y52y4y3]y=[y1,y2,y3,y4,y5]d1=diff(y)=[y2y1,y3y2,y4y3,y5y4
]d2=diff(d1)=[y32y2y1,y42y3y2,y52y4y3]

El vector de los trminos independientes se calcula aplicando dos veces la


funcin diff al vector y de las ordenadas.
Estamos en condiciones de crear un script que calcule las
incgnitas m2, m3, ... mn-1, aplicando el operador divisin por la izquierda.
x=-4:4;
y=sin(x)./(1+x.^2);
h=x(2)-x(1); %espaciado constante
n=length(x); %nmero de pares de datos
A=diag(4*ones(n-2,1))+diag(ones(n-3,1),1)+diag(ones(n-3,1),-1); %matriz
de dimensin n-2
s=diff(diff(y))*6/h^2; %vector de los trminos indpendientes
mm=A\s'; %vector de las incgnitas

m=[0;mm;0]; %ceros en los extremos


for i=1:n-1
a(i)=(m(i+1)-m(i))/(6*h);
b(i)=m(i)/2;
c(i)=(y(i+1)-y(i))/h-(m(i+1)+2*m(i))*h/6;
d(i)=y(i);
end
%dibuja los puntos
hold on
plot(x,y,'o','markersize',4,'markeredgecolor','b','markerfacecolor','b')
for i=1:n-1
xx=x(i):h/50:x(i+1);
yy=a(i)*(xx-x(i)).^3+b(i)*(xx-x(i)).^2+c(i)*(xx-x(i))+d(i);
plot(xx,yy,'r')
end
xx=linspace(-4,4,300); %funcin
yy=sin(xx)./(1+xx.^2);;
plot(xx,yy,'g')
hold off
grid on
xlabel('x')
ylabel('y')
title('Interpolacin por splines')

Si superponemos la funcin (en color verde)


y=sin(x)x2+1y=sin(x)x2+1

con los nueve puntos unidos mediante polinomios de tercer grado (en color
rojo) veremos que la curva interpolada y la exacta estn prximas.

Los puntos de color azul, son los nueve pares de datos, cada una de las curvas
de color rojo entre dos puntos azules consecutivos es un polinomio de tercer
grado que pasa por dichos puntos y cumple las condiciones de continuidad de
su derivada primera y segunda.

Comparacin
Funcin spline de MATLAB
Utilizamos la funcin spline de MATLAB, pero es posible que las condiciones
en los extremos que en el ejemplo anterior se han establecido en m1=0, mn-1=0,
sean ahora diferentes.
x=-4:4;
y=sin(x)./(1+x.^2);
%dibuja los puntos
hold on
plot(x,y,'o','markersize',4,'markeredgecolor','b','markerfacecolor','b')

xx=linspace(-4,4,300);
yy=spline(x,y,xx); %interpolacin
plot(xx,yy, 'r')
yy=sin(xx)./(1+xx.^2);
plot(xx,yy,'g') %funcin
hold off
grid on
xlabel('x')
ylabel('y')
title('Interpolacin por splines de MATLAB')

Interplacin de Lagrange
Ahora interpolamos mediante un polinomio de grado n-1 que pasa por los
nueve puntos (xi,yi) del ejemplo anterior
x=-4:4;
y=sin(x)./(1+x.^2);
%dibuja los puntos
hold on

plot(x,y,'o','markersize',4,'markeredgecolor','b','markerfacecolor','b')
n=length(x);
p=polyfit(x,y,n-1); %polinomio que pasa por los puntos
%p=lagrange_p(x,y); %se obtiene el mismo resultado
xx=linspace(-4,4,300); %superposicin de la curva
yy=polyval(p,xx);
plot(xx,yy, 'r')
yy=sin(xx)./(1+xx.^2);
plot(xx,yy,'g')
hold off
grid on
xlabel('x')
ylabel('y')
title('Interpolacin por Lagrange')

El resultado deja mucho que desear principalmente, en el primer y ltimo


intervalo.

Aproximacin de funciones

Muchas funciones matemticas tales como sin(x), exp(x), se pueden


representar cerca de x=0 por un desarrollo en serie de Taylor. Si el desarrollo
en serie converge rpidamente, tomando los primeros trminos se puede
aproximar la funcinf(x) por un polinomio de grado n no muy elevado.
Tomamos n valores de la funcin yi=f(xi) con i=1...n. y determinamos el
polinomio de grado n-1 que pasa a travs de los puntos (xi,yi). Sea la funcin
y=1x2+1y=1x2+1

Tomamos diez abscisas xi espaciadas 0.8 en el intervalo [-4,4]. Representamos


la funcin (en color rojo), los puntos (xi,yi) y el polinomio que pasa por dichos
puntos (en color azul). Dado que la funcin es simtrica solamente
representamos la parte positiva.
f=@(x) 1./(x.^2+1);
n=10;
a=-4;
b=4;
xx=linspace(a,b,n+1);
yy=f(xx);
p=polyfit(xx,yy,n);
x1=linspace(0,b,100);
y1=polyval(p,x1) %aproximacin mediante el polinomio p
y2=f(x1);
%funcin
hold on
plot(x1,y1,'b')
plot(x1,y2,'r')
plot(xx(xx>=0),yy(xx>=0),'ro','markersize',2,'markerfacecolor','r')
hold off
xlabel('x')
ylabel('y')
title('Interpolacin de una funcin')

Sorprendentemente, si los puntos no estn igualmente espaciados, podemos


obtener una mejor aproximacin. Si tomamos los puntos en el intervalo [a,b]
espaciados de acuerdo a la frmula denominada puntos de Chebyshev, que se
estudiar en la prxima pgina.
xi=a+b2+ab2cos(n(i12))1inxi=a+b2+ab2cos(n(i12))1in

La funcin linspace, nos crea un vector de abscisas xi igualmente espaciados


entre a y b. La funcin que hemos denominado lincheby crea un vector de
abscisas xi, espaciados de acuerdo a la frmula anterior.
f=@(x) 1./(x.^2+1);
lincheby=@(a,b,n) (a+b)/2+(a-b)/2*cos(pi/n*(1/2:n));
n=10;
a=-4;
b=4;
xx=lincheby(a,b,n+1);
yy=f(xx);

p=polyfit(xx,yy,n);
x1=linspace(0,b,100);
y1=polyval(p,x1); %aproximacin mediante el polinomio p
y2=f(x1);
%funcin
hold on
plot(x1,y1,'b')
plot(x1,y2,'r')
plot(xx(xx>=0),yy(xx>=0),'ro','markersize',2,'markerfacecolor','r')
hold off
xlabel('x')
ylabel('y')
title('Interpolacin de una funcin')

Como podemos apreciar la mejora es importante

Vous aimerez peut-être aussi