%metodi iterativi per trovare il mininimo di funzioni f:R^N-->R
%con interpretazione grafica se N=2

clear
clc

N=2; %dimensione dominio f
toll=10e-10; %precisione approssimazione su || x^(k+1)-x^k ||_inf
it_max=1000;  %numero massimo di iterazioni

x0=[0.3; -1.0]; %x0=[0; -1.5]; %x0=[1.5; -4.5]; %x0=[2.5; -6]; x0=[-4; 3];

%::::::::::::: CORE ::::::::::::::::::::::

%P e' una matrice che contiene il risultato di ogni iterazione: La prima
%riga e' x^0, la k-ma riga e' x^(k-1).
%it e' il numero di righe di P (numero di iterazioni effettuate +1)

%[P,it]=gradiente_passo_fisso(x0,toll,it_max);
[P,it]=gradiente_passo_ottimale(x0,toll,it_max);

%:::::::::::::::::::::::::::::::::::::::::

soluz=P(it,:)'  %soluzione ( ultima delle x^k) )

%-------------------------------------
%plot (solo se N=2)
if N==2
 [x,y]=meshgrid(-10:0.1:10,-10:0.1:10);
 %creazione della matrice z contenente i valori della funzione 1/2 <Ax,x> - <b,x>, x in R^2
 for i=1:size(x,1)
    for j=1:size(y,2)
       v=[x(i,j) y(i,j)];
       z(i,j)=f(v);
    end
 end
 contour(x,y,z,60)  %disegna le curve di livello di 1/2 <Ax,x> - <b,x>
 axis square
 hold on
 plot(P(:,1),P(:,2),'ks-','markersize',2) %disegna gli x^k
 figure %apre una nuova finestra grafica
 mesh(x,y,z) %disegna il grafico di f
end

