Universidad Nacional Autónoma de Honduras Facultad de Ciencias
Transcripción
Universidad Nacional Autónoma de Honduras Facultad de Ciencias
Universidad Nacional Autónoma de Honduras Facultad de Ciencias - Escuela de Matemática Tarea # 1 de Análisis Numérico Revisión de Código La revisión de código en Matlab tiene el propósito de mostrar las habilidades de los alumnos para investigar y analizar las diferentes funciones predefinidas que tiene el programa Matlab que servirán para implementar nuevas funciones relacionadas con los métodos numéricos vistos en las clases presenciales y que son de interés en Análisis Numérico. La tarea consiste en ir explicando por cada línea de código que está realizando la función para esa línea de código, así como observar las estructuras lógicas y de control para comparar decisiones y validar el código para no generar errores. Se muestra un ejemplo de cómo realizar la revisión para una función que resuelve un sistema de ecuaciones mediante la matriz aumentada y la reducción a su forma escalonada. function X = Solucion_Sistema( A,B) %Esta función resuelve un sistema de ecuaciones lineales mediante la matriz %ampliada y la reducción a una matriz escalonada reducida. %Argumentos de entrada: % - A matriz de coeficientes. % - B matriz columna de términos independientes. %Salida: % - El vector X de soluciones. if size(A,1)==size(B,1) %Determinamos si se puede ampliar A con B AMP=[A,B]; %Obtenemos la matriz ampliada Nro_incognitas=size(A,2); %Obtenemos el número de incógnitas utilizando la función "size" if rank(A)==rank(AMP) %Determinamos si el sistema es consistente utilizando la función "rank" que devuelve el número de vectores linealmente independientes para comparar A con AMP. if rank(A)=Nro_incognitas % Determinamos si el sistema tiene igual número de incógnitas S=rref(AMP); %S es la matriz escalonada reducida de la matriz ampliada con la función "rref" X=S(1:Nro_incognitas,Nro_incognitas+1);%El vector X toma valores de la última columna de S. else %Sino tienen el mismo número de incógnitas. Se presenta un mensaje. X='El sistema debe poseer solución única'; %A X se le asigna el mensaje que el sistema debe tener solución única. end %Finalización de la estructura if. else %Sino se cumple que el sistema es consistente. X='El sistema debe ser consistente'; %A X se le asigna el mensaje anterior. end %Finalización de la estructura if. else %Sino se puede ampliar A con B. X='El número de filas de A debe coincidir con el número de filas de B'; %A X se le asigna el mensaje anterior. end %Finalización de la estructura if. end %Finalización de la función Los códigos a revisar son para el método de bisección, punto fijo y Newton-Raphson que se muestran a continuación: Método de Bisección function c = bisect(f,a,b,delta) %DATOS: % - f es la función, introducida como una función anónima 'f=@(x) ' % - a y b son el extremo izquierdo y el extremo derecho % - delta es la tolerancia %RESULTADOS: % - c es el cero o raíz ya=feval(f,a); yb=feval(f,b); if sign(ya)*sign(yb) > 0, return, end max1 = ceil((log(b-a)-log(delta))/log(2)); c=(a+b)/2; disp(' [TABLA DE ITERACIONES]'); disp('__________________________________________________________'); disp('| n | An | Bn | Pn | f(Pn) '); disp('----------------------------------------------------------'); for k=1:max1 c=(a+b)/2; fprintf('| %3d | %.4f | %.4f | %.5f | %.4f\n',k,a,b,c,f(c)); yc=feval(f,c); if yc==0 a=c; b=c; elseif yb*yc>0 b=c; yb=yc; else a=c; ya=yc; end if b-a<delta, return, end end disp('----------------------------------------------------------'); c=(a+b)/2; end Método de Punto FIjo function [ p ] = puntoFijo(g,p0,tol,max1) %DATOS: % - g es la función de iteración % - p0 es la aproximación inicial % - tol es la tolerancia % - max1 es el número máximo de iteraciones %RESULTADOS: % - p es la aproximación del punto fijo. disp(' [TABLA DE ITERACIONES] '); disp('_____________________________________________'); disp('| n | p_n | g(p_n) | Error '); disp('_____________________________________________'); for k=0:max1 p=feval(g,p0); err=abs(p-p0); fprintf('| %2d | %.3f | %.4f | %.5f\n' ,k,p0,p,err); relerr=err/(abs(p)+eps); p0=p; if(err<tol) | (relerr<tol), return; end end if k==max1 disp('Se ha excedido el número de iteraciones') end p0=p; end Método de Newton-Raphson function p = newton(f,p0,delta,epsilon,max1) %DATOS: % - f es la función introducida como una cadena de texto, por ejemplo: % >> f='x^2-1'; % - p0 es la aproximación inicial % - delta es la tolerancia para p0 % - epsilon es la tolerancia para los valores de la función % - max1 es el número máximo de iteraciones. %RESULTADOS: % - y es el valor de la n-esima iteración pn. disp(' [TABLA DE ITERACIONES]'); disp('__________________________________________________________'); disp('| n | Pn | Error absoluto| Error relativo '); disp('__________________________________________________________'); fprintf('| %3d | %.5f | %.1f | %.6f | %.1f\n',0,p0,'',''); df = diff(sym(f)); for k=1:max1 x=p0; pk=p0-eval(f)/eval(df); err=abs(pk-p0); relerr=2*err/(abs(pk)+delta); p0=pk; fprintf('| %3d | %.5f | p=p0; if (err<delta)|(relerr<delta)|(abs(p)<epsilon) format long p=p0; return end end end %.6f\n',k,p0,err,relerr);