|
1 | | -function [M,XR,ER,Iter]=BiseccionFcn(f,xl,xu,Niter,Tol) |
2 | | -%Autor: Rolando Valdez Guzmán |
| 1 | +function [M, XR, ER, Iter] = BiseccionFcn(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: 16/jun/2020 |
| 5 | +%Versión: 2.0 |
| 6 | +%Actualizado: 30/jul/2020 |
7 | 7 |
|
8 | | -%Método de la bisección (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 bisección (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 |
| 65 | +for i = 1:Niter - 1 |
47 | 66 |
|
48 | | - xr(i)=(xl(i)+xu(i))/2; %Calcula el punto medio actual. |
49 | | - fxr(i)=f(xr(i)); %Evalua la función en el punto medio actual. |
| 67 | + xr(i) = (xl(i) + xu(i)) / 2; %Calcula el punto medio actual. |
| 68 | + fxr(i) = f(xr(i)); %Evalua la función en el punto medio actual. |
50 | 69 |
|
51 | | - if f(xr(i))*f(xl(i)) > 0 %Si esta condición se cumple, la raíz NO está entre xl y xr |
52 | | - xl(i+1) = xr(i); %El punto medio es el nuevo límite inferior. |
53 | | - xu(i+1) = xu(i); %El límite superior se mantiene igual. |
54 | | - fxl(i+1)=f(xl(i+1)); |
55 | | - fxu(i+1)=f(xu(i+1)); |
56 | | - elseif f(xr(i))*f(xu(i)) > 0 %Si esta condición se cumple, la raíz NO está entre xl y xr |
57 | | - xu(i+1) = xr(i); %El punto medio es el nuevo límite superior. |
58 | | - xl(i+1) = xl(i); %El límite inferior se mantiene igual. |
59 | | - fxl(i+1)=f(xl(i+1)); |
60 | | - fxu(i+1)=f(xu(i+1)); |
| 70 | + if f(xr(i)) * f(xl(i)) > 0 %Si esta condición se cumple, la raíz NO está entre xl y xr |
| 71 | + xl(i+1) = xr(i); %El punto medio es el nuevo límite inferior. |
| 72 | + xu(i+1) = xu(i); %El límite superior se mantiene igual. |
| 73 | + fxl(i+1) = f(xl(i+1)); |
| 74 | + fxu(i+1) = f(xu(i+1)); |
| 75 | + elseif f(xr(i)) * f(xu(i)) > 0 %Si esta condición se cumple, la raíz NO está entre xl y xr |
| 76 | + xu(i+1) = xr(i); %El punto medio es el nuevo límite superior. |
| 77 | + xl(i+1) = xl(i); %El límite inferior se mantiene igual. |
| 78 | + fxl(i+1) = f(xl(i+1)); |
| 79 | + fxu(i+1) = f(xu(i+1)); |
| 80 | + end |
| 81 | + %Asegurarse de que si Niter es muy grande aparezca una alerta. |
| 82 | + try |
| 83 | + xr(i+1) = (xu(i+1) + xl(i+1)) / 2; %Actulizamos el punto medio y su punto en Y |
| 84 | + catch |
| 85 | + error('Intenta un número menor de iteraciones'); |
61 | 86 | end |
62 | 87 |
|
63 | | - xr(i+1)=(xu(i+1)+xl(i+1))/2; %Actulizamos el punto medio y su punto en Y |
64 | | - fxr(i+1)=f(xr(i+1)); |
65 | | - Error(i+1)=abs((xr(i+1)-xr(i))/xr(i+1))*100; %Calcula el error relativo actual |
| 88 | + fxr(i+1) = f(xr(i+1)); |
| 89 | + Error(i+1) = abs((xr(i+1) - xr(i)) / xr(i+1)) * 100; %Calcula el error relativo actual |
66 | 90 |
|
67 | | - if Error(i+1) < Tol %Si el error relativo es menor a la tolerancia exigida, se acaba el ciclo. |
68 | | - break; |
| 91 | + if metodo == 1 |
| 92 | + if Error(i+1) < Tol %Si el error relativo es menor a la tolerancia exigida, se acaba el ciclo. |
| 93 | + break; |
| 94 | + end |
69 | 95 | end |
70 | 96 | end |
71 | 97 |
|
72 | | -M1={'xl','xr','xu','f(xl)','f(xr)','f(xu)','Error relativo (%)'}; |
73 | | -M2=num2cell([xl' xr' xu' fxl' fxr' fxu' Error']); |
74 | | -M=[M1; M2]; |
75 | | -XR=xr(end); |
76 | | -ER=Error(end); |
77 | | -Iter=i+1; |
| 98 | +M1 = {'xl', 'xr', 'xu', 'f(xl)', 'f(xr)', 'f(xu)', 'Error relativo (%)'}; |
| 99 | +M2 = num2cell([xl', xr', xu', fxl', fxr', fxu', Error']); |
| 100 | +M = [M1; M2]; |
| 101 | +XR = xr(end); |
| 102 | +ER = Error(end); |
| 103 | +Iter = i+1; |
78 | 104 |
|
79 | | -%Evaluar la función con la raíz aproximada y mensaje de resumen. |
80 | | -Resultado=f(XR); |
81 | | -disp(newline) |
82 | | -disp(['Evaluando la función ' func2str(f) ' con ' num2str(XR) ', el resultado es: ' num2str(Resultado)]); |
| 105 | +%Evaluar la función con la raíz aproximada y mensaje de resumen. |
| 106 | +Resultado = f(XR); |
| 107 | +disp(['Evaluando la función ' func2str(f) ' con ' num2str(XR) ', el resultado es: ' num2str(Resultado)]); |
83 | 108 | disp(['Error relativo (%): ' num2str(ER)]); |
84 | | -disp(['Número de iteraciones: ' num2str(Iter)]); |
| 109 | +disp(['Número de iteraciones: ' num2str(Iter)]); |
0 commit comments