[Ottimizzazione] Risoluzione sistema lineare
Salve, devo implementare per esercizio un programmino matlab che risolva un sistema lineare tramite minimizzazione di una funzione quadratica con un metodo del gradiente con:
-direzione calcolata tramite Steepest descent
-steplength calcolato dalla regola di armijo
mi pare uguale a com'è dal punto di vista teorico: tramite armijo mi calcolo lo steplength e costruisco la successione di vettori in direzione opposta al gradiente.. solo che dopo un po di iterazioni sembra che le componenti di x vadano in overflow..
-direzione calcolata tramite Steepest descent
-steplength calcolato dalla regola di armijo
function y = f(A, x, b) y = (1/2)*x'*A*x -b'*x; end
function alfa = armijo(A, x, b, g, s, beta, sigma) alfa = s; while f(A, x -alfa*g, b) > f(A, x, b)+sigma*alfa*g'*g alfa = beta*alfa; end end
function x = steepest(A, b, max_it, toll)
n = length(A);
x_prec = rand(n, 1);
g = A*x_prec-b;
for k=1 : max_it
if norm(g) < toll*norm(b)
disp('condizione sulla norma raggiunta');
break;
end
alfa = armijo(A, x_prec, b, g, 1, 0.5, 1e-4);
x = x_prec -alfa*g;
g = A*x-b;
x_prec = x;
end
end
mi pare uguale a com'è dal punto di vista teorico: tramite armijo mi calcolo lo steplength e costruisco la successione di vettori in direzione opposta al gradiente.. solo che dopo un po di iterazioni sembra che le componenti di x vadano in overflow..
Risposte
Problema risolto, in realtà l'algoritmo funziona.. ma non avevo notato che le matrici con cui stavo testando non erano simmetriche definite positive