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