Post by Andrea D'AmoreIncolla un po' di codice allora :-)
Non aspettavo altro.....e' tutta roba matlab (in realtà il programma è in
java, ma funziona molto peggio....probabilmente c'è qualche errore, ma prima
vorrei testare l'algoritmo)
x = [-1.2; 1]; % Punto iniziale
k = 0; % Numero di iterazioni dell'algoritmo
eta = 0.05;
epsilon = 8.4;
arm_delta = 0.5;
arm_gamma = 0.0002;
while norm(grad(x)) >= 1E-5
d = trovaDir(x, epsilon, eta, k); % Ricerco una direzione con il
metodo delle dir coniugate
passo = armijo(x, d, arm_delta, arm_gamma);
x = x + passo * d;
k = k + 1;
end
disp ( ['Ho terminato la minimizzazione in iterazini: ', num2str(k)]);
disp ('il vettore soluzione');
disp(x);
disp('La funzione vale');
val = f(x);
disp(val);
Ora il codice per la ricerca della direzione e quello con il metodo di
Armijo per la ricerca del passo
[ trovaDir ]
h = hessiano(x);
g = grad(x);
s = -g;
q = g;
di = [ 0; 0 ];
i = 0;
while (true)
if s'*h*s <= epsilon * (s'*s)
if i == 0
d = -g;
break;
else
d = di;
break;
end
end
num = q'*s;
den = s'*h*s;
alfa = -1 * (num/den);
di = di + alfa*s;
q = q + alfa*h*s;
tmp = min(k, norm(g));
if norm(q) <= eta * g * tmp
d = di;
break;
end
num = q'*h*s;
beta = num/den;
s = -q + beta * s;
i = i +1;
end
[ /trovaDir ]
[ Armijo ] Che è veramente banale...
alfa = 1;
nf = 0;
while (true)
x_nuovo = x + alfa * d;
if f(x_nuovo)<= f(x) + arm_gamma * grad(x)'*d
passo = 1;
break;
end
alfa = arm_delta * alfa;
nf = nf +1;
if nf == 10
disp('Armijo esce dopo 10 iterazioni....male...');
passo = alfa;
break;
end
end
[ /Armijo ]
Utilizzando la funzione
100*(x(2)-x(1)^2)^2+(1-x(1))^2
trovo la soluzione in 1664 iterazioni (tempo impiegato forse un paio di ms)
mentre dovrebbero essere 5-10 (secondo il professore)....
Io l'algoritmo l'ho preso pari pari dalle sue dispense......