Torna alla pagina di Analisi Numerica
:: Matlab - Metodo di Gauss-Seidel ::
% Metodo iterativo di Gauss-Seidel
% --------------------------------
% restituisce la soluzione del sistema x ed il numero
% di iterazioni effettuate it
% richiede come parametri di ingresso la matrice del sistema a,
% il termine noto b, il vettore iniziale x0, l'errore tollerato
% epsilon, il numero massimo di iterazioni consentite
function [x,it]=gaussseidel(a,b,x0,epsilon,nmax);
% calcola la dimensione della matrice a
[n,n] = size(a);
% inizializzo la variabile it per il conteggio delle iterazioni
it = 0;
% per verificare che l'errore sia inferiore a epsilon dobbiamo
% stimarlo a posteriori, a partire cioè da una quantità già
% calcolata. Uno stimatore è il residuo, definito da:
r = b - a * x0;
% posso utilizzare la norma del residuo per effettuare
% successivamente il test di arresto
res = norm(r);
% inizializzo la variabile x che utilizzerò e aggiornerò nelle
% varie iterazioni
x = x0;
% entro nel ciclo in cui avviene il calcolo delle soluzioni
% esco dal ciclo solo quando la norma del residuo è minore
% della tolleranza epsilon (1), o quando oltrepasso il
% numero massimo di iterazioni consentite (2)
% (1) (2)
% ------------- ---------
while res > epsilon & it < nmax
% incremento di 1 il numero di iterazioni
it = it + 1;
% ciclo in cui costruisco la sommatoria dei prodotti
% tra gli elementi della matrice e i valori già
% calcolati della variabile x
for i=1:n
% inizializzo la variabile s in cui andrò a formare
% la sommatoria
s = 0;
% devo spezzare il ciclo for in due distinti perché
% nella sommatoria non deve figurare il caso in
% cui j = i . Il primo for infatti arriva fino a
% (i-1), mentre il secondo parte da (i+1)
for j=1:i-1,
s = s + a(i,j) * x(j);
end
for j=i+1:n,
s = s + a(i,j) * x(j);
end
% costruzione dell'equazione al passo i-esimo
x(i) = (b(i) - s) / a(i,i);
end
% ricalcolo il residuo ad ogni iterata...
r = b - a * x;
% ...e subito dopo la sua norma, così da attualizzare
% il test di arresto che costituisce la condizione
% del ciclo
res = norm(r);
end
Torna alla pagina di Analisi Numerica