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

Documentos relacionados