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
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 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
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.
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 ;
43
62
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!' );
46
65
end
47
66
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.
51
70
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 ;
62
81
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 ;
73
92
end
74
93
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
75
100
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
79
103
80
104
if Error(i + 1 ) < Tol % Si el error relativo es menor a la tolerancia exigida, se acaba el ciclo.
81
105
break ;
82
106
end
83
107
end
84
108
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 ;
91
115
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 )]);
96
119
disp([' Error relativo (%): ' num2str(ER )]);
97
- disp([' Número de iteraciones: ' num2str(Iter )]);
120
+ disp([' Número de iteraciones: ' num2str(Iter )]);
0 commit comments