Monday, May 27, 2013

Algorithm of Bisection method in Mtalab

Algorithm of Bisection method in Mtalab :

function [c,E,fc]=biseccion(f,a,b,error,n_iter)
% syntaxis: [c,E,fc]=biseccion(f,a,b,E,n_iter)
% ---------------------------------------------------------------------
% Esta funcion permite determinar de manera aproximada el valor de la
% raiz de una ecuacion no lineal f(x)=0 mediante el metodo de Biseccion.
% De manera adicional se proporciona una tabla con el valor de la 
% aproximacion y el error corespondiente en cada iteracion.
%
% Entrada:
% f      --> Funcion simbolica
% a, b   --> Extremos del intervalo
% error  --> Tolerancia del calculo {default | 0.00001}
% n_iter --> Numero maximo de iteraciones {default | 1000}
%
% Salida:
% c  --> Aproximacion encontrada
% E  --> Error de la aproximacion "c"
% fc --> Valor de la funcion en la aproximacion
%
%
% Ejemplo:
% 
% f=sym('x^2-1'); 
% [c,E,fc]=biseccion(f,0,3,0.005,20);
%
% --------|----------|------------|
% Iter.       Aprox.     Error.   
% --------|----------|------------|
% ini        1.5000      1.5000       
% 1          0.7500      0.7500       
% 2          1.1250      0.3750       
% 3          0.9375      0.1875       
% 4          1.0313      0.0938       
% 5          0.9844      0.0469       
% 6          1.0078      0.0234       
% 7          0.9961      0.0117       
% 8          1.0020      0.0059       
% 9          0.9990      0.0029       
% --------|----------|------------|
%
% c = 0.9990
%
% E = 0.0029
%
% fc = -0.0020
%
%
% Ver tambien: regula
%
% ----------------------------------------------------------------------
%
% Elaborado por:
%
% Msc. Alexeis Comanioni Guerra
% Lic. Vianka Orovio Cobo
%
% Revision: 1.0 
% Fecha: 30/09/2007


%% Validacion de la entrada
if (nargin<3)  
    error('Revise los datos de entrada.');
else
    tipo = class(f);
    if all( (tipo(1:3)=='sym')>0 )~=1
        error('La funcion f debe ser simbolica.');
    end

    if sum(size(a))~=2 || sum(size(b))~=2
        error('Los extremos del intervalo deben ser escalares.'); 
    end  
end

if (nargin<4) 
    error=0.00001;
    n_iter=1000;
elseif (nargin<5) 
    n_iter=1000;
    if sum(size(error))~=2
        error('La tolerancia debe ser un escalar.'); 
    end
else
    if sum(size(error))~=2
        error('La tolerancia debe ser un escalar.'); 
    end
    
    if round(n_iter)-n_iter~=0
        error('El numero de iteraciones debe ser un entero.');
    end
end

%% Teorema de Bolzano
if subs(f,a)*subs(f,b)>0
    error('Imposible de aplicar el metodo: note que --> f(a)*f(b)>0');
end

%% Metodo de Biseccion
x=(a+b)/2; E=(b-a)/2;
RES(1,1)=x; ERR(1,1)=E;
i=1;
while (E>=error) && (i<=n_iter)
    if subs(f,x)==0
        fprintf('La raiz es exactamente: %f',x);
        break;
    elseif subs(f,b)*subs(f,x)<0
 a=x; %b=b;
    else
 b=x; %a=a;
    end
    x=(a+b)/2; E=(b-a)/2;
    i=i+1;
    RES(i,1)=x; ERR(i,1)=E;
end

%% Formateo de las salidas
disp('--------|----------|------------|');
fprintf('Iter.      Aprox.      Error.   \n');
disp('--------|----------|------------|');
fprintf('%-10s %-11.4f %-12.4f \n','ini',RES(1,1),ERR(1,1));
for i=2:max(size(RES))
    fprintf('%-10.0d %-11.4f %-12.4f \n',i-1,RES(i,1),ERR(i,1));
end
disp('--------|----------|------------|');

c=x; fc=subs(f,x);

No comments:

Post a Comment