You are on page 1of 12

1

UNI FIM (MB536) 2010-3


INTERPOLACION NUMERICA
Profesor: EDGAR RUIZ LIZAMA


Archivo 1:

%Interpolacion de Newton
function [c, T] = polynewton(x,y,n)
% Datos
% x es vector de las x
% y vector de las y
% n es el numero de puntos (puede omitirse en la entrada)
% Resultados
% c es el vector de coeficientes del polinomio interpolador
% T es la Tabla de diferencias divididas de Newton
x = x(:);
y = y(:);
if nargin == 2
n = length(x) - 1;
end
T = y(1:n+1);
for j = 2: n+1 % Filas
for k = 2:j
T(j,k) = (T(j,k-1)-T(j-1,k-1))/(x(j)-x(j-k+1));
end
end
% Los valores de la diagonal en la Tabla son los coeficientes del
% polinomio
c = flipud(diag(T));

Archivo 2:
% Evaluacion del polinomio de Newton por Horner
% Una vez obtenido el polinomio de interpolacion de Newton, debemos
% evaluarlo. Al no estar expresado respecto a la base canonica, NO
%PODEMOS UTILIZAR LA FUNCION polyval. La mejor forma es expresar el
%polinomio en forma anidada; es decir utilizar Horner

function z = pneval(x,c,a)
% Datos
% x es el vector de las x
% c es el vector de coeficientes
% a es un vector que se evalua en c/u de sus componentes
% Resultados
% z es el valor evaluado
n = length(c) - 1;
z = c(1)*ones(size(a));
for k = 1 : n
z = z.*(a-x(n-k+1)) + c(k+1);
end

2

EJEMPLO 1: La tabla adjunta proporciona el nmero de viajeros que suben al metropolitano en
una determinada estacin en la maana.
Hora 8 9 10 11 12 13 14
Viajeros 41 35 21 9 11 17 32

a) Obtener el nmero estimado de viajeros que suben en esa estacin a las 10:30 de la
maana, mediante interpolacin lineal
b) Realizar una estimacin para (a) mediante interpolacin cuadrtica
c) Utilizar el comando polyfit de Matlab para hallar el polinomio de interpolacin de grado 3
y el comando polyval para obtener la estimacin deseada.
d) Sistematizar los clculos utilizando los programas polynewton.m y pneval.m, para obtener
la tabla de diferencias divididas completa,
SOLUCION
a) Para hallar el polinomio de grado 1, () , que nos de la estimacin de
viajeros para x=10.5, tomamos los puntos de interpolacin (10,21) y (11,9), y luego
calculamos la recta que pasa por ellos
P1(10) = 10 a1 + a2 = 21
P2(11) = 11 a1 + a2 = 9

Resolviendo: a1=-12 y a2=141, por lo que el nmero de viajeros estimado a las 10:30 ser:
P1(10.5) = -12*10.5 + 141 = 15
b) Hallaremos el polinomio de interpolacin cuadrtico, ()

,
obtenido a partir de los puntos (10,21), (11,9) y (12,11). El sistema de ecuaciones lineales
para este caso resulta:
(



)(

) (

)
Resolvemos el sistema mediante las siguientes lneas de Matlab
x=8:14;
y=[41 35 21 9 11 17 32];
x2=x(3:5);
y2=y(3:5);
A=vander(x2);
p2=A\y2
con ellos obtenemos la parbola que interpola los puntos
p2 = 7.0000
-159.0000
911.0000
Es decir ()

. Luego la estimacin solicitada con polyval es:


polyval(p2,10.5) = 13.25 viajeros.
3

c) Para hallar polinomios de interpolacin de mayor grado, vamos incorporando los puntos
segn su proximidad a 10.5, donde se requiere la estimacin. Se puede seguir el esquema
anterior, construyendo la matriz de Vandermonde y resolver el sistema asociado.

>> x3=x(2:5);
>> y3=y(2:5);
>> A=vander(x3);
>> p3=A\y3'

p3 =

1.0e+003 *

0.0020
-0.0590
0.5650
-1.7290

Otra alternativa es usar el comando polyfit.

x3 = x(2:5);
y3 = y(2:5);
p3 = polyfit(x3,y3,3)

Obteniendo:
p3 =1.0e+003 *
0.0020 -0.0590 0.5650 -1.7290

Por lo tanto el polinomio es ()

.

Ahora encontramos el nmero de viajeros estimado:

P3(10.5) = 2(10.5)^3-59(10.5)^2+565(10.5)-1729 = 14

Para ver el grafico:

>> plot(x,y), grid on
4




d) Escribimos en Matlab

>> plot(x,y), grid on
>> orden = [3 4 5 2 6 1 7];
>> x = x(orden);
>> y = y(orden);
>> [c,T] = polynewton(x,y)

Siendo los coeficientes del polinomio de Newton

( )

Y la tabla de diferencias divididas

T =

Columns 1 through 5

21.0000 0 0 0 0
5

9.0000 -12.0000 0 0 0
11.0000 2.0000 7.0000 0 0
35.0000 -8.0000 5.0000 2.0000 0
17.0000 -4.5000 3.5000 -0.7500 -0.9167
41.0000 -4.8000 0.3000 0.8000 -0.5167
32.0000 -1.5000 3.3000 0.6000 -0.1000

Columns 6 through 7

0 0
0 0
0 0
0 0
0 0
-0.2000 0
0.1389 0.0847

Ahora evaluamos el polinomio de Newton en 10.5, mediante

>> z = pneval(x,c,10.5)

z =

13.4678


EJEMPLO 2: La solubilidad del cloruro de amonio en el agua toma, a distintas temperatura, los
valores dados en la tabla siguiente:

Temperatura 10 20 30 40 50 60
Solubilidad 33 37 42 46 51 55

a) Elegir los cuatro puntos centrales para hallar el polinomio de interpolacin de grado 3,
obteniendo el nmero de condicin del sistema de ecuaciones lineales asociado.
b) Obtener el mismo polinomio de interpolacin realizando un desplazamiento del origen al
punto medio de las abscisas de interpolacin. Comprobar la mejora del condicionamiento
del sistema.
c) Representar el polinomio hallado junto a los puntos de interpolacin y utilizarlo para
obtener una estimacin de la solubilidad del cloruro de amonio a las temperaturas 25, 35
y 45.



6

SOLUCION

a) El polinomio pedido se obtiene mediante los siguientes comandos

>> x = (10:10:60)';
>> y = [33 37 42 46 51 55];
>> x3 = x(2:5);
>> y3 = y(2:5);
>> A = vander(x3);
>> nro_cond = cond(A)

nro_cond =

3.9175e+006

>> p = A\y3'

p =

0.0003
-0.0350
1.6167
16.0000

El polinomio resultante de grado 3 es:

()



El nmero de condicin es bastante grande por lo que se trata de un sistema mal
condicionado.


b) Vamos a ver si el nmero de condicin mejora, al utilizar otra expresin del polinomio,
realizando un desplazamiento del origen.

>> xm = mean(x3);
>> xd = x3 - xm;
>> Ad = vander(xd); % Ad es la matriz A desplazada
>> nro_cond = cond(Ad)

nro_cond =

3.8229e+003

>> pd = Ad\y3'

pd =

7

0.0003
-0.0000
0.3917
44.0000

Entonces la expresin del polinomio desplazado ser:

() ( )

( )

Se observa que le nmero de condicin se ha reducido en tres rdenes de magnitud,
3.822944x10
3
. Note que para evaluar el polinomio desplazado utilizando la funcin
polyval, tambin ha de desplazarse los puntos donde se realiza la evaluacin.

c) Para representar el polinomio hallado en (b) junto a los puntos de interpolacin,
escribimos:

>> xg = linspace(x(1),x(end));
>> yg = polyval(pd,xg-xm);
>> plot(x,y,'*',xg,yg)

Teniendo en cuenta el desplazamiento de los datos, hallamos las estimaciones pedidas en
las temperaturas 25, 35 y 45.

>> t = polyval(pd,[25,35,45]-xm)

t =

39.7500 44.0000 48.2500

8

EJEMPLO 3: INTERPOLACION DE LAGRANGE
Las diferentes contracciones de un resorte dependiendo de las cargas aplicadas vienen dadas en la
siguiente tabla
Carga (Kg) 5 10 15 20 25
Contraccin(mm) 49 105 172 253 352

a) Escribir el polinomio de lagrange de grado dos para estimar la contraccin producida por una
carga de 13 Kg.
b) Editar una funcin en matlab para evaluar el polinomio de interpolacin de lagrange en un
punto dado a tomado como parmetro de entrada, junto a los puntos de interpolacin y
ejecutarlo para obtener el valor numrico del polinomio anterior en x = 13.
c) Utilice esta funcin de evaluacin para representar el polinomio de interpolacin de Lagrange
de grado 4 y obtener las contracciones del resorte para las cargas 7, 12, 17 y 22.
SOLUCION:
a) Elegimos los tres nodos ms cercanos a x = 13, que son 10, 15, y 20. El polinomio de Lagrange
de grado 2 es:


( )( )
( )( )

( )( )
( )( )

( )( )
( )( )


b) Funcin para Lagrange en Matlab
% Interpolacion de Lagrange
function z = lagrange(x,y,a)
% Valor en a del polinomio de Lagrange determinado por (x,y)
m = length(x);
z = zeros(size(a));
for i = 1:m
Li = 1;
for j = 1:m
if i ~= j
Li = Li*(a-x(j))/(x(i)-x(j));
end
end
z = z + y(i)*Li;
end

Ahora escribimos
9

x= [10 15 20];
y=[105 172 253];
v = lagrange(x,y,13) = 143.5200

c ) Aplicamos Lagrange en los puntos solicitados
y1 = lagrange(x,y,7) = 70.23400
y2 = lagrange(x,y,12) = 130.334400
y3 = lagrange(x,y,17) = 202.518400
y4 = lagrange(x,y,22) = 290.1824

Ahora graficamos mediante los siguientes comandos en Matlab

>> x = [5 10 15 20 25];
>> y = [49 105 172 253 352];
>> xg = linspace(x(1),x(end));
>> yg = lagrange(x,y,xg);

En este punto obtenemos el siguiente mensaje de Matlab

??? Error using ==> mtimes
Inner matrix dimensions must agree.

Error in ==> lagrange at 10
Li = Li*(a-x(j))/(x(i)-x(j));


Vamos a la lnea 10, (que es donde est el error) y la corregimos del siguiente modo:

Li = Li.*(a-x(j))/(x(i)-x(j));

Volvemos a ingresar el comando y luego graficamos

>> yg = lagrange(x,y,xg);
>> plot(x,y,'*',xg,yg)


10





Archivo que imprime la tabla de diferencias divididas de Newton

function p = InterpNewton(x,y,x0)
% Datos
% x es el vector de las x
% y es el vector de las y
% n es el numero de datos o tamao del vector
% x0 es el valor a interpolar
% Resultados
% F es la tabla de diferencias divididas finitas
% p es el valor interpolado obtenido por el metodo de Newton
n = length(x);
F = zeros(n,n);
for i = 1:n
F(i,1) = y(i);
end
for j = 2:n
k = j - 1;
for i = 1:n+1-j
F(i,j)=(F(i+1,k)-F(i,k))/(x(i+j-1)-x(i));
end
end
prod = 1;
suma = 0;
for j = 1:n
suma = suma + F(1,j)*prod;
prod = prod*(x0-x(j));
end
% Imprimiendo la tabla
fprintf('\n\tx\t\tF[x]\t\tDiferencias divididas\n');
fprintf('===========');
11

for j = 1 : n
fprintf('==========');
end
fprintf('\n');
for i = 1:n
fprintf('%10.6f',x(i));
for j = 1:n+1-i
fprintf('%10.6f',F(i,j));
end
fprintf('\n');
end
p= suma; % Valor interpolado


Para los datos del ejemplo 2, se tiene:

>> InterpNewton(x,y,35)

x F[x] Diferencias divididas
=======================================================================
10.000000 33.000000 0.400000 0.005000 -0.000333 0.000017 -0.000001
20.000000 37.000000 0.500000 -0.005000 0.000333 -0.000017
30.000000 42.000000 0.400000 0.005000 -0.000333
40.000000 46.000000 0.500000 -0.005000
50.000000 51.000000 0.400000
60.000000 55.000000

ans =

44




Archivo que imprime la tabla de Lagrange


function p = InterpLagrange(x,y,x0)
% Datos
% x es el vector de las x
% y es el vector de las y
% n es el numero de datos o tamao del vectos
% x0 es el valor a interpolar
% Resultados
% L es es el polinomio de Lagrange
% p es el valor interpolado obtenido por el metodo de Lagrange
n = length(x);
L = zeros(n,1);
fprintf('\tk\t\tx\t\t\ty\t\t\tL\n');
for k = 1:n
prod1 = 1;
prod2 = 1;
12

for i = 1 : n
if i ~= k
prod1 = prod1*(x0-x(i));
prod2 = prod2*(x(k)-x(i));
end
end
L(k) = prod1/prod2;
end
% Imprimiendo la tabla
p = 0;
for k = 1 : n
p = p + L(k)*y(k);
fprintf('%5d%12.6f%12.6f%12.6f\n',k,x(k),y(k),L(k));
end


Para los datos del ejemplo 2, se tiene:

>> InterpLagrange(x,y,45)
k x y L
1 10.000000 33.000000 -0.011719
2 20.000000 37.000000 0.082031
3 30.000000 42.000000 -0.273438
4 40.000000 46.000000 0.820313
5 50.000000 51.000000 0.410156
6 60.000000 55.000000 -0.027344

ans =

48.3125


05 de Febrero de 2011

You might also like