1- function [M ,XR ,ER ,Iter ]= ReglaFalsaFcn(f ,xl ,xu ,Niter ,Tol )
2- % Autor: Rolando Valdez Guzmán
1+ function [M , XR , ER , Iter ] = ReglaFalsaFcn(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 (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 (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
3756end
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.
58+ fxl = f(xl ); % Punto en Y para el límite inferior.
59+ fxu = f(xu ); % Punto en Y para el límite superior.
4160
42- if fxl * fxu > 0 % Esta propiedad es la que hace que éste sea un método cerrado.
43- error(' No hay una raíz en ese intervalo!' );
61+ if fxl * fxu > 0 % Esta propiedad es la que hace que éste sea un método cerrado.
62+ error(' No hay una raíz en ese intervalo!' );
4463end
4564
46- for i = 1 : Niter
47- xr(i )= xu(i )- fxu(i )* ((xu(i )- xl(i ))/ (fxu(i )- fxl(i ))); % Calcula el punto medio falso actual.
48- fxr(i )= f(xr(i )); % Evalua la función en el punto medio falso actual.
65+ for i = 1 : Niter - 1
66+ xr(i ) = xu(i ) - fxu(i ) * ((xu(i ) - xl(i )) / (fxu(i ) - fxl(i ))); % Calcula el punto medio falso actual.
67+ fxr(i ) = f(xr(i )); % Evalua la función en el punto medio falso actual.
4968
50- if f(xr(i ))*f(xl(i )) > 0 % Si esta condición se cumple, la raíz NO está entre xl y xr
51- xl(i + 1 ) = xr(i ); % El punto medio es el nuevo límite inferior.
52- xu(i + 1 ) = xu(i ); % El límite superior se mantiene igual.
53- fxl(i + 1 )=f(xl(i + 1 ));
54- fxu(i + 1 )=f(xu(i + 1 ));
55- elseif f(xr(i ))*f(xu(i )) > 0 % Si esta condición se cumple, la raíz NO está entre xr y xu
56- xu(i + 1 ) = xr(i ); % El punto medio es el nuevo límite superior.
57- xl(i + 1 ) = xl(i ); % El límite inferior se mantiene igual.
58- fxl(i + 1 )=f(xl(i + 1 ));
59- fxu(i + 1 )=f(xu(i + 1 ));
69+ if f(xr(i )) * f(xl(i )) > 0 % Si esta condición se cumple, la raíz NO está entre xl y xr
70+ xl(i + 1 ) = xr(i ); % El punto medio es el nuevo límite inferior.
71+ xu(i + 1 ) = xu(i ); % El límite superior se mantiene igual.
72+ fxl(i + 1 ) = f(xl(i + 1 ));
73+ fxu(i + 1 ) = f(xu(i + 1 ));
74+ elseif f(xr(i )) * f(xu(i )) > 0 % Si esta condición se cumple, la raíz NO está entre xr y xu
75+ xu(i + 1 ) = xr(i ); % El punto medio es el nuevo límite superior.
76+ xl(i + 1 ) = xl(i ); % El límite inferior se mantiene igual.
77+ fxl(i + 1 ) = f(xl(i + 1 ));
78+ fxu(i + 1 ) = f(xu(i + 1 ));
79+ end
80+ % Asegurarse de que si Niter es muy grande aparezca una alerta.
81+ try
82+ 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
83+ catch
84+ error(' Intenta un número menor de iteraciones' );
6085 end
6186
62- 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
6387 fxr(i + 1 )=f(xr(i + 1 ));
6488 Error(i + 1 )=abs((xr(i + 1 )-xr(i ))/xr(i + 1 ))*100 ; % Calcula el error relativo actual
6589
66- if Error(i + 1 ) < Tol % Si el error relativo es menor a la tolerancia exigida, se acaba el ciclo.
67- break ;
90+ if metodo == 1
91+ if Error(i + 1 ) < Tol % Si el error relativo es menor a la tolerancia exigida, se acaba el ciclo.
92+ break ;
93+ end
6894 end
6995end
7096
71- M1= {' xl' ,' xr' ,' xu' ,' f(xl)' ,' f(xr)' ,' f(xu)' ,' Error relativo (%)' };
72- M2= num2cell([xl ' xr ' xu ' fxl ' fxr ' fxu ' Error ' ]);
73- M= [M1 ; M2 ];
74- XR= xr(end );
75- ER= Error(end );
76- Iter= i + 1 ;
97+ M1 = {' xl' , ' xr' , ' xu' , ' f(xl)' , ' f(xr)' , ' f(xu)' , ' Error relativo (%)' };
98+ M2 = num2cell([xl ' , xr ' , xu ' , fxl ' , fxr ' , fxu ' , Error ' ]);
99+ M = [M1 ; M2 ];
100+ XR = xr(end );
101+ ER = Error(end );
102+ Iter = i + 1 ;
77103
78- % Evaluar la función con la raíz aproximada y mensaje de resumen.
79- Resultado= f(XR );
80- disp(newline )
81- disp([' Evaluando la función ' func2str(f ) ' con ' num2str(XR ) ' , el resultado es: ' num2str(Resultado )]);
104+ % Evaluar la función con la raíz aproximada y mensaje de resumen.
105+ Resultado = f(XR );
106+ disp([' Evaluando la función ' func2str(f ) ' con ' num2str(XR ) ' , el resultado es: ' num2str(Resultado )]);
82107disp([' Error relativo (%): ' num2str(ER )]);
83- disp([' Número de iteraciones: ' num2str(Iter )]);
108+ disp([' Número de iteraciones: ' num2str(Iter )]);
0 commit comments