Monday, May 27, 2013

Regula-Falsi method algorithm in Matlab

Regula-Falsi method algorithm in Matlab :

function [c,E,fc]=regula(f,a,b,error,n_iter)
% syntaxis: [c,E,fc]=regula(f,a,b,error,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 Regula-Falsi.
% 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]=regula(f,0,3,0.005,20);
%
% --------|----------|------------|
% Iter.       Aprox.     Error.   
% --------|----------|------------|
% ini        0.3333      3.0000       
% 1          0.6000      0.2667       
% 2          0.7778      0.1778       
% 3          0.8824      0.1046       
% 4          0.9394      0.0570       
% 5          0.9692      0.0298       
% 6          0.9845      0.0153       
% 7          0.9922      0.0077       
% 8          0.9961      0.0039       
% --------|----------|------------|
%
% c = 0.9961
%
% E = 0.0039
%
% fc = -0.0078
%
%
% Ver tambien: biseccion
%
% ----------------------------------------------------------------------
%
% 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 Regula-Falsi
x= a - (subs(f,a)*(b-a)/(subs(f,b)-subs(f,a))); 
E=b-a;
RES(1,1)=x; ERR(1,1)=E;
xa=x; 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 - (subs(f,a)*(b-a)/(subs(f,b)-subs(f,a)));
    E= abs(x-xa);
    xa=x; 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