Sunteți pe pagina 1din 5

Andrei-Daniel Ene 321AA

Functia lui Rosenbrock


În optimizarea matematică , funcția Rosenbrock este o funcție non-convexa utilizata ca o
problemă de test de performanță pentru algoritmii de optimizare, introdusa de Howard H. Rosenbrock în
1960. De asemenea, este cunoscuta sub numele de Valea lui Rosenbrock sau Funcția banană a lui
Rosenbrock.

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.

Forma generala a functiei este:

𝑁−1

𝑓(𝑥) = ∑ 100 ∙ (𝑥𝑖+1 − 𝑥𝑖2 )2 + (1 − 𝑥𝑖 )2


𝑖=1
unde x = [x1, …. , xN] ∈ RN.

Imaginea 3D a functiei pentru 2 variabile.

Tema 2 – Tehnici de Optimizare


1
Andrei-Daniel Ene 321AA

Valorile functiei pentru:


 Pas ideal
 Pas constant
 Pas backtracking

Normele gradientilor pentru:


 Pas ideal
 Pas constant
 Pas backtracking

Tema 2 – Tehnici de Optimizare


2
Andrei-Daniel Ene 321AA

Pentru metoda gradient voi folosi si urmatoarele functii implementate in MatLab:

 function g = gradient(x) % am facut gradient doar pentru primele 10


variabile
g = [
200*(x(1)-x(2)^2);
200*(x(2)-x(3)^2);
200*(x(3)-x(4)^2);
200*(x(4)-x(5)^2);
200*(x(5)-x(6)^2);
200*(x(6)-x(7)^2);
200*(x(7)-x(8)^2);
200*(x(8)-x(9)^2);
200*(x(9)-x(10)^2);
400*x(10)*(x(9)-x(10)^2)+2*(1-x(10));
];
end

 function obj = feval_obj(x)


obj = 0;
n = size(x);
for i=1:n-1
obj = obj + 100*(2*x(i+1) - x(i)^2)^2 + (1-x(i))^2;
end
end

 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

Tema 2 – Tehnici de Optimizare


3
Andrei-Daniel Ene 321AA

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

Pentru varianta metodei gradient cu pasul determinat de metoda de backtracking, se poate


inlocui in codul de mai sus functia fminsearch cu urmatoarea functie:

 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

Astfel codul pentru metoda gradient cu backtragking este:

 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

Tema 2 – Tehnici de Optimizare


4
Andrei-Daniel Ene 321AA

%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

Bibliografie:

 http://www.calpoly.edu/~aamendes/GTweb/LinearProgramming.pdf

 https://en.wikipedia.org/wiki/Rosenbrock_function

 http://www.mathworks.com/

Tema 2 – Tehnici de Optimizare


5

S-ar putea să vă placă și