Line Search Algorithm help
56 views (last 30 days)
Show older comments
This part is just the background to the algorithms I am working on:
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/272685/image.png)
![](https://www.mathworks.com/matlabcentral/answers/uploaded_files/272686/image.png)
Here is the code I currently have but I'm not sure what to do to get anything to work:
function [alpha] = linesearch(nsteps)
syms x
f = @(x)100*(x(2) - x(1)^2)^2 + (1 - x(1))^2;
grad = [-400*(x(2)-x(1)^2)*x(1)-2*(1-x(1)); 200*(x(2)-x(1)^2)];
gradTwo = [800*x(1)+2, -400*x(1); -400*x(2), 200];
alpha(0) = 0;
alpha(1) = 1;
c1 = 10^-4;
c2 = 0.9;
for i = 1:nsteps
if (f(alpha(i)) > f(0)+c1*grad(0)||(f(alpha(i)) > f(alpha(i-1))))
alpha = lszoom(alpha(i-1), alpha(i));
return;
end
if abs(grad(alpha(i))) <= abs(c2*grad(0))
alpha = alpha(i);
return;
end
if grad(alpha(i)) >= 0
alpha = lszoom(alpha(i), alpha(i-1));
return;
end
alpha(i+1) = 2*alpha;
end
Error('step size alpha not found within 10 iterations')
end
function [alpha] = lszoom(alphalo, alphahigh)
syms x
f = @(x)100*(x(2) - x(1)^2)^2 + (1 - x(1))^2;
grad = [-400*(x(2)-x(1)^2)*x(1)-2*(1-x(1)); 200*(x(2)-x(1)^2)];
gradTwo = [800*x(1)+2, -400*x(1); -400*x(2), 200];
alpha(0) = 0;
alpha(1) = 1;
c1 = 10^-4;
c2 = 0.9;
nsteps = 50;
for i = 1:nsteps
alpham = (alphalo + alphahigh) / 2;
if (f(alpham) > alpha(0)+c1*alpham*grad(0)||f(alpham)>f(alphalo))
alphahigh = alpham;
else
if abs(grad(alpham)) <= c2*abs(grad(0))
alpha = alpham;
return;
end
if grad(alpham)*(alphahigh-alphalo) >= 0
alphahigh = alphalo;
end
alphalo = alpham;
end
end
Error('step length alpha not found within 50 iterations')
end
Both algorithms give me the error:
"Index exceeds the number of array elements (1)
Error in sym/subsref (line 900)
R_tilde = builtin('subsref',L_tilde,Idx);
Error in lszoom (line 4)
grad = [-400*(x(2)-x(1)^2)*x(1)-2*(1-x(1)); 200*(x(2)-x(1)^2)];"
1 Comment
Answers (2)
Daniele Mori
on 21 Apr 2023
Edited: Daniele Mori
on 21 Apr 2023
Hi Sarah,
I modified your code and now it seems to work.
If you have any questions, please tell me.
Best reguards,
Daniele
syms x y
fun = 100*(y - x^2)^2 + (1 - x)^2;
d = gradient(fun);
f = matlabFunction(fun);
grad = matlabFunction(d);
x_0 = 5;
y_0 = 5;
in_point = [x_0,y_0];
s = -grad(x_0,y_0);
phi = @(alpha)f(in_point(1) + alpha*s(1),in_point(2) + alpha*s(2));
d_phi = @(alpha)grad(in_point(1) + alpha*s(1),in_point(2) + alpha*s(2))'*s;
alpha_0 = 0;
alpha_max = 1;
alpha(1) = (alpha_0 + alpha_max)/2;
c1 = 10^-4;
c2 = 0.1;
i = 1;
while 1
if (phi(alpha(i) > phi(0)+c1*alpha(i)*d_phi(0)) || (phi(alpha(i)) > phi(alpha_0)) && i>1)
[alpha_star,n] = lszoom(alpha_0,alpha(i),phi,d_phi);
break;
end
if abs(d_phi(alpha(i))) <= abs(c2*d_phi(0))
alpha_star = alpha(i);
break;
end
if d_phi(alpha(i)) >= 0
[alpha_star,n] = lszoom(alpha(i),alpha_0,phi,d_phi);
break;
end
alpha_0 = alpha(i);
alpha(i+1) = (alpha_0 + alpha_max)/2;
i = i+1;
end
function [alpha_star,n] = lszoom(alphalo,alphahigh,phi,d_phi)
c1 = 10^-4;
c2 = 0.1;
n=1;
while 1
alpham = (alphalo + alphahigh) / 2;
if (phi(alpham) > phi(0)+c1*alpham*d_phi(0)||phi(alpham)>phi(alphalo))
alphahigh = alpham;
else
if abs(d_phi(alpham)) <= -c2*d_phi(0)
alpha_star = alpham;
return;
end
if d_phi(alpham)*(alphahigh-alphalo) >= 0
alphahigh = alphalo;
end
alphalo = alpham;
end
n = n+1;
end
end
0 Comments
See Also
Categories
Find more on Characters and Strings 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!