Documente Academic
Documente Profesional
Documente Cultură
Valoarea minimă globala este intr-o vale lungă , îngustă , în formă de parabolă. Pentru a găsi valea
este banal. Dar cu toate acestea, este dificila convergerea la minimul global.
𝑁−1
function f = phi_obj(a,x,d)
f=feval_obj( x + a*d);
end
function xmin=metoda_gradient(x0,eps)
%initializam vectori/matrice pentru memorarea gradientilor,
%a punctelor x generate de algoritm, etc
obj = @(x) 100*(x(1) - x(2)^2)^2 + (1-x(2)^2)+100*(x(2) - x(3)^2)^2 + (1-
x(3)^2)+100*(x(3) - x(4)^2)^2 + (1-x(4)^2)+100*(x(4) - x(5)^2)^2 + (1-
x(5)^2)+100*(x(5) - x(6)^2)^2 + (1-x(6)^2)+100*(x(6) - x(7)^2)^2 + (1-
x(7)^2)+100*(x(7) - x(8)^2)^2 + (1-x(8)^2)+100*(x(8) - x(9)^2)^2 + (1-
x(9)^2)+100*(x(9) - x(10)^2)^2 + (1-x(10)^2);
puncte_gradient=[];
puncte_iteratie=[];
valori_functie=[];
norme_gradienti=[];
%vom utiliza un vector g pentru a stoca gradientul curent
x=x0;
g=gradient(x);
while(norm(g)>eps)
g=gradient(x);
norm(g)
puncte_gradient=[puncte_gradient g];
puncte_iteratie=[puncte_iteratie x];
valori_functie=[valori_functie; feval_obj(x)];
norme_gradienti=[norme_gradienti; norm(g)];
alpha=fminsearch(@(alpha) phi_obj(alpha,x,-g),x0);
x = x-alpha*g;
end
xmin=x
%Pentru afisarea grafica a rezultatelor, avem urmatoarele instructiuni
t=1:length(valori_functie);
figure(1)
hold on
plot(t,norme_gradienti(t),'k--','LineWidth',1);
hold off
figure(2)
hold on
plot(t,valori_functie(t),'k--','LineWidth',1);
hold off
end
function alpha=backtrack_alpha(x,d)
alpha=1; t1=0.9; t2 = 0.2
W=gradient(x);
%Va trebui satisfacuta conditia Armijo:
while(feval_obj(x+alpha*d)>feval_obj(x)+t1*alpha*W'*d)
alpha=alpha*t2;
end
end
function xmin=metoda_gradient_backtracking(x0,eps)
%initializam vectori/matrice pentru memorarea gradientilor,
%a punctelor x generate de algoritm, etc
obj = 0;
n = size(x0);
for i=1:n
obj = obj + 100*(x(i) - x(i+1)^2)^2 + (1-x(i+1)^2)
end
puncte_gradient=[];
puncte_iteratie=[];
valori_functie=[];
norme_gradienti=[];
%vom utiliza un vector g pentru a stoca gradientul curent
x=x0;
g=gradient(x);
while(norm(g)>eps)
g=gradient(x);
norm(g)
puncte_gradient=[puncte_gradient g];
puncte_iteratie=[puncte_iteratie x];
valori_functie=[valori_functie; feval_obj(x)];
norme_gradienti=[norme_gradienti; norm(g)];
alpha=backtrack_alpha(x,-g);
x = x-alpha*g;
end
xmin=x
end
Bibliografie:
http://www.calpoly.edu/~aamendes/GTweb/LinearProgramming.pdf
https://en.wikipedia.org/wiki/Rosenbrock_function
http://www.mathworks.com/