Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Interpolación
Es importante diferenciar entre interpolación y la regresión.
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')
%regresión
p=polyfit(x,y,2); %polinomio de segundo grado
z=@(xx) polyval(p,xx);
fplot(z,[x(1),x(end)])
%interpolación
z=@(xx) spline(x,y,xx);
fplot(z,[x(1),x(end)])
hold off
grid on
legend('datos','regresión','interpolación')
xlabel('x')
ylabel('y');
title('Interpolación, regresión')
www.sc.ehu.es/sbweb/fisica3/datos/regresion/interpolacion.html 1/17
27/8/2019 Interpolación
Interpolación lineal
La interpolación lineal es muy sencilla. Disponemos de
pares de datos (xk,yk) k=1,2...n. Queremos conocer el
valor de y para 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 ecuación es
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 función para interpolar linealmente los siguientes pares de datos (0,0), (π/3,
sin(π/3)), (2π/3, sin(2π/3)),(π, 0). Comprobamos que obtenemos los mismos resultado
utilizando la función MATLAB interp1, pasándole la opción linear en el último parámetro.
x=0:pi/3:pi; %datos
y=sin(x);
x0=[pi/6,pi/2,5*pi/6]; %interpolación lineal
y0=interpola_lineal(x,y,x0);
www.sc.ehu.es/sbweb/fisica3/datos/regresion/interpolacion.html 2/17
27/8/2019 Interpolación
%y0=interp1(x,y,x0,'linear'); %esta es una función MATLAB
hold on
fplot('sin(x)',[0,pi])
plot(x,y)
plot(x,y,'bo','markersize',3,'markerfacecolor','b')
plot(x0,y0,'ro','markersize',4,'markerfacecolor','r')
set(gca,'XTick',0:pi/6:pi)
set(gca,'XTickLabel',{'0','\pi/6','\pi/3','\pi/2','2\pi/3','5\pi/6','\pi'})
hold off
grid on
xlabel('x');
ylabel('y')
title('Interpolación lineal')
⎨
3 2
⎪ a1 x + a2 x + a3 x 3 + a4 = y3
⎪ 3 3
⎪
⎪
⎩
⎪ 3 2
a1 x + a2 x + a3 x 4 + a4 = y4
4 4
3 2
x x x1 1
1 1 a1 y1
⎛ ⎞
⎛ ⎞ ⎛ ⎞
3 2
⎜ x2 x x2 1⎟ a2 ⎜ y2 ⎟
⎟⎜ ⎟
2
⎜
⎜ 3 ⎟⎜ ⎟ = ⎜
⎜
⎟
⎟
2
⎜x x x3 1 ⎟ ⎜ a3 ⎟ ⎜ y3 ⎟
⎜ 3 3 ⎟
⎝ ⎠ ⎝ ⎠
⎝ 3 2 ⎠ a4 y4
x x x4 1
4 4
www.sc.ehu.es/sbweb/fisica3/datos/regresion/interpolacion.html 3/17
27/8/2019 Interpolación
x=[0,pi/3,2*pi/3,pi]; %datos
y=sin(x);
xx=0:pi/90:pi; %función
yy=sin(xx);
x0=[pi/6,pi/2,5*pi/6]; %interpolación lineal
A=vander(x);
p=A\y'; %coeficientes del polinomio
hold on
fplot('sin(x)',[0,pi]) % función
plot(x,y,'bo','markersize',3,'markerfacecolor','b')
z=@(xx) polyval(p,xx); %polinomio
fplot(z,[0,pi])
y0=polyval(p,x0); %valores interpolados
plot(x0,y0,'ro','markersize',4,'markerfacecolor','r')
set(gca,'XTick',0:pi/6:pi)
set(gca,'XTickLabel',{'0','\pi/6','\pi/3','\pi/2','2\pi/3','5\pi/6','\pi'})
hold off
xlabel('x');
ylabel('y')
grid on
title('Interpolación con un polinomio de tercer gardo')
Interpolación 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:
www.sc.ehu.es/sbweb/fisica3/datos/regresion/interpolacion.html 4/17
27/8/2019 Interpolación
N N −1
⎧ a1 x + a2 x + aN x1 + aN +1 = y1
⎪ 1 1
⎪
⎪
⎪
⎪ N N −1
a1 x + a2 x + aN x2 + aN +1 = y2
2 2
⎨
⎪ .....
⎪
⎪
⎪
⎩
⎪ N N −1
a1 x + a2 x + aN xN +1 + aN +1 = yN +1
N +1 N +1
En forma matricial
N N −1
x x ... x1 1 y1
⎛ 1 1 ⎞ a1
⎛ ⎞ ⎛ ⎞
N N −1
⎜ x x ... x2 1 ⎟⎜ a2 ⎟ y2
⎜ 2 2 ⎟⎜ ⎜ ⎟
⎟ = ⎜ ⎟
⎜ ⎟⎜ ⎟ ⎜ ⎟
⎜ ... ... ... ... ... ⎟ ⎜ ... ⎟ ⎜ ... ⎟
⎜ ⎟
⎝ ⎠ ⎝ ⎠
⎝ xN x
N −1
... xN +1 1 ⎠ aN +1 yN +1
N +1 N +1
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
Los valores del polinomio se puede obtener también utilizando la función polyfit que
emplearemos más adelante en el ajuste por el procedimiento de mínimos 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); %número de pares de datos
%A=vander(x);
A=zeros(n); %líneas 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 = 1.0e+04 *
0.0000 -0.0003 0.0057 -0.0595 0.3782 -1.4951 3.6430 -5.2142 3.9256 -1.1823
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 función lagrange_3 para conocer los valores interpolados de xx=1.0 y xx=2.0
>> 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)
yy = 10.0725
>> yy=lagrange_3(x,y,2.0)
yy = -203.7000
www.sc.ehu.es/sbweb/fisica3/datos/regresion/interpolacion.html 6/17
27/8/2019 Interpolación
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)
%multiplica un polinomio por un binomio
pol=conv([1 -x(j)],pol)/(x(i)-x(j));
end
end
p=p+pol;
end
end
Para obtener el producto de los binomios del numerador de cada término, utilizamos la función
conv, véase la página Polinomios. Por ejemplo, queremos multiplicar los polinomios p1=x3-2x-
4 y p2=x2+3x+4
Utilizamos la función 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 3.6430 -5.2142 3.9256 -1.1823
Una vez obtenido el polinomio de Lagrange calculamos el valor de y para valores de x que no
están en la tabla.
Comparación
Como vamos a apreciar, la interpolación de Lagrange es un interesante ejercicio de
programación, pero no poduce buenos resultados. Para probarlo, vamos a tomar nueve puntos
de una función igualmente espaciados y vamos a comparar la gráfica de la función y la
interpolación de los nueve puntos por el procedimiento de Lagrange. En la siguiente sección,
explicamos un procedimiento mucho más exacto, los splines
www.sc.ehu.es/sbweb/fisica3/datos/regresion/interpolacion.html 7/17
27/8/2019 Interpolación
sin(x)
y =
2
x + 1
Ahora interpolamos mediante un polinomio de grado n-1 (ocho) que pasa por los n (nueve)
puntos (xi,yi)
x=-4:4;
f=@(x) sin(x)/(1+x^2);
%dibuja los puntos
hold on
plot(x,y,'bo','markersize',3,'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
z=@(xx) polyval(p,xx);
fplot(z,[-4,4],'r')
fplot(f,[-4,4])
hold off
grid on
xlabel('x')
ylabel('y')
legend('función','interpolación')
title('Interpolación por Lagrange')
Splines
Vamos a explicar mediante un ejemplo el procedimiento de interpolación denominado
"splines", para generalizarlo después a cualquier conjunto de pares de datos.
www.sc.ehu.es/sbweb/fisica3/datos/regresion/interpolacion.html 8/17
27/8/2019 Interpolación
Dado el conjunto de pares de datos (x1,y1), (x2,y2), (x3,y3), (x4,y4), (x5,y5) puntos de color
rojo en la figura. Definimos la función S(x)
⎧ s1 (x) x1 ≤ x < x2
⎪
⎪
⎪
⎪
s2 (x) x2 ≤ x < x3
S(x) = ⎨
⎪ s3 (x) x3 ≤ x < x4
⎪
⎪
⎩
⎪
s4 (x) x4 ≤ x < x5
3 2
si (x) = ai (x − xi ) + bi (x − xi ) + ci (x − xi ) + di i = 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
dsi 2
= 3ai (x − xi ) + 2bi (x − xi ) + ci
dx
2
d si
2
= 6ai (x − xi ) + 2bi
dx
i = 1,2,3,4
si (xi ) = yi ⎨ d3 = y3
⎪
⎪
⎪ d4 = y4
⎪
⎪
⎪
⎩
⎪ 3 2
a4 (x5 − x4 ) + b4 (x5 − x4 ) + c4 (x5 − x4 ) + d4 = y5
www.sc.ehu.es/sbweb/fisica3/datos/regresion/interpolacion.html 9/17
27/8/2019 Interpolación
2
⎧ 3a1 (x2 − x1 ) + 2b1 (x2 − x1 ) + c1 = c2
⎪
⎪
2
s'i−1 (xi ) = s'i (xi )⎨ 3a2 (x3 − x2 ) + 2b2 (x3 − x2 ) + c2 = c3
⎪
⎩
⎪ 2
3a3 (x4 − x3 ) + 2b3 (x4 − x3 ) + 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.
2b1 = m1
⎧
⎪
⎪
⎪ 2b2 = m2
⎪
⎪
⎪
⎪
s''i (xi ) = mi 2b3 = m3
⎨
⎪
⎪ 2b4 = m4
⎪
⎪
⎪
⎪
⎩
⎪
6a4 (x5 − x4 ) + 2b4 = m5
De (4) y (5) expresamos a1,a2, a3, a4 en términos de m1, m2, m3, m4, m5.
m2 − m1 m3 − m2 m4 − m3 m5 − m4
a1 = a2 = a3 = a4 =
6h 6h 6h 6h
Que nos permite despejar c1, c2, c3 en términos de m1, m2, m3, m4, y1, y2, y3, y4
y2 −y1 m2 +2m1
c1 = − h
h 6
y3 −y2 m3 +2m2
c2 = − h
h 6
y4 −y3 m4 +2m3
c3 = − h
h 6
y5 −y4 m5 +2m4
c4 = − h
h 6
www.sc.ehu.es/sbweb/fisica3/datos/regresion/interpolacion.html 10/17
27/8/2019 Interpolación
⎪
⎪
⎪
⎩
⎪ m4 −m3 2
y4 −y3 m4 +2m3 y5 −y4 m5 +2m4
3 h + m3 h + − h = − h
6h h 6 h 6
6
⎧ m1 + 4m2 + m3 = (y1 − 2y2 + y3 )
⎪
⎪ h2
⎪
⎪
6
⎨ m2 + 4m3 + m4 = h2
(y2 − 2y3 + y4 )
⎪
⎪
⎪
⎩
⎪ 6
m3 + 4m4 + m5 = (y3 − 2y4 + y5 )
h2
Fijamos los valores de la derivada segunda m1 y m5 en los puntos extremos. Supongamos que
m1=0 y m5=0.
⎪
⎪
⎪
⎩
⎪ 6
m3 + 4m4 + m5 = (y3 − 2y4 + y5 )
h2
4 1 0 m2 y1 − 2y2 + y3
⎛ ⎞⎛ ⎞ ⎛ ⎞
6
⎜1 4 1 ⎟ ⎜ m3 ⎟ = ⎜ y2 − 2y3 + y4 ⎟
h2
⎝ ⎠⎝ ⎠ ⎝ ⎠
0 1 4 m4 y3 − 2y4 + y5
Caso general
En general, con n pares de datos tendremos el sistema
4 1 0 0 ... 0 m2 y1 − 2y2 + y3
⎛ ⎞
⎛ ⎞⎛ ⎞
1 4 1 0 ... 0 m3 ⎜ y2 − 2y3 + y4 ⎟
⎜ ⎟ ⎜ ⎟ ⎜ ⎟
⎜ ⎟ ⎜ ⎟ ⎜ ⎟
⎜ 0 1 4 1 ... 0 ⎟ ⎜ m4 ⎟ 6 ⎜ y3 − 2y4 + y5 ⎟
⎜ ⎟ ⎜ ⎟ = ⎜ ⎟
⎜ ⎟ ⎜ ⎟
⎜ 0 0 1 4 ... 0 ⎟ ⎜ m5 ⎟ h
2 ⎜ y4 − 2y5 + y6 ⎟
⎜ ⎟ ⎜ ⎟ ⎜ ⎟
⎜ ⎟ ⎜ ⎟ ⎜ ⎟
⎜ .... ... ... ... ... ... ⎟ ⎜ ... ⎟ ⎜ .... ⎟
⎝ ⎠⎝ ⎠ ⎝ ⎠
0 0 0 ... 1 4 mn−1 yn−2 − 2yn−1 + yn
Fijamos los valores de los extremos del vector de las incógnitas m: m1=0, mn-1=0, a
continuación, obtenemos mediante el operador división por la izquierda los valores de m2, m3,
...mn-2, finalmente, se calculan:
m2 − m1 m3 − m2 m4 − m3 mn − mn−1
a1 = a2 = a3 = .... an−1 =
6h 6h 6h 6h
y3 −y2 m3 +2m2
c2 = − h
h 6
y4 −y3 m4 +2m3
c3 = − h
h 6
.....
yn −yn−1 mn +2mn−1
cn−1 = − h
h 6
d1 = y1 d2 = y2 d3 = y3 .... dn−1 = yn−1
Codificación
En primer lugar, vamos a entender como trabaja la función diag de MATLAB. La función 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 función 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 función diff calcula la diferencia entre dos elementos consecutivos del vector y
y = [y1 , y2 , y3 , y4 , y5 ]
El vector de los términos independientes se calcula aplicando dos veces la función diff al vector
y de las ordenadas.
www.sc.ehu.es/sbweb/fisica3/datos/regresion/interpolacion.html 12/17
27/8/2019 Interpolación
Estamos en condiciones de crear un script que calcule las incógnitas m2, m3, ... mn-1,
aplicando el operador división por la izquierda.
sin(x)
y =
2
x + 1
x=-4:4;
f=@(x) sin(x)./(1+x.^2);
y=f(x);
h=x(2)-x(1); %espaciado constante
hold on
plot(x,y,'bo','markersize',3,'markeredgecolor','b','markerfacecolor','b')
for i=1:n-1
z=@(xx) a(i)*(xx-x(i)).^3+b(i)*(xx-x(i)).^2+c(i)*(xx-x(i))+d(i);
fplot(z,[x(i),x(i+1)],'r')
end
fplot(f,[-4,4])
hold off
grid on
xlabel('x')
ylabel('y')
legend('función','interpolación')
title('Interpolación por splines')
con los nueve puntos unidos mediante polinomios de tercer grado vemos que la curva
interpolada y la exacta están próximas.
www.sc.ehu.es/sbweb/fisica3/datos/regresion/interpolacion.html 13/17
27/8/2019 Interpolación
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.
x=-4:4;
f=@(x) sin(x)./(1+x.^2);
y=f(x);
%dibuja los puntos
hold on
plot(x,y,'bo','markersize',3,'markeredgecolor','b','markerfacecolor','b')
www.sc.ehu.es/sbweb/fisica3/datos/regresion/interpolacion.html 14/17
27/8/2019 Interpolación
Comparando ambas gráficas, vemos que el resultado que hemos obtenido creando nuestra
propia función spline y utilizando la función spline de MATLAB es muy parecido
1
y =
2
x + 1
Tomamos diez abscisas xi espaciadas 0.8 en el intervalo [-4,4]. Representamos la función (en
color rojo), los puntos (xi,yi) y el polinomio que pasa por dichos puntos (en color azul). Dado
que la función es simétrica 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); %aproximación mediante el polinomio p
www.sc.ehu.es/sbweb/fisica3/datos/regresion/interpolacion.html 15/17
27/8/2019 Interpolación
y2=f(x1); %función
hold on
plot(x1,y1,'b')
plot(x1,y2,'r')
plot(xx(xx>=0),yy(xx>=0),'ro','markersize',3,'markerfacecolor','r')
hold off
xlabel('x')
ylabel('y')
title('Aproximación de una función')
a + b a − b π 1
xi = + cos ( (i − )) 1 ≤ i ≤ n
2 2 n 2
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); %aproximación mediante el polinomio p
www.sc.ehu.es/sbweb/fisica3/datos/regresion/interpolacion.html 16/17
27/8/2019 Interpolación
y2=f(x1); %función
hold on
plot(x1,y1,'b')
plot(x1,y2,'r')
plot(xx(xx>=0),yy(xx>=0),'ro','markersize',3,'markerfacecolor','r')
hold off
xlabel('x')
ylabel('y')
title('Aproximación de una función')
www.sc.ehu.es/sbweb/fisica3/datos/regresion/interpolacion.html 17/17