-
Notifications
You must be signed in to change notification settings - Fork 10
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
1 parent
9ae83bd
commit 4800846
Showing
1 changed file
with
90 additions
and
67 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,97 +1,120 @@ | ||
function [M,XR,ER,Iter]=ReglaFalsaModFcn(f,xl,xu,Niter,Tol) | ||
%Autor: Rolando Valdez Guzmán | ||
function [M, XR, ER, Iter] = ReglaFalsaModFcn(f, xl, xu, Niter, Tol) | ||
%Autor: Rolando Valdez Guzmán | ||
%Alias: Tutoingeniero | ||
%Canal de Youtube: https://www.youtube.com/channel/UCU1pdvVscOdtLpRQBp-TbWg | ||
%Versión: 1.0 | ||
%Actualizado: 17/jun/2020 | ||
%Versión: 2.0 | ||
%Actualizado: 30/jul/2020 | ||
|
||
%Método de la regla falsa modificada (versión función) ESPAÑOL. | ||
%Llama a esta función desde la ventana de comandos o cualquier script para | ||
%encontrar la raíz de una función en un intervalo y obtén una tabla con el | ||
%Método de la regla falsa modificada (versión función) ESPAÑOL. | ||
%Llama a esta función desde la ventana de comandos o cualquier script para | ||
%encontrar la raíz de una función en un intervalo y obtén una tabla con el | ||
%proceso. | ||
|
||
% ESTA FUNCION PIDE LOS SIGUIENTES DATOS DE ENTRADA: | ||
|
||
% f=función como un identificador de función (function handle) | ||
% f = función como un identificador de función (function handle) | ||
% ej. @(x) cos(x) | ||
% xl=Límite inferior. Este dato es un escalar. | ||
% xu=Límite superior. Este dato es un escalar. | ||
% Niter=Número de iteraciones (100 por default). | ||
% Tol=Tolerancia para el criterio de convergencia a superar o igualar en | ||
% porcentaje (0.001 por default) | ||
% xl = Límite inferior. Este dato es un escalar. | ||
% xu = Límite superior. Este dato es un escalar. | ||
% Niter = Número de iteraciones. | ||
% Tol = Tolerancia para el criterio de convergencia a superar o igualar en | ||
% porcentaje. | ||
|
||
% VARIABLES DE SALIDA: | ||
|
||
% M= Tabla de resultados {'xl','xr','xu','f(xl)','f(xr)','f(xu)','Error relativo (%)'} | ||
% XR=Ultima iteración de la raíz de la función. | ||
% ER=Ultima iteracion del error relativo. | ||
% Iter=Número de iteraciones | ||
% M = Tabla de resultados {'xl', 'xr', 'xu', 'f(xl)', 'f(xr)', 'f(xu)', 'Error relativo (%)'} | ||
% XR = Ultima iteración de la raíz de la función. | ||
% ER = Ultima iteracion del error relativo. | ||
% Iter = Número de iteraciones | ||
|
||
if nargin<3 %Si se ingresan menos de tres datos de entrada... | ||
error('Se necesita definir una función y un intervalo a evaluar'); | ||
elseif nargin==3 %Si se ingresan sólo tres datos de entrada... | ||
Niter=100; | ||
Tol=0.001; | ||
elseif nargin==4 %Si se ingresan sólo cuatro datos de entrada... | ||
Tol=0.001; | ||
%METODOS DE SOLUCION | ||
|
||
%Método 1: Si Niter está vacío (Niter = []) entonces se debe especificar un | ||
%error relativo mínimo para converger. | ||
%Método 2: Si Tol está vacío (Tol = []) entonces se debe especificar un | ||
%número máximo de iteraciones para el código. Es posible que un número muy | ||
%grande de iteraciones cree un error y un mensaje aparecerá sugiriendo | ||
%reducir el número de iteraciones. | ||
|
||
%Si se ingresan menos de tres datos de entrada... | ||
if nargin < 5 | ||
error('Se necesita definir una función, un intervalo a evaluar, un número máximo de iteraciones y un error relativo mínimo'); | ||
%Si se ingresan todos los datos de entrada, elegir un método de solución | ||
else | ||
if isempty(Niter) == 1 | ||
metodo = 1; | ||
Niter = 1000; | ||
disp(newline); | ||
disp('Solución por error relativo mínimo para converger'); | ||
elseif isempty(Tol) == 1 | ||
metodo = 2; | ||
disp(newline); | ||
disp('Solución por número máximo de iteraciones para converger'); | ||
elseif isempty(Niter) == 0 && isempty(Tol) == 0 | ||
error('Niter y Tol no pueden tener un dato de entrada al mismo tiempo, uno de los dos debe estar vacío (ejemplo: Niter = [])'); | ||
end | ||
end | ||
|
||
fxl=f(xl); %Punto en Y para el límite inferior. | ||
fxu=f(xu); %Punto en Y para el límite superior. | ||
il=0; | ||
iu=0; | ||
fxl = f(xl); %Punto en Y para el límite inferior. | ||
fxu = f(xu); %Punto en Y para el límite superior. | ||
il = 0; | ||
iu = 0; | ||
|
||
if fxl*fxu > 0 %Esta propiedad es la que hace que éste sea un método cerrado. | ||
error('No hay una raíz en ese intervalo!'); | ||
if fxl * fxu > 0 %Esta propiedad es la que hace que éste sea un método cerrado. | ||
error('No hay una raíz en ese intervalo!'); | ||
end | ||
|
||
for i = 1:Niter | ||
xr(i)=xu(i)-fxu(i)*((xu(i)-xl(i))/(fxu(i)-fxl(i))); %Calcula el punto medio falso actual. | ||
fxr(i)=f(xr(i)); %Evalua la función en el punto medio falso actual. | ||
for i = 1:Niter - 1 | ||
xr(i) = xu(i) - fxu(i) * ((xu(i) - xl(i)) / (fxu(i) - fxl(i))); %Calcula el punto medio falso actual. | ||
fxr(i) = f(xr(i)); %Evalua la función en el punto medio falso actual. | ||
|
||
if f(xr(i))*f(xl(i)) > 0 %Si esta condición se cumple, la raíz NO está entre xl y xr | ||
xl(i+1) = xr(i); %El punto medio es el nuevo límite inferior. | ||
xu(i+1) = xu(i); %El límite superior se mantiene igual. | ||
fxl(i+1)=f(xl(i+1)); | ||
fxu(i+1)=f(xu(i+1)); | ||
il=0; | ||
iu=iu+1; | ||
%Si usamos dos o más veces seguidas el mismo límite superior, evaluar en la función y dividir sobre 2 | ||
if iu>=2 | ||
fxu(i+1)=(fxu(i))/2; | ||
if f(xr(i)) * f(xl(i)) > 0 %Si esta condición se cumple, la raíz NO está entre xl y xr | ||
xl(i+1) = xr(i); %El punto medio es el nuevo límite inferior. | ||
xu(i+1) = xu(i); %El límite superior se mantiene igual. | ||
fxl(i+1) = f(xl(i+1)); | ||
fxu(i+1) = f(xu(i+1)); | ||
il = 0; | ||
iu = iu + 1; | ||
%Si usamos dos o más veces seguidas el mismo límite superior, evaluar en la función y dividir sobre 2 | ||
if iu >= 2 | ||
fxu(i+1) = (fxu(i))/2; | ||
end | ||
elseif f(xr(i))*f(xu(i)) > 0 %Si esta condición se cumple, la raíz NO está entre xl y xr | ||
xu(i+1) = xr(i); %El punto medio es el nuevo límite superior. | ||
xl(i+1) = xl(i); %El límite inferior se mantiene igual. | ||
fxl(i+1)=f(xl(i+1)); | ||
fxu(i+1)=f(xu(i+1)); | ||
iu=0; | ||
il=il+1; | ||
%Si usamos dos o más veces seguidas el mismo límite inferior, evaluar en la función y dividir sobre 2 | ||
if il>=2 | ||
fxl(i+1)=(fxl(i))/2; | ||
elseif f(xr(i)) * f(xu(i)) > 0 %Si esta condición se cumple, la raíz NO está entre xl y xr | ||
xu(i+1) = xr(i); %El punto medio es el nuevo límite superior. | ||
xl(i+1) = xl(i); %El límite inferior se mantiene igual. | ||
fxl(i+1) = f(xl(i+1)); | ||
fxu(i+1) = f(xu(i+1)); | ||
iu = 0; | ||
il = il + 1; | ||
%Si usamos dos o más veces seguidas el mismo límite inferior, evaluar en la función y dividir sobre 2 | ||
if il >= 2 | ||
fxl(i+1) = (fxl(i))/2; | ||
end | ||
end | ||
%Asegurarse de que si Niter es muy grande aparezca una alerta. | ||
try | ||
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 | ||
catch | ||
error('Intenta un número menor de iteraciones'); | ||
end | ||
|
||
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 | ||
fxr(i+1)=f(xr(i+1)); | ||
Error(i+1)=abs((xr(i+1)-xr(i))/xr(i+1))*100; %Calcula el error relativo actual | ||
fxr(i+1) = f(xr(i+1)); | ||
Error(i+1) = abs((xr(i+1) - xr(i)) / xr(i+1)) * 100; %Calcula el error relativo actual | ||
|
||
if Error(i+1) < Tol %Si el error relativo es menor a la tolerancia exigida, se acaba el ciclo. | ||
break; | ||
end | ||
end | ||
|
||
M1={'xl','xr','xu','f(xl)','f(xr)','f(xu)','Error relativo (%)'}; | ||
M2=num2cell([xl' xr' xu' fxl' fxr' fxu' Error']); | ||
M=[M1; M2]; | ||
XR=xr(end); | ||
ER=Error(end); | ||
Iter=i+1; | ||
M1 = {'xl', 'xr', 'xu', 'f(xl)', 'f(xr)', 'f(xu)', 'Error relativo (%)'}; | ||
M2 = num2cell([xl', xr', xu', fxl', fxr', fxu', Error']); | ||
M = [M1; M2]; | ||
XR = xr(end); | ||
ER = Error(end); | ||
Iter = i+1; | ||
|
||
%Evaluar la función con la raíz aproximada y mensaje de resumen. | ||
Resultado=f(XR); | ||
disp(newline) | ||
disp(['Evaluando la función ' func2str(f) ' con ' num2str(XR) ', el resultado es: ' num2str(Resultado)]); | ||
%Evaluar la función con la raíz aproximada y mensaje de resumen. | ||
Resultado = f(XR); | ||
disp(['Evaluando la función ' func2str(f) ' con ' num2str(XR) ', el resultado es: ' num2str(Resultado)]); | ||
disp(['Error relativo (%): ' num2str(ER)]); | ||
disp(['Número de iteraciones: ' num2str(Iter)]); | ||
disp(['Número de iteraciones: ' num2str(Iter)]); |