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');