Ficheros L4 P1 Interpolacion. Miercoles

Transcripción

Ficheros L4 P1 Interpolacion. Miercoles
%---------------------------------------% Curso 2012-2013. Segundo cuatrimestre
% Práctica 1: Problema 1 de la Lección 4.
%----------------------------------------
%--------------------------------------% Apartado (1). Archivo de instrucciones
%--------------------------------------x=[0 1 2 4];
y=[1 2 17 257];
p=difDiv(x,y);
%---------------------------% Apartado (1). Primera forma
%---------------------------function d=difDiv(x,y)
%tabla de diferencias divididas
n=length(x); % #
M=ones(n,n);
%Rellenamos la primera columna con los f(x_i):
M(:,1)=y;
%Las restantes columnas las rellenamos con las diferencias divididas.
%Por ejemplo, en la segunda columna el elemento (2,2) se obtiene a través
%de los elementos de la primera columna de la fila 1 y 2 . Así, el
elemento
%(i,j) se obtiene a partir de los elementos (i,j-1) y (i-1,j-1)
for columna=2:n
for fila=columna:n %para tomar los elementos de la diagonal
M(fila,columna)=(M(fila,columna-1)-M(fila-1,columna1))./(x(fila)-x(fila-columna+1));
end
end
M
d=diag(M)
end
%---------------------------% Apartado (1). Segunda forma
%----------------------------
function d= difDiv (x,y)
%tabla de diferencias divididas
n=length(x); % #
d=y;
for j=1:n-1
for i=j+1:n
daux(i)=(d(i)-d(i-1)) / (x(i)-x(i-j));
end
d(j+1:n)=daux(j+1:n);
end
d
end
%---------------------------% Apartado (1). Tercera forma
%---------------------------%Si empezamos a construir el vector por el final, no necesitamos la
variable auxiliar:
function d=difdiv(x,y)
n=length(x);
for j=2:n
for i=n:-1:j
y(i)=(y(i)-y(i-1))/(x(i)-x(i-j+1));
end
end
d=y;
end
>> apartado1
M =
1.0000
2.0000
17.0000
254.0000
1.0000
1.0000
15.0000
118.5000
1.0000
1.0000
7.0000
34.5000
1.0000
1.0000
1.0000
6.8750
d =
1.0000
1.0000
7.0000
6.8750
%--------------------------------------% Apartado (2). Archivo de instrucciones
%--------------------------------------x=[0 1 2 4];
y=[1 2 17 254];
%p=difDiv(x,y);
%p=dd(x,y);
%p=ddVector(x,y);
s=[-1:3];
p=polintnewton(x,y,s);
%---------------------------% Apartado (2). Primera forma
%---------------------------function sol=polintnewton(x,y,xs)
d=difDiv(x,y);
n=length(x);
m=length(xs);
sol=ones(1,m);
1.0000
1.0000
1.0000
1.0000
v=ones(1,m);
for i=1:m
val=xs(i);
ys=d(1);
for j=2:n
v(j)=v(j-1)*(val-x(j-1));
ys=ys+d(j)*v(j);
end
sol(i)=ys;
end
disp('La solucion es:')
sol
end
%---------------------------% Apartado (2). Segunda forma
%---------------------------function ys=polintnewton(x,y,xs)
d=difDiv(x,y);
n=length(x);
v=ones(size(xs));
ys=d(1)*v; %f(x_o) aparece en todas las evaluaciones
for j=2:n
v=v.*(xs-x(j-1));
ys=ys+d(j)*v;
end
ys
end
>> apartado2
M =
1.0000
2.0000
17.0000
254.0000
1.0000
1.0000
15.0000
118.5000
1.0000
1.0000
7.0000
34.5000
1.0000
1.0000
1.0000
6.8750
1.0000
1.0000
1.0000
1.0000
2.0000
17.0000
87.2500
d =
1.0000
1.0000
7.0000
6.8750
La solucion es:
sol =
-27.2500
%------------% Apartado (3)
%-------------
1.0000
% Aplicación a la tabla del ejercicio 1
x=[-1 2 3];
y=[3 1 2];
xs=-1:0.01:3;
%Va mostrando como va evolucionando
ys=polintnewton(x,y,xs);
figure(1)
plot(xs,ys,x,y,'o');
xlabel('x');ylabel('y');
% Aplicación al ejemplo de Runge
xs=-5:0.01:5;
%Datos de ejemplo de Runge
f=1./(1+xs.^2);
tabla=[];
N=2;% hay 3 nodos
for k=1:7
p=10/N;
x=-5:p:5;
y=1./(1+x.^2);
ys=polintnewtonComp(x,y,xs);
errn=max(abs(f-ys));
%genera el error
figure(k+1)
plot(xs,f,x,y,'o',xs,ys);
xlabel('x');ylabel('y');
legend('Runge','nodos','pol int','Location','Best');
title(['N=',num2str(N)]);
tabla=[tabla;N errn];
N=2*N;
end
figure(k+2)
loglog(tabla(:,1),tabla(:,2),'o-');
xlabel('N');ylabel('error');

Documentos relacionados