Finding minimum of a function using dichotomous search
10 visualizaciones (últimos 30 días)
Mostrar comentarios más antiguos
Hi, so for my question i am trying to minmise the function f(x)= x^(4) – 14*x(3) + 60*x(2) -70*x using a dichotomous search method.
The interval is between [0,2] so i know that a and b are 0 and 2 respectively.
Delta has been set to 0.005.
Through working out, the optimal value of n = 6 so i have added this to the code.
I am a beginner and therefore i found a code online for the dichotomous search algorithm.
Any clue why i get: Error: File: dichotomous1.m Line: 1 Column: 14
Invalid expression. Check for missing multiplication operator, missing or unbalanced delimiters, or other syntax error. To
construct matrices, use brackets instead of parentheses.
I have added his notes just incase they help you.
Any extra help is greatful.
The code is:
function [F] optimal = dichotomous(F,a,b,n)
F= @(x) x(1)^4 - 14 * x(1)^3 + 60*x(1)^2 - 70*x(1);
a=0;
b=2;
n=6;
% Program : dichotomous.m
%
% Purpose : find the optimal point of a given single variable function
% within the given interval
%
% Author : Aamir Alaud Din
% Date : 26.09.2013
%
% Inputs : Four input arguments are required viz., function, two points
% belonging to the interval, and number of iterations
%
% Syntax : optimal = dichotomous(f,a,b,n)
% where f is an inline function
% e.g., f = inline('sin(x)','x');
% a and b are two points belonging to the interval
%
% Example: optimal = dichotomous(f,-3,5,20)
if (nargin < 3)
error('Less number of inputs');
optimal = 'Optimal can''t be found with too few inputs';
return;
elseif (nargin == 3)
n = 250;
disp('Iteration a b f(a) f(b)');
disp('========= ========= ========= ========= =========');
for ii = 1:n
mid = (a + b)/2;
epsilon = 0.005;
a1 = mid - epsilon;
b1 = mid + epsilon;
if (f(a1) < f(b1))
b = b1;
elseif (f(a1) > f(b1))
a = a1;
elseif (f(a1) == f(b1))
a = a1;
b = b1;
end
fprintf('%4d', ii);
fprintf('\t\t\t');
fprintf('%11.4f', a);
fprintf('\t\t');
fprintf('%11.4f', b);
fprintf('\t\t');
fprintf('%11.4f', f(a));
fprintf('\t\t');
fprintf('%11.4f', f(b));
fprintf('\n');
end
elseif (nargin == 4)
disp('Iteration a b f(a) f(b)');
disp('========= ========= ========= ========= =========');
for ii = 1:n
mid = (a + b)/2;
epsilon = 0.005;
a1 = mid - epsilon;
b1 = mid + epsilon;
if (f(a1) < f(b1))
b = b1;
elseif (f(a1) > f(b1))
a = a1;
elseif (f(a1) == f(b1))
a = a1;
b = b1;
end
fprintf('%4d', ii);
fprintf('\t\t\t');
fprintf('%11.4f', a);
fprintf('\t\t');
fprintf('%11.4f', b);
fprintf('\t\t');
fprintf('%11.4f', f(a));
fprintf('\t\t');
fprintf('%11.4f', f(b));
fprintf('\n');
end
elseif (nargin > 4)
error('Too many input arguments')
optimal = 'Optimal can''t be found with too many inputs';
return;
end
optimal = min(a,b);
2 comentarios
John D'Errico
el 29 de Abr. de 2019
Funny, how for code you found on the internet, it is actually really poor code. It looks like it tries to be good. The author was trying hard. But it really is crap code in the end. Sorry. But it is.
Do you really need to use this code? Is there a valid reason why?
Is there any valid reason why you would not just use either of fminbnd or fminsearch, or one of the tools from the optimization toolbox, or a tool from the global optimization toolbox? Note that both fminbnd and fminsearch both come in MATLAB already, so they cost you nothing.
Jan
el 29 de Abr. de 2019
I agree with John. The code is not smart. E.g.: It stops with an error if nargin>4, but after stopping the code tries to create the variable optimal and to return - but the code has been stopped already. Defining epsilon in each iteration is a waste of time. After comparing f(a1) < f(b1) and f(a1) > f(b1), it is not needed to check for f(a1) == f(b1).
The sections for 3 and 4 inputs differ by "n=250" only. Then it would be better just to define n and use the same code.
Respuestas (2)
Jan
el 29 de Abr. de 2019
Editada: Jan
el 29 de Abr. de 2019
The first line is bad already:
function [F] optimal = dichotomous(F,a,b,n)
I guess, this is meant:
function optimal = dichotomous(F,a,b,n)
Then do not define the function and the limits inside the function, but in a separate function:
function yourFcn
F = @(x) x(1)^4 - 14 * x(1)^3 + 60*x(1)^2 - 70*x(1);
a=0;
b=2;
n=6;
opt = dichotomous(F,a,b,n)
end
2 comentarios
Jan
el 29 de Abr. de 2019
You can write this function to a new file, e.g. called "yourFcn.m". Or you can copy both functions to the same M-file. Then remember, that the first function is the "main" function, which is called, if you write yourFcn in the command window.
"it says that there aren't any inputs" - do not post parts of error messages, but exact copies of the complete message. The partial messages do not reveal the important details.
If you write several functions to one M-file, and one of the functions is closed with an end, all functions in the file must be closed with an end.
I suggest to read the "Getting Started" chapters of the documentation and to learn from Matlab's free Onramp Tutorial (ask an internet search engine for the link). The forum is not the perfect location to learn the basics.
Ver también
Categorías
Más información sobre Function Creation en Help Center y File Exchange.
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!