Professional Documents
Culture Documents
Departamento de Matemtica
Laboratorio de Computacin para las Aplicaciones de la Matemtica en
Ingeniera
cd d:
for conta=1:2
func='function y=lagrange(x,pointx,pointy)\n%\n%LAGRANGE
approx a point-defined
function
using
the
Lagrange
polynomial
interpolation\n%\n%
LAGRANGE(X,POINTX,POINTY)
approx
the
function
definited
by
the
points:\n%
P1=(POINTX(1),POINTY(1)), P2=(POINTX(2),POINTY(2)), ..., PN(POINTX(N),POINTY(N))\n%
and calculate it in each elements of X\n%\n%
If POINTX and POINTY have
different number of elements the function will return the NaN value\n%\n%
function
wrote
by:
Calzino\n%
7-oct-2001\n
%\nn=size(pointx,2);\nL=ones(n,size(x,2));\nif
(size(pointx,2)~=size(pointy,2))\n
y=NaN;\nelse\n
for i=1:n\n
for j=1:n\n
if (i~=j)\n
L(i,:)=L(i,:).*(x-pointx(j))/(pointx(i)-pointx(j));\n
end\n
end\n
end\n
y=0;\n
for i=1:n\n
y=y+pointy(i)*L(i,:);\n
end\nend\n';
a='lagrange.m';
if (~exist(a,'file')),
fid=fopen(a,'w');
func = strrep(func,'%','%%');
fprintf(fid,func);
fclose(fid);
disp('La funcion ha sido creada')
end
end
help lagrange
Generemos una lista ms o menos grande para despus interpolarla con el comando. La lista ser una
muestra de la funcin de Bessel J3(5x) en el intervalo [0, ] .
a = 0;
b = pi;
n = 20;
h = (b-a)/n;
x = a:h:b;
y = besselj(3,5*x);
xx = a:0.01:b;
yy = besselj(3,5*xx);
figure(1);
subplot(2,1,1), plot(x,y,'ro'); grid on;
subplot(2,1,2), plot(xx,yy,'b'); grid on;
xi x j
en que i j .
for i=1:n+1,
[base(i,:),aux1]=lagrange2(x(i),x);
end
disp('Listo')
Ahora construimos una funcin que evalua la tabla en x= t y despus suma estos valores.
function [res lag]=ww(t,x,y)
for i=1:length(t),
lag = y.*lagrange2(t(i),x);
res(i)=sum(lag);
end
for conta=1:2
func='function
res=ww(t,x,y)\n\nfor
i=1:length(t),\n
y.*lagrange2(t(i),x);\n
res(i)=sum(lag);\nend\n';
a='ww.m';
if (~exist(a,'file')),
fid=fopen(a,'w');
func = strrep(func,'%','%%');
fprintf(fid,func);
fclose(fid);
disp('La funcion ha sido creada')
end
end
Uno estara tentado a generar primero el polinomio, darle su forma usual y despues evaluarlo.
lag
Lo graficamos:
lambda(1,1)=y(1);
x1=x;
y1=y;
temp=double(vpa(y,3));
x=double(vpa(x,3));
for j=1:length(x)-1
for i=1:length(x)-j
temp(i)=(temp(i+1)-temp(i))/(x(i+j)-x(i));
end
lambda(j+1,1)=temp(1);
end
syms t
phi=1;
temp=0;
for j=1:length(lambda)
temp=phi*lambda(j,1)+temp;
phi=phi*(t-x(j));
end
pol=simplify(temp);
clf
figure(1)
hold on
ezplot(pol,[min(x) max(x)])
plot(x1,y1,'ro');
La combinacin de coeficientes con aritmtica simple provoca un error enorme. Si esto se hiciera
con precisin infinita dara exacto.
Ejercicio.
Ejercicio.
La distribucin de Temperaturas de una plancha de cemento, en funcin del tiempo , est
representada por los pares ordenados {t, T},mostrados a continuacin:
datos={{1800.,117.361},{3600.,120.198},{5400.,123.975},{7200.,127.532},{9000,130.649},
{10800.,133.341},{12600.,135.673},{14400.,137.708},{16200.,139.498},{18000.,141.086},
{19800.,142.506},{21600.,143.785},{23400.,144.943},{25200.,145.999},{27000.,146.966},
{28800.,147.856},{30600.,148.678},{32400.,149.441}}
Donde t es el tiempo medido en segundos [s], y
T es la Temperatura medida en [C] .
Encuentre el polinomio de Lagrange que interpola la tabla anterior.
Generamos una lista mas o menos grande para despues interpolarla con elcomando. Pero esta vez la lista
1
ser una muestra de la funcin de Runge y =
en el intervalo [-1,1]. Veamos lo que ocurre.
1 + 25 x 2
clear
a = -1;
b = 1;
n = 20;
h = (b - a)/n;
x=[a:h:b];
y=1./(1+25*x.^2);
runge = inline('1/(1+25*x^2)');
clf;
figure(1);
subplot(2,1,1), plot(x,y,'ro'); grid on;
title('Grfico de la Tabla'); xlabel('x'); ylabel('y');
subplot(2,1,2), fplot(runge,[-1 1]); grid on;
title('Grfico de la Funcin Runge'); xlabel('x'); ylabel('y');
Vemos que aparecen grandes oscilaciones (inestabilidades numricas) en los extremos del intervalo.
xlabel('x');
Conclusin:
Se termina la oscilacin en los extremos, los autores de ese texto indican que el
error tiende a cero cuando el nmero de puntos tiende al infinito. Qu paso?, lo ver en
los contenidos del curso ms adelante.
Ejercicio.
El fenmeno puede observarlo para una gran variedad de curvas del mismo tipo
y que se dan en la prctica.
Por ejemplo tome una curva:
x2
1
0.15
clear
n = 15;
i = 1:n;
z=[0.5*i' sin(0.5*i')]
figure(1);
plot(z(:,1), z(:,2),'bo'); grid on;
title('Grfica de la tabla'); xlabel('x'); ylabel('y');
Ahora se define una funcin que da las diferencias dividadas de primer orden.
Esto es lo que en teora se denota como f [ x i , x i ] .
Evaluemos en i=1, j=2:
d=inline('(z(i,2)-z(j,2))/(z(i,1)-z(j,1))','i','j','z')
temp=d(1,2,z)
p1=inline('z(1,2)+temp*(x-z(1,1))','x','z','temp')
temp=d(1,2,z)
[b p1(b,z,temp)]
[z(3,1) p2(z(3,1),z,temp)]
Tracemos:
dib1 = [z(1,1) p1(z(1,1),z,d(1,2,z));z(2,1) p1(z(2,1),z,d(1,2,z))];
dib2 = [z(2,1) p2(z(2,1),z,d(2,3,z)); z(3,1) p2(z(3,1),z,d(2,3,z))];
figure(1);
subplot(2,1,1), plot(dib1(:,1), dib1(:,2)); grid on;
title('Grfica de p2(x)'); xlabel('x'); ylabel('p2(x)');
Las siguientes lneas de cdigo calculan la interpolante polinomial correspondientes a la tabla formada de
las interpolantes lineales en intervalos sucesivos.
Para esto, se calcula la recta que interpola cada sub intervalo y en base a esta se calculan los puntos
intermedios en los puntos xi ,xi + h,xi + 2h, , xi +1 .
Calculemos la interpolante polinomial lineal correspondiente a la tabla y luego grafiqumoslo.
h=0.01;
for i=1:length(z)-1,
xj=z(i,1):h:z(i+1,1);
for j=0:length(xj)-1,
yi((length(xj)-1)*(i-1)+j+1)=z(i,2)+d(i,i+1,z)*(xj(j+1)-z(i,1));
end
end
disp('Listo')
xi = z(1,1):h:z(length(z),1);
figure(1);
plot(xi,yi,z(:,1),z(:,2),'r.'); grid on;
title('Tabla Interpolada y puntos de la tabla');
xlabel('x'); ylabel('y');
Ahora calculemos todas las diferencias divididas de orden superior.Las diferencias de primer orden:
for i=1:n-1,
di(i,1)=d(i,i+1,z);
end
di(:,1)
for j=1:n-1,
for i=1:n-j,
A(2*i+j-1,j+2)=di(i,j);
end
end
disp('Listo')
De acuerdo con la frmula que se ve en teora, las diferencias en la diagonal superior permiten calcular
los polinomios de interpolacin de orden a lo ms n 1
f=di(1,:)'
sin(4.7)
clear t aux
Excelente resultado
Grafico del polinomio de interpolacin y superposicin sobre el grfico.
x=0:0.1:7.5;
n=length(x);
m=length(f);
for i=1:n,
t(1:2)=[z(1,2) f(1)*(x(i)-z(1,1))];
for j=2:m,
for k=1:j,
aux(k)=(x(i)-z(k,1));
end
t(j+1)=f(j)*prod(aux);
end
clear aux
y1(i)=sum(t);
clear t aux;
end
disp('Listo')
figure(1);
plot(x,y1,z(:,1),z(:,2),'ro'); grid on;
title('Grafico polinomio de interpolacin y puntos de la tabla');
xlabel('x'); ylabel('y');
Ejercicio
En lugar de la funcin sin(x) observe el mismo fenmeno con otras funciones: cos(x), exp(x), sqrt(x),
Bessel, etc. Puede tomar ms puntos y mirar.
Ejercicio
Intente integrar la funcin integrando la polinomial lineal por tramos y despues la polinomial cuadrtica
por tramos. Observe que estas polinomiales no son diferenciables en la unin de los tramos.
i xi y i y i'
0 1 2 1
1 2 1 -1
Sugerencia:
Emplear la frmula en diferencias divididas del polinomio de Hermite. En este caso:
p ( x ) = 2 + 1 ( x x 0 ) + f [ x 0 , x 0 , x1 ]( x x 0 ) + f [ x0 , x 0 , x1 , x1 ]( x x 0 ) ( x x1 )
2
Polinomial Diferenicable
Con una interpolante cbica por tramos podemos generar unapolinomial cbica que interpola la tabla y
que sea diferenciable.
Primero generamos una tabla, en este caso de los valores de seno y su derivada entre [0.5,7.5]
clear
n = 15;
i = 1:n;
z = [0.5*i' sin(0.5*i')];
dz = [0.5*i' cos(0.5*i')];
clf;
figure(1);
plot(z(:,1), z(:,2),'o'); grid on;
title('Grfica de la tabla'); xlabel('x'); ylabel('y');
Para calcular la polinomial de Hermite cbica necesitamos calcular las diferencias de primer orden entre
abcisas consecutivas y alternarlos con los valores de la derivada para lograr:
usando para
ello la tabla
anterior.
lar = length(d);
for i=1:lar-1,
aux(i)=d(i+1,1)-d(i,1);
end
k=0;
for i=1:n-1,
div=z(i+1,1) - z(i,1);
k = k + 1;
d(2*i-1,2)=aux(k)/div;
k = k + 1;
d(2*i,2)=aux(k)/div;
end
d(:,2)
k=0;
for i=1:length(z)-1,
k = k + 1;
d(i,3)=(d(2*i,2) - d(2*i-1,2))/(z(k+1,1) - z(k,1));
end
d(:,3 )
Ahora se forma la polinomial. Mostremos los dos primeros tramos en forma explcita:
x1 = z(1,1):0.01:z(2,1);
p1 = z(1,2) + d(1,1)*(x1 - z(1,1)) + d(1,2)*(x1 - z(1,1)).^2 +
z(1,1)).^2.*(x1 - z(2,1));
x2 = z(2,1):0.01:z(3,1);
p2 = z(2,2) + d(3,1)*(x2 - z(2,1)) + d(3,2)*(x2 - z(2,1)).^2 +
z(2,1)).^2.*(x2 - z(3,1));
clf;
figure(1);
subplot(1,2,1), plot(x1,p1); grid on;
title('Primer tramo de la interpolacin'); xlabel('x'); ylabel('y');
subplot(1,2,2), plot(x2,p2); grid on;
title('Segundo tramo de la interpolacin'); xlabel('x'); ylabel('y');
d(1,3)*(x1
d(3,3)*(x2
x1 = z(2,1);
p1 = z(1,2) + d(1,1)*(x1
z(1,1)).^2.*(x1 - z(2,1));
[p1 z(2,2)]
z(1,1))
d(1,2)*(x1
z(1,1)).^2
d(1,3)*(x1
h=0.1;
j=-1;
k=0;
n=length(z);
for i=1:n-1,
k = k + 1;
j = j + 2;
x=z(i,1):h:z(i+1,1);
m=length(x);
for ind=0:m-1,
yi((m-1)*(i-1)+ind+1)=z(k,2)+d(j,1)*(x(ind+1)-z(k, 1))+d(j,2)*(x(ind+1)-z(k,
1)).^2 + d(k,3)*(x(ind+1) - z(k, 1)).^2.*(x(ind+1) - z(k+1,1));
end
end
xi = z(1,1):h:z(n,1);
figure(1);
plot(xi,yi,z(:,1),z(:,2),'or'); grid on;
title('Grfica del polinomio de interpolacin'); xlabel('x'); ylabel('y');
Lo interesante es el hecho que la polinomial es derivable (notese que est definida por tramos) y que su
derivada es una polinomial que interpola la derivada de la funcin sen(x), que es de donde se sac la
muestra que esta en la tabla dz.
Ejercicio
Adecuando el estudio anterior trate de construir interpolantes para otras funciones
y sus derivadas.
Ejercicio
Trate de construir para una tabla para tres abcisas, tres ordenadas, tres pendientes el
polinomio de interpolacin de grado 5 que interpola la tabla.
(Respuesta: 0.00017872)