1+ % Autor: Rolando Valdez Guzmán
2+ % Alias: Tutoingeniero
3+ % Canal de Youtube: https://www.youtube.com/channel/UCU1pdvVscOdtLpRQBp-TbWg
4+ % Versión: 1.0
5+ % Actualizado: 17/jun/2020
6+
7+ %% ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~Setup~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~%
8+
9+ % Método de la regla falsa modificada (versión interactiva) ESPAÑOL
10+ % Ingresa los datos de entrada para encontrar la raíz de una función en un
11+ % intervalo dado y presiona Enter repetidas veces para ver el proceso paso
12+ % por paso.
13+
14+ clc ; clear all ;
15+
16+ f= @(x ) x .^(10 ) - 1 ; % Función dependiente de x.
17+ fplot(f ,' k-' ,' LineWidth' ,2 ); % Grafica la función de color negro y grosor 2
18+ title(func2str(f )); hold on ; grid on ; % Título de la función.
19+ line([-5 5 ],[0 0 ],' Color' ,' k' ,' LineStyle' ,' --' ); % Marca el eje X.
20+ line([0 0 ],[-5 5 ],' Color' ,' k' ,' LineStyle' ,' --' ) % Marca el eje Y.
21+ axis([-0.5 3 - 5 15 ])
22+
23+ xl= 0 ; % Límite inferior.
24+ xu= 1.3 ; % Límite superior.
25+ fxl= f(xl ); % Punto en Y para el límite inferior.
26+ fxu= f(xu ); % Punto en Y para el límite superior.
27+ Niter= 100 ; % Número de iteraciones. Recomiendo usar 100.
28+ Tol= 0.01 ; % Tolerancia para el criterio de convergencia a superar o igualar (%)
29+ il= 0 ;
30+ iu= 0 ;
31+
32+ %% ~~~~~~~~~~~~~~~~~~~~~~~~~~~~Algoritmo~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~%
33+
34+ x = linspace(xl ,xu ,100 );
35+ ylim = [min(f(x )),max(f(x ))];
36+ if fxl * fxu > 0 % Esta propiedad es la que hace que éste sea un método cerrado.
37+ error(' No hay una raíz en ese intervalo!' );
38+ end
39+
40+ obj= plot([xl ,xu ],[fxl ,fxu ],' ko' ,' markerfacecolor' ,' b' ); % Grafica los límites como puntos
41+ fprintf(' Presiona una tecla para continuar\n ' ); pause ;
42+
43+ for i = 1 : Niter
44+ % Regla Falsa
45+ xr(i )=xu(i )-fxu(i )*((xu(i )-xl(i ))/(fxu(i )-fxl(i ))); % Calcula el punto medio falso actual.
46+ fxr(i )=f(xr(i )); % Evalua la función en el punto medio falso actual.
47+
48+ if f(xr(i ))*f(xl(i )) > 0 % Si esta condición se cumple, la raíz NO está entre xl y xr
49+ xl(i + 1 ) = xr(i ); % El punto medio es el nuevo límite inferior.
50+ xu(i + 1 ) = xu(i ); % El límite superior se mantiene igual.
51+ fxl(i + 1 )=f(xl(i + 1 ));
52+ fxu(i + 1 )=f(xu(i + 1 ));
53+ il= 0 ;
54+ iu= iu + 1 ;
55+ % Si usamos dos o más veces seguidas el mismo límite superior, evaluar en la función y dividir sobre 2
56+ if iu >= 2
57+ fxu(i + 1 )=(fxu(i ))/2 ;
58+ end
59+ elseif f(xr(i ))*f(xu(i )) > 0 % Si esta condición se cumple, la raíz NO está entre xu y xr
60+ xu(i + 1 ) = xr(i ); % El punto medio es el nuevo límite superior.
61+ xl(i + 1 ) = xl(i ); % El límite inferior se mantiene igual.
62+ fxl(i + 1 )=f(xl(i + 1 ));
63+ fxu(i + 1 )=f(xu(i + 1 ));
64+ iu= 0 ;
65+ il= il + 1 ;
66+ % Si usamos dos o más veces seguidas el mismo límite inferior, evaluar en la función y dividir sobre 2
67+ if il >= 2
68+ fxl(i + 1 )=(fxl(i ))/2 ;
69+ end
70+ end
71+
72+ 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
73+ fxr(i + 1 )=f(xr(i + 1 ));
74+ Error(i + 1 )=abs((xr(i + 1 )-xr(i ))/xr(i + 1 ))*100 ; % Calcula el error relativo actual
75+
76+ % Grafica nuevos puntos
77+ obj1 = plot(xr(i ),fxr(i ),' ko' ,' markerfacecolor' ,' r' ); % Grafica el punto medio actual.
78+ obj2 = plot([xr(i ),xr(i )],ylim ,' r--' ); % Grafica una línea vertical que pasa por el punto medio actual.
79+
80+ % Construye los dos triángulos que intersectan con el eje X.
81+ obj3 = line([xl(i ),xu(i )],[fxl(i ),fxu(i )],' Color' ,' r' );
82+ obj4 = line([xl(i ),xl(i )],[fxl(i ),0 ],' Color' ,' r' );
83+ obj5 = line([xu(i ),xu(i )],[fxu(i ),0 ],' Color' ,' r' );
84+ obj6 = line([xl(i ),xu(i )],[0 ,0 ],' Color' ,' r' );
85+ obj7 = area([xl(i ),xr(i )],[fxl(i ),0 ]);
86+ obj8 = area([xr(i ),xu(i )],[0 ,fxu(i )]);
87+ alpha(obj7 ,0.3 );
88+ alpha(obj8 ,0.3 );
89+ fprintf(' Presiona una tecla para continuar\n ' ); pause ;
90+
91+ % Grafica el nuevo intervalo
92+ delete(obj1 ); delete(obj2 );
93+ delete(obj3 ); delete(obj4 ); delete(obj5 ); delete(obj6 );
94+ delete(obj7 ); delete(obj8 );% Borra el punto medio actual y su línea de apoyo
95+ set(obj ,' markerfacecolor' ,' w' ); % Vuelve blanco el punto que ya no nos sirve
96+ obj= plot([xl(i + 1 ),xu(i + 1 )],[fxl(i + 1 ),fxu(i + 1 )],' ko' ,' markerfacecolor' ,' b' ); % Actualiza los límites
97+ fprintf(' Presiona una tecla para continuar\n ' ); pause ;
98+
99+ if Error(i + 1 ) < Tol % Si el error relativo es menor a la tolerancia exigida, se acaba el ciclo.
100+ fprintf(' Convergencia!\n ' );
101+ obj1 = plot(xr(i ),fxr(i ),' ko' ,' markerfacecolor' ,' r' );
102+ obj2 = plot([xr(i ),xr(i )],ylim ,' r--' );
103+ break ;
104+ end
105+ end
106+
107+ M1= {' xl' ,' xr' ,' xu' ,' f(xl)' ,' f(xr)' ,' f(xu)' ,' Error relativo (%)' };
108+ M2= num2cell([xl ' xr ' xu ' fxl ' fxr ' fxu ' Error ' ]);
109+ M= [M1 ; M2 ];
110+ XR= xr(end );
111+ ER= Error(end );
112+ Iter= i + 1 ;
113+
114+ % Evaluar la función con la raíz aproximada y mensaje de resumen.
115+ Resultado= f(XR );
116+ disp(newline )
117+ disp([' Evaluando la función ' func2str(f ) ' con ' num2str(XR ) ' , el resultado es: ' num2str(Resultado )]);
118+ disp([' Error relativo (%): ' num2str(ER )]);
119+ disp([' Número de iteraciones: ' num2str(Iter )]);
0 commit comments