Вы находитесь на странице: 1из 6

http://www.unavarra.es/personal/victor_dominguez/libroMatlab.

htm % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % % SIMPSONDAPT INTEG= SIMPSONADAPT (F,A,B) Devuelve una aproximacion de la integral de F en [A,B] mediante una integracion adaptativa basada en la regla de Simpson. La tolerancia se fija en 1e-5 INTEG= SIMPSONADAPT (F,A,B,TOL) Se integra con tolerancia TOL [INTEG,X,FL]= SIMPSONADAPT (F,A,B,TOL,NSUBD,R) NSUBD fija el numero maximo de veces que un intervalo puede ser dividido. R es el factor de reduccin de la tolerancia en cada subdivisin de los intervalos. Por defecto es 3/4. La variable de salida X contienete los puntos los puntos utilizados en la evaluacin de la integral Fl=1 si se ha podido realizar la integral dentro de la tolerancia prefijada, 0 en caso contrario. Este programa forma parte del material auxiliar del texto "Matlab en cinco lecciones de numerico" por V. Dominguez y M.L. Rapun. Se permite la libre copia, distribucion y ejecucion con la unica condicion de mencionar y el origen y autores. Mas informacion en http://www.unavarra.es/personal/victor_dominguez

function [integ,varargout]=simpsonAdapt(f,a,b,varargin) global r nsub dispMensajes fl tol=1e-5; nsub=8; r=3/4; if nargin>3 tol=varargin{1}; end if nargin>4 nsub=varargin{2}; end if nargin>5 r=varargin{3}; end if nargout>2 dispMensajes=0; % No hay mensajes por la pantalla else dispMensajes=1; end c=(a+b)/2; fa=feval(f,a);

fb=feval(f,b); fc=feval(f,c); integ=(b-a)*(fa+4*fb+fc)/6; %regla de Simpson n=0; x=[a b c]; [integ,x]=... simpsonadaptativo(f,a,c,b,fa,fc,fb,integ,tol,n,x); x=sort(x); %figure(5) %subplot(211), plot(x,feval(f,x),'o-') %subplot(212), plot(x,x*0,'o') if nargout>1 varargout{1}=x; if nargout>2 varargout{2}=fl; end end return function [integ,x]= simpsonadaptativo(f,a,c,b,fa,fc,fb,integ,tol,n,x) global r nsub dispMensajes fl d=(a+c)/2; e=(c+b)/2; fd=feval(f,d); fe=feval(f,e); h=(b-a)/2; integ21=h*(fa+4*fd+fc)/6; integ22=h*(fc+4*fe+fb)/6; x=[x,d,e]; est=16/15*abs(integ-integ21-integ22); if est<tol integ=(16*(integ21+integ22)-integ)/15; else if n>=nsub if dispMensajes==1 fprintf(... 'no max de subdivisiones sobrepasadas en [%10.6d, %10.6d]\n',a,b) end fl=0; else n=n+1; [integ21,x]=... simpsonadaptativo(f,a,d,c,fa,fd,fc,integ21,tol*r,n,x); [integ22,x]=... simpsonadaptativo(f,c,e,b,fc,fe,fb,integ22,tol*r,n,x); end integ=integ21+integ22; end

% % % % % % % % %

TRAPECIO TRAPECIO(F,A,B,N) devuelve el valor aproximado de la integral de F entre A y B con la regla compuesta del trapecio con N+1 puntos F debe estar vectorizada

% Extraido del texto: % % "Matlab en cinco lecciones de numerico" % por V. Dominguez y M.L. Rapun. % % Ms informacion en % % http://www.unavarra.es/personal/victor_dominguez function s=trapecio(f,a,b,n) h=(b-a)/n; x=linspace(a,b,n+1); % construimos malla y=feval(f,x); % evaluamos f en la malla s=h*(0.5*y(1)+sum(y(2:end-1))+0.5*y(end)); return

% aplicamos la regla

% GAUSSSEIDEL % % X = GAUSSSEIDEL(A,B) % aplica el metodo de Gauss-Seidel para la resolucion del % sistema AX=B % %[X,IT]= GAUSSSEIDEL(A,B) % devuelve en IT el numero de iteraciones calculadas % %[X,IT,ERRORES]= GAUSSSEIDEL(A,B) % devuelve en ERRORES la diferencia entre iteraciones sucesivas. % Proporciona un historial de la convergencia del mtodo % %[X,IT,ERRORES,FLAG]= GAUSSSEIDEL(A,B,MMAX) % FLAG=1 si hay convergencia, FLAG=0 en caso contrario % %[X,IT,ERRORES,FLAG]= GAUSSSEIDEL(A,B,MMAX,EPS1,EPS2) % EPS1,EPS2 son las tolerancias absoluta y relativa. El mtodo % finaliza si la diferencia entre dos iteraciones sucesivas X1, % X2 cumple norm(X1-X2)<EPS1+norm(X2)*EPS2 % %[X,IT,ERRORES,FLAG]== GAUSSSEIDEL(A,B,MMAX,EPS1,EPS2,X0) % arranca el metodo con X0 % % Extraido del texto: % % "Matlab en cinco lecciones de numerico" % por V. Dominguez y M.L. Rapun. % % Ms informacion en % % http://www.unavarra.es/personal/victor_dominguez function [x, varargout]=gaussSeidel(a,b,varargin) % valores por defecto n=length(a); mmax=100; eps1=1e-4; eps2=1e-4; % tol. absoluta y relativa x=zeros(n,1);

if nargin>2 mmax=varargin{1}; end if nargin>3 eps1=varargin{2}; end if nargin>4 eps2=varargin{3}; end if nargin>5 x(:)=varargin{4}; %x es un vector columna end errores=zeros(1,mmax); for m=1:mmax error=0; y=x; for i=1:n x(i)=(b(i)-a(i,[1:i-1 i+1:n])*x([1:i-1 i+1:n]))/a(i,i); end error=norm(x-y,1); % otras normas con errores(m)=error; % norm(x-y,2),norm(x-y,inf) if (error<eps1+eps2*norm(x)) break end end errores=errores(1:m); if (m==mmax) & nargout<=3 disp('numero maximo de iteraciones sobrepasado') end % salida if (nargout>1) varargout{1}=m; % no de iteraciones end if (nargout>2) varargout{2}=errores; % diferencia entre iteraciones end if (nargout>3) % flag: 1 si hay convergencia, 0 en caso contrario if m==mmax varargout{3}=0; else varargout{3}=1; end end return

% JACOBIV % % X = GAUSSSEIDELV(A,B) % aplica el metodo de GAUSSSEIDEL para la resolucion del sistema AX=B % %[X,IT]= GAUSSSEIDELV(A,B) % devuelve en IT el numero de iteraciones calculadas % %[X,IT,ERRORES]= GAUSSSEIDELV(A,B)

% devuelve en ERRORES el residuo de cada iteracin. % Proporciona un historial de la convergencia del mtodo % %[X,IT,ERRORES,FLAG]= GAUSSSEIDELV(A,B,MMAX) % FLAG=1 si hay convergencia, FLAG=0 en caso contrario % %[X,IT,ERRORES,FLAG]= GAUSSSEIDELV(A,B,MMAX,EPS1,EPS2) % EPS1,EPS2 son las tolerancias absoluta y relativa. El mtodo % finaliza si norm(B-A*X)<EPS1+norm(B)*EPS2 % %[X,IT,ERRORES,FLAG]== GAUSSSEIDELV(A,B,MMAX,EPS1,EPS2,X0) % arranca el metodo con X0 % % Versin vectorizada % % Extraido del texto: % % "Matlab en cinco lecciones de numerico" % por V. Dominguez y M.L. Rapun. % % Ms informacion en % % http://www.unavarra.es/personal/victor_dominguez function [x, varargout]=gaussSeidelV(a,b,varargin) % valores por defecto n=length(a); mmax=100; eps1=1e-4; eps2=1e-4; % tol. absoluta y relativa x=zeros(n,1); if nargin>2 mmax=varargin{1}; end if nargin>3 eps1=varargin{2}; end if nargin>4 eps2=varargin{3}; end if nargin>5 x(:)=varargin{4}; %x es un vector columna end errores=zeros(1,mmax); l=tril(a); r=(b-a*x); normab=norm(b); for m=1:mmax x=x+l\r; r=(b-a*x); % residuo normar=norm(r); errores(m)=normar; % norm(x-y,2),norm(x-y,inf) if (normar<eps1+eps2*normab) break end end errores=errores(1:m); if (m==mmax) & nargout<=3 disp('numero maximo de iteraciones sobrepasado') end

% salida if (nargout>1) varargout{1}=m; % no de iteraciones end if (nargout>2) varargout{2}=errores; % diferencia entre iteraciones end if (nargout>3) % flag: 1 si hay convergencia, 0 en caso contrario if m==mmax varargout{3}=0; else varargout{3}=1; end end return

Вам также может понравиться