Skip to content

Commit 4b29e85

Browse files
authored
Add files via upload
1 parent f4aecbf commit 4b29e85

File tree

2 files changed

+216
-0
lines changed

2 files changed

+216
-0
lines changed

ReglaFalsaMod.m

Lines changed: 119 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,119 @@
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)]);

ReglaFalsaModFcn.m

Lines changed: 97 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,97 @@
1+
function [M,XR,ER,Iter]=ReglaFalsaModFcn(f,xl,xu,Niter,Tol)
2+
%Autor: Rolando Valdez Guzmán
3+
%Alias: Tutoingeniero
4+
%Canal de Youtube: https://www.youtube.com/channel/UCU1pdvVscOdtLpRQBp-TbWg
5+
%Versión: 1.0
6+
%Actualizado: 17/jun/2020
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
11+
%proceso.
12+
13+
% ESTA FUNCION PIDE LOS SIGUIENTES DATOS DE ENTRADA:
14+
15+
% f=función como un identificador de función (function handle)
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)
22+
23+
% VARIABLES DE SALIDA:
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
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;
37+
end
38+
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;
43+
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!');
46+
end
47+
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.
51+
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;
62+
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;
73+
end
74+
end
75+
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
79+
80+
if Error(i+1) < Tol %Si el error relativo es menor a la tolerancia exigida, se acaba el ciclo.
81+
break;
82+
end
83+
end
84+
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;
91+
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)]);
96+
disp(['Error relativo (%): ' num2str(ER)]);
97+
disp(['Número de iteraciones: ' num2str(Iter)]);

0 commit comments

Comments
 (0)