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
3
3
% Alias: Tutoingeniero
4
4
% 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
7
7
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
11
11
% proceso.
12
12
13
13
% ESTA FUNCION PIDE LOS SIGUIENTES DATOS DE ENTRADA:
14
14
15
- % f= función como un identificador de función (function handle)
15
+ % f = función como un identificador de función (function handle)
16
16
% 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.
22
22
23
23
% VARIABLES DE SALIDA:
24
24
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
29
29
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
37
56
end
38
57
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.
41
60
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!' );
44
63
end
45
64
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.
49
68
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' );
60
85
end
61
86
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
63
87
fxr(i + 1 )=f(xr(i + 1 ));
64
88
Error(i + 1 )=abs((xr(i + 1 )-xr(i ))/xr(i + 1 ))*100 ; % Calcula el error relativo actual
65
89
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
68
94
end
69
95
end
70
96
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 ;
77
103
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 )]);
82
107
disp([' Error relativo (%): ' num2str(ER )]);
83
- disp([' Número de iteraciones: ' num2str(Iter )]);
108
+ disp([' Número de iteraciones: ' num2str(Iter )]);
0 commit comments