interpolacion metodos numericos

Upload: peter-pittman

Post on 02-Mar-2016

20 views

Category:

Documents


0 download

TRANSCRIPT

12

UNI FIM (MB536)2010-3INTERPOLACION NUMERICAProfesor: EDGAR RUIZ LIZAMA

Archivo 1:

%Interpolacion de Newtonfunction [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 Newtonx = x(:);y = y(:);if nargin == 2 n = length(x) - 1;endT = 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)); endend% Los valores de la diagonal en la Tabla son los coeficientes del% polinomioc = 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 evaluadon = length(c) - 1;z = c(1)*ones(size(a));for k = 1 : n z = z.*(a-x(n-k+1)) + c(k+1);end

EJEMPLO 1: La tabla adjunta proporciona el nmero de viajeros que suben al metropolitano en una determinada estacin en la maana.Hora891011121314

Viajeros4135219111732

a) Obtener el nmero estimado de viajeros que suben en esa estacin a las 10:30 de la maana, mediante interpolacin linealb) Realizar una estimacin para (a) mediante interpolacin cuadrticac) 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, SOLUCIONa) 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 ellosP1(10) = 10 a1 + a2 = 21P2(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 = 15b) 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 Matlabx=8:14; y=[41 35 21 9 11 17 32];x2=x(3:5);y2=y(3:5); A=vander(x2); p2=A\y2con ellos obtenemos la parbola que interpola los puntosp2 = 7.0000 -159.0000 911.0000Es decir . Luego la estimacin solicitada con polyval es:polyval(p2,10.5) = 13.25 viajeros.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

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 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:

Temperatura102030405060

Solubilidad333742465155

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.

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 =

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.822944x103. 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

EJEMPLO 3: INTERPOLACION DE LAGRANGELas diferentes contracciones de un resorte dependiendo de las cargas aplicadas vienen dadas en la siguiente tablaCarga (Kg)510152025

Contraccin(mm)49105172253352

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 Lagrangefunction 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 x= [10 15 20]; y=[105 172 253]; v = lagrange(x,y,13) = 143.5200

c ) Aplicamos Lagrange en los puntos solicitadosy1 = lagrange(x,y,7) = 70.23400y2 = lagrange(x,y,12) = 130.334400y3 = lagrange(x,y,17) = 202.518400y4 = lagrange(x,y,22) = 290.1824Ahora 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 ==> mtimesInner 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)

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 Newtonn = length(x);F = zeros(n,n);for i = 1:n F(i,1) = y(i);endfor 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)); endendprod = 1;suma = 0;for j = 1:n suma = suma + F(1,j)*prod; prod = prod*(x0-x(j));end% Imprimiendo la tablafprintf('\n\tx\t\tF[x]\t\tDiferencias divididas\n');fprintf('===========');for j = 1 : n fprintf('==========');endfprintf('\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');endp= suma; % Valor interpolado

Para los datos del ejemplo 2, se tiene:

>> InterpNewton(x,y,35)

xF[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 Lagrangen = 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; 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 tablap = 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) kxy 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