Skip to content

Commit 4800846

Browse files
authored
Update ReglaFalsaModFcn.m
1 parent 9ae83bd commit 4800846

File tree

1 file changed

+90
-67
lines changed

1 file changed

+90
-67
lines changed

ReglaFalsaModFcn.m

+90-67
Original file line numberDiff line numberDiff line change
@@ -1,97 +1,120 @@
1-
function [M,XR,ER,Iter]=ReglaFalsaModFcn(f,xl,xu,Niter,Tol)
2-
%Autor: Rolando Valdez Guzmán
1+
function [M, XR, ER, Iter] = ReglaFalsaModFcn(f, xl, xu, Niter, Tol)
2+
%Autor: Rolando Valdez Guzmán
33
%Alias: Tutoingeniero
44
%Canal de Youtube: https://www.youtube.com/channel/UCU1pdvVscOdtLpRQBp-TbWg
5-
%Versión: 1.0
6-
%Actualizado: 17/jun/2020
5+
%Versión: 2.0
6+
%Actualizado: 30/jul/2020
77

8-
%Método de la regla falsa modificada (versión función) ESPAÑOL.
9-
%Llama a esta función desde la ventana de comandos o cualquier script para
10-
%encontrar la raíz de una función en un intervalo y obtén una tabla con el
8+
%Método de la regla falsa modificada (versión función) ESPAÑOL.
9+
%Llama a esta función desde la ventana de comandos o cualquier script para
10+
%encontrar la raíz de una función en un intervalo y obtén una tabla con el
1111
%proceso.
1212

1313
% ESTA FUNCION PIDE LOS SIGUIENTES DATOS DE ENTRADA:
1414

15-
% f=función como un identificador de función (function handle)
15+
% f = función como un identificador de función (function handle)
1616
% ej. @(x) cos(x)
17-
% xl=Límite inferior. Este dato es un escalar.
18-
% xu=Límite superior. Este dato es un escalar.
19-
% Niter=Número de iteraciones (100 por default).
20-
% Tol=Tolerancia para el criterio de convergencia a superar o igualar en
21-
% porcentaje (0.001 por default)
17+
% xl = Límite inferior. Este dato es un escalar.
18+
% xu = Límite superior. Este dato es un escalar.
19+
% Niter = Número de iteraciones.
20+
% Tol = Tolerancia para el criterio de convergencia a superar o igualar en
21+
% porcentaje.
2222

2323
% VARIABLES DE SALIDA:
2424

25-
% M= Tabla de resultados {'xl','xr','xu','f(xl)','f(xr)','f(xu)','Error relativo (%)'}
26-
% XR=Ultima iteración de la raíz de la función.
27-
% ER=Ultima iteracion del error relativo.
28-
% Iter=Número de iteraciones
25+
% M = Tabla de resultados {'xl', 'xr', 'xu', 'f(xl)', 'f(xr)', 'f(xu)', 'Error relativo (%)'}
26+
% XR = Ultima iteración de la raíz de la función.
27+
% ER = Ultima iteracion del error relativo.
28+
% Iter = Número de iteraciones
2929

30-
if nargin<3 %Si se ingresan menos de tres datos de entrada...
31-
error('Se necesita definir una función y un intervalo a evaluar');
32-
elseif nargin==3 %Si se ingresan sólo tres datos de entrada...
33-
Niter=100;
34-
Tol=0.001;
35-
elseif nargin==4 %Si se ingresan sólo cuatro datos de entrada...
36-
Tol=0.001;
30+
%METODOS DE SOLUCION
31+
32+
%Método 1: Si Niter está vacío (Niter = []) entonces se debe especificar un
33+
%error relativo mínimo para converger.
34+
%Método 2: Si Tol está vacío (Tol = []) entonces se debe especificar un
35+
%número máximo de iteraciones para el código. Es posible que un número muy
36+
%grande de iteraciones cree un error y un mensaje aparecerá sugiriendo
37+
%reducir el número de iteraciones.
38+
39+
%Si se ingresan menos de tres datos de entrada...
40+
if nargin < 5
41+
error('Se necesita definir una función, un intervalo a evaluar, un número máximo de iteraciones y un error relativo mínimo');
42+
%Si se ingresan todos los datos de entrada, elegir un método de solución
43+
else
44+
if isempty(Niter) == 1
45+
metodo = 1;
46+
Niter = 1000;
47+
disp(newline);
48+
disp('Solución por error relativo mínimo para converger');
49+
elseif isempty(Tol) == 1
50+
metodo = 2;
51+
disp(newline);
52+
disp('Solución por número máximo de iteraciones para converger');
53+
elseif isempty(Niter) == 0 && isempty(Tol) == 0
54+
error('Niter y Tol no pueden tener un dato de entrada al mismo tiempo, uno de los dos debe estar vacío (ejemplo: Niter = [])');
55+
end
3756
end
3857

39-
fxl=f(xl); %Punto en Y para el límite inferior.
40-
fxu=f(xu); %Punto en Y para el límite superior.
41-
il=0;
42-
iu=0;
58+
fxl = f(xl); %Punto en Y para el límite inferior.
59+
fxu = f(xu); %Punto en Y para el límite superior.
60+
il = 0;
61+
iu = 0;
4362

44-
if fxl*fxu > 0 %Esta propiedad es la que hace que éste sea un método cerrado.
45-
error('No hay una raíz en ese intervalo!');
63+
if fxl * fxu > 0 %Esta propiedad es la que hace que éste sea un método cerrado.
64+
error('No hay una raíz en ese intervalo!');
4665
end
4766

48-
for i = 1:Niter
49-
xr(i)=xu(i)-fxu(i)*((xu(i)-xl(i))/(fxu(i)-fxl(i))); %Calcula el punto medio falso actual.
50-
fxr(i)=f(xr(i)); %Evalua la función en el punto medio falso actual.
67+
for i = 1:Niter - 1
68+
xr(i) = xu(i) - fxu(i) * ((xu(i) - xl(i)) / (fxu(i) - fxl(i))); %Calcula el punto medio falso actual.
69+
fxr(i) = f(xr(i)); %Evalua la función en el punto medio falso actual.
5170

52-
if f(xr(i))*f(xl(i)) > 0 %Si esta condición se cumple, la raíz NO está entre xl y xr
53-
xl(i+1) = xr(i); %El punto medio es el nuevo límite inferior.
54-
xu(i+1) = xu(i); %El límite superior se mantiene igual.
55-
fxl(i+1)=f(xl(i+1));
56-
fxu(i+1)=f(xu(i+1));
57-
il=0;
58-
iu=iu+1;
59-
%Si usamos dos o más veces seguidas el mismo límite superior, evaluar en la función y dividir sobre 2
60-
if iu>=2
61-
fxu(i+1)=(fxu(i))/2;
71+
if f(xr(i)) * f(xl(i)) > 0 %Si esta condición se cumple, la raíz NO está entre xl y xr
72+
xl(i+1) = xr(i); %El punto medio es el nuevo límite inferior.
73+
xu(i+1) = xu(i); %El límite superior se mantiene igual.
74+
fxl(i+1) = f(xl(i+1));
75+
fxu(i+1) = f(xu(i+1));
76+
il = 0;
77+
iu = iu + 1;
78+
%Si usamos dos o más veces seguidas el mismo límite superior, evaluar en la función y dividir sobre 2
79+
if iu >= 2
80+
fxu(i+1) = (fxu(i))/2;
6281
end
63-
elseif f(xr(i))*f(xu(i)) > 0 %Si esta condición se cumple, la raíz NO está entre xl y xr
64-
xu(i+1) = xr(i); %El punto medio es el nuevo límite superior.
65-
xl(i+1) = xl(i); %El límite inferior se mantiene igual.
66-
fxl(i+1)=f(xl(i+1));
67-
fxu(i+1)=f(xu(i+1));
68-
iu=0;
69-
il=il+1;
70-
%Si usamos dos o más veces seguidas el mismo límite inferior, evaluar en la función y dividir sobre 2
71-
if il>=2
72-
fxl(i+1)=(fxl(i))/2;
82+
elseif f(xr(i)) * f(xu(i)) > 0 %Si esta condición se cumple, la raíz NO está entre xl y xr
83+
xu(i+1) = xr(i); %El punto medio es el nuevo límite superior.
84+
xl(i+1) = xl(i); %El límite inferior se mantiene igual.
85+
fxl(i+1) = f(xl(i+1));
86+
fxu(i+1) = f(xu(i+1));
87+
iu = 0;
88+
il = il + 1;
89+
%Si usamos dos o más veces seguidas el mismo límite inferior, evaluar en la función y dividir sobre 2
90+
if il >= 2
91+
fxl(i+1) = (fxl(i))/2;
7392
end
7493
end
94+
%Asegurarse de que si Niter es muy grande aparezca una alerta.
95+
try
96+
xr(i+1)=xu(i+1)-fxu(i+1)*((xu(i+1)-xl(i+1))/(fxu(i+1)-fxl(i+1))); %Actulizamos el punto medio falso y su punto en Y
97+
catch
98+
error('Intenta un número menor de iteraciones');
99+
end
75100

76-
xr(i+1)=xu(i+1)-fxu(i+1)*((xu(i+1)-xl(i+1))/(fxu(i+1)-fxl(i+1))); %Actulizamos el punto medio falso y su punto en Y
77-
fxr(i+1)=f(xr(i+1));
78-
Error(i+1)=abs((xr(i+1)-xr(i))/xr(i+1))*100; %Calcula el error relativo actual
101+
fxr(i+1) = f(xr(i+1));
102+
Error(i+1) = abs((xr(i+1) - xr(i)) / xr(i+1)) * 100; %Calcula el error relativo actual
79103

80104
if Error(i+1) < Tol %Si el error relativo es menor a la tolerancia exigida, se acaba el ciclo.
81105
break;
82106
end
83107
end
84108

85-
M1={'xl','xr','xu','f(xl)','f(xr)','f(xu)','Error relativo (%)'};
86-
M2=num2cell([xl' xr' xu' fxl' fxr' fxu' Error']);
87-
M=[M1; M2];
88-
XR=xr(end);
89-
ER=Error(end);
90-
Iter=i+1;
109+
M1 = {'xl', 'xr', 'xu', 'f(xl)', 'f(xr)', 'f(xu)', 'Error relativo (%)'};
110+
M2 = num2cell([xl', xr', xu', fxl', fxr', fxu', Error']);
111+
M = [M1; M2];
112+
XR = xr(end);
113+
ER = Error(end);
114+
Iter = i+1;
91115

92-
%Evaluar la función con la raíz aproximada y mensaje de resumen.
93-
Resultado=f(XR);
94-
disp(newline)
95-
disp(['Evaluando la función ' func2str(f) ' con ' num2str(XR) ', el resultado es: ' num2str(Resultado)]);
116+
%Evaluar la función con la raíz aproximada y mensaje de resumen.
117+
Resultado = f(XR);
118+
disp(['Evaluando la función ' func2str(f) ' con ' num2str(XR) ', el resultado es: ' num2str(Resultado)]);
96119
disp(['Error relativo (%): ' num2str(ER)]);
97-
disp(['Número de iteraciones: ' num2str(Iter)]);
120+
disp(['Número de iteraciones: ' num2str(Iter)]);

0 commit comments

Comments
 (0)