Professional Documents
Culture Documents
,
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 ()
.
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