Line Search Algorithm help
36 Ansichten (letzte 30 Tage)
Ältere Kommentare anzeigen
This part is just the background to the algorithms I am working on:


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 Kommentar
Antworten (2)
Daniele Mori
am 21 Apr. 2023
Bearbeitet: Daniele Mori
am 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 Kommentare
Siehe auch
Kategorien
Mehr zu Symbolic Math Toolbox finden Sie in Help Center und File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!