Good Day Mathwork Community; I have the following code for returning the strong wolfe line search in soliving conjugate gradient method unconstrained optimization, iam find
8 views (last 30 days)
Show older comments
Good Day Mathwork Community;
I have the following code for returning the strong wolfe line search in soliving conjugate gradient method unconstrained optimization, iam finding it difficult to return number function evaluations (nfval) and gradient evalution (ngval). Can some one assist me with the solution of these problems
Thanks
Nasiru Salihu
function [alpha, x, f, grad, fail, nsteps] = St_Wolfe(x0,d,op)
c1 = 1e-4;
c2 = -0.00001;
%c1 = .01;
%c2 = 0.9;
%c1 = 1e-4;
%c2 = 0.001;
%c1 = 0.0001
%c2 = 0.9;
f0=test_functions(x0,op);
grad0=test_functions(x0,op,1);
g0 = grad0'*d;
if g0 >= 0
error('g0 must be negative, not a descent direction')
end
old = 0; fold = f0; gold = g0;
new = 1;
nexpand = max([50 -round(log2(norm(d)))]);
for k = 1:nexpand
xnew = x0 + new*d;
fnew=test_functions(xnew,op);
gradnew=test_functions(xnew,op,1);
gnew = gradnew'*d;
if fnew > f0 + c1*new*g0 | ((fnew >= fold) & k > 1) %
[alpha, x, f, grad, fail, nsteps] = zoom1(old, new, ...
fold, fnew, gold, gnew, f0, g0, x0, d,op, c1, c2);
return
end
if abs(gnew) <= c2*g0
alpha = new; x = xnew; f = fnew; grad = gradnew; fail = 0; nsteps = k;
return
end
if gnew >= 0
[alpha, x, f, grad, fail, nsteps] = zoom1(new, old, ...
fnew, fold, gnew, gold, f0, g0, x0, d,op, c1, c2);
return
end
old = new;
fold = fnew;
gold = gnew;
new = 2*new;
end
alpha = new;
x = xnew;
f = fnew;
grad = gradnew;
fail = -1;
nsteps = 0;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function [alpha, x, f, grad, fail, nsteps] = zoom1(...
lo, hi, flo, fhi, glo, ghi, f0, g0, x0, d,op, c1, c2)
fail = 0;
lo2 = hi;
flo2 = fhi;
glo2 = ghi;
nsteps = 0;
while lo ~= hi & nsteps < 50
nsteps = nsteps + 1;
bisect = (lo + hi)/2;
interp = cubic_interp(lo, lo2, flo, flo2, glo, glo2);
if inside(interp, lo, bisect)
atry = interp;
else
atry = bisect;
end;
xtry = x0 + atry*d;
ftry=test_functions(xtry,op);
gradtry=test_functions(xtry,op,1);
gtry = gradtry'*d;
if ftry > f0 + c1*atry*g0 | ftry >= flo
hi = atry;
lo2 = hi; flo2 = ftry; glo2 = gtry;
else
if abs(gtry) <= -c2*g0
alpha = atry; x = xtry; f = ftry; grad = gradtry;
return
end
if gtry*(hi - lo) >= 0
hi = lo;
end
lo2 = lo; flo2 = flo; glo2 = glo;
lo = atry; flo = ftry; glo = gtry;
end
end
alpha = atry; x = xtry; f = ftry; grad = gradtry; fail = 1;
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
function xmin = cubic_interp(x1, x2, f1, f2, g1, g2)
eta = g1 + g2 - 3*(f1 - f2)/(x1 - x2);
gamma = sign(x2-x1)*sqrt(eta^2 - g1*g2);
xmin = x2 - (x2 - x1)*(g2 + gamma - eta)/(g2 - g1 + 2*gamma);
0 Comments
Answers (1)
Umang Pandey
on 31 Oct 2023
Edited: Umang Pandey
on 31 Oct 2023
Hi Nasiru,
I understand that you want to count the number of function evaluations (nfval) and number of gradient evaluations (ngval) in your code.
This can be achieved by modifying the function definitions to include the "ngval" and "nfval" variables, in the following manner:
1. Initialize the "nfval" and "ngval" variables in the "St_Wolfe" function:
function [alpha, x, f, grad, fail, nsteps, nfval, ngval] = St_Wolfe(x0,d,op)
nfval = 0;
ngval = 0;
% Your custom code...
2. Modify the "test_functions", "zoom1" and "cubic_interp" functions to pass and update the "nfval" and "ngval" variables within these functions whenever they are called and gradients are calculated:
function [xmin, nfval, ngval] = cubic_interp(x1, x2, f1, f2, g1, g2, nfval, ngval)
nfval = nfval + 1;
% Your custom code...
function [alpha, x, f, grad, fail, nsteps, nfval, ngval] = zoom1(...
lo, hi, flo, fhi, glo, ghi, f0, g0, x0, d,op, c1, c2, nfval, ngval)
nfval = nfval + 1;
% Your custom code...
Best,
Umang
0 Comments
See Also
Categories
Find more on FPGA, ASIC, and SoC Development 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!