Clear Filters
Clear Filters

Se queda paralizado no corre todo el código y no me dice el error tampoco

12 views (last 30 days)
%% Datos de entrada %%
f=inline('exp(sin(x))-x'); %funcion unimodal
a=-1; %Limite inferior del intervalo
t=0.11; %tolerancia del metodo
%% Definicion del usuario %%
b=2; %Limite inferior del intervalo
e=0.11 %epsilion
%% Desarrollo del algoritmo %%
xm= (a+b)/2; % Punto medio del intervalo
xa= (a+b)/2 - e/2 % limite inferior
xb= (a+b)/2 + e/2 % limite superior
%% Evaluaciones por el metodo de Bolzano %%
fl= f(xa); % Altura en extremo izquierdo
fr= f(xb); % Altura en extremo derecho
%% Iteracion %%
iter=0; % inicio del contador
% Grafico inicial
figure(1)
plot(xa,fl,'*g',xb,fr,'*k') %grafico de las primeras evaluaciones
hold on;
while abs(b-a)>=t % Parametro de Parada
iter=iter+1; %Actualiza el contador
if fl>fr %Verificacion f(xa)>f(xb)
a=xa; %Actualizacion del limite inferior
elseif fl<=fr %Verificacion f(xa)<=f(xb)
b=xb; %Actualizacion del limite derecho
end
xm= (a+b)/2; %Actualizacion Punto medio
xa= (a+b)/2 - e/2; %Actualizacion limite inferior
xb= (a+b)/2 + e/2; %Actualizacion limite superior
fl= f(xa); % Altura en extremo izquierdo
fr= f(xb); % Altura en extremo derecho
K(iter,:)=[a xa b xb]; %Registro de intervalos
%figure(iter+1)
plot(xa,fl,'*',xb,fr,'OR') %Grafica de iteraciones
end
K %Matriz con todos los intervalos e iterados
%% Grafica prueba 1 %%
x= -5:0.1:5;
y= exp(sin(x))-x;
toc %tiempo final de ejecucion
plot(x,y)
title('Búsqueda Dicotómica')
hold on
disp('El intervalo final es:'), [a(end) b(end)]
disp('La aproximacion buscada es:'), res=(a(end)+ b(end))/2
disp('La aproximacion del minimo es:'), f(res)
disp('El numero de iterados es:'), iter

Accepted Answer

Walter Roberson
Walter Roberson on 27 Nov 2023
Edited: Walter Roberson on 28 Nov 2023
e=0.11 %epsilion
e = 0.1100
That epsilon is too large -- large enough that it keeps expanding the search range instead of it being narrowed. Try more like 0.01
%% Datos de entrada %%
f=inline('exp(sin(x))-x'); %funcion unimodal
a=-1; %Limite inferior del intervalo
t=0.11; %tolerancia del metodo
%% Definicion del usuario %%
b=2; %Limite inferior del intervalo
e=0.01 %epsilion
e = 0.0100
%% Desarrollo del algoritmo %%
xm= (a+b)/2; % Punto medio del intervalo
xa= (a+b)/2 - e/2 % limite inferior
xa = 0.4950
xb= (a+b)/2 + e/2 % limite superior
xb = 0.5050
%% Evaluaciones por el metodo de Bolzano %%
fl= f(xa); % Altura en extremo izquierdo
fr= f(xb); % Altura en extremo derecho
%% Iteracion %%
iter=0; % inicio del contador
% Grafico inicial
figure(1)
plot(xa,fl,'*g',xb,fr,'*k') %grafico de las primeras evaluaciones
hold on;
while abs(b-a)>=t % Parametro de Parada
iter=iter+1; %Actualiza el contador
if fl>fr %Verificacion f(xa)>f(xb)
a=xa; %Actualizacion del limite inferior
elseif fl<=fr %Verificacion f(xa)<=f(xb)
b=xb; %Actualizacion del limite derecho
end
xm= (a+b)/2; %Actualizacion Punto medio
xa= (a+b)/2 - e/2; %Actualizacion limite inferior
xb= (a+b)/2 + e/2; %Actualizacion limite superior
fl= f(xa); % Altura en extremo izquierdo
fr= f(xb); % Altura en extremo derecho
K(iter,:)=[a xa b xb]; %Registro de intervalos
%figure(iter+1)
plot(xa,fl,'*',xb,fr,'OR') %Grafica de iteraciones
end
K %Matriz con todos los intervalos e iterados
K = 5×4
-1.0000 -0.2525 0.5050 -0.2425 -0.2525 0.1212 0.5050 0.1313 -0.2525 -0.0656 0.1313 -0.0556 -0.0656 0.0278 0.1313 0.0378 -0.0656 -0.0189 0.0378 -0.0089
%% Grafica prueba 1 %%
x= -5:0.1:5;
y= exp(sin(x))-x;
toc %tiempo final de ejecucion
Elapsed time is 4.336120 seconds.
plot(x,y)
title('Búsqueda Dicotómica')
hold on
disp('El intervalo final es:'), [a(end) b(end)]
El intervalo final es:
ans = 1×2
-0.0656 0.0378
disp('La aproximacion buscada es:'), res=(a(end)+ b(end))/2
La aproximacion buscada es:
res = -0.0139
disp('La aproximacion del minimo es:'), f(res)
La aproximacion del minimo es:
ans = 1.0001
disp('El numero de iterados es:'), iter
El numero de iterados es:
iter = 5

More Answers (1)

Torsten
Torsten on 27 Nov 2023
Edited: Torsten on 27 Nov 2023
Do you see why your code fails ?
f=@(x)exp(sin(x))-x;
f(-1)
ans = 1.4311
f(2)
ans = 0.4826
x=-1:0.01:2;
plot(x,f(x))
You must start with two points xa, xb for which f(xa)*f(xb) <= 0, and hold this condition until xb-xa <= eps.

Categories

Find more on Introduction to Installation and Licensing in Help Center and File Exchange

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!