Metodo del gradiente coniugato

Da testwiki.
Versione del 20 giu 2024 alle 07:33 di imported>Mat4free (elimino inciso decontestualizzato dopo la traduzione dall'inglese)
(diff) ← Versione meno recente | Versione attuale (diff) | Versione più recente → (diff)
Vai alla navigazione Vai alla ricerca

In analisi numerica, il metodo del gradiente coniugato (spesso abbreviato in CG, dall'inglese conjugate gradient) è un algoritmo per la risoluzione numerica di un sistema lineare la cui matrice sia simmetrica e definita positiva.

Il metodo è stato inizialmente proposto nel 1952 dai matematici Magnus Hestenes e Eduard Stiefel[1] e costituisce una variante del metodo del gradiente in cui la direzione di discesa a ogni passo è scelta in modo tale da garantire la convergenza del metodo in un numero di iterazioni pari al più alla dimensione del sistema da risolvere.

Il metodo del gradiente biconiugato ne fornisce una generalizzazione al caso di matrici non simmetriche.

Descrizione del metodo

Si voglia calcolare la soluzione 𝐱n del sistema lineare

A𝐱=𝐛

dove An×n è una matrice simmetrica e definita positiva a coefficienti reali e 𝐛n è il termine noto.

La matrice A, grazie alle sue proprietà, induce un prodotto scalare ,A:n×n definito da

𝐮,𝐯𝐀:=𝐮T𝐀𝐯,𝐮,𝐯n.

Una coppia di vettori 𝐮,𝐯 che soddisfa 𝐮,𝐯A=0, cioè ortogonale rispetto a questo prodotto scalare, si dice A-coniugata.

Inoltre la soluzione 𝐱 del sistema lineare precedente corrisponde al punto di minimo della forma quadratica

Q(𝐱)=12𝐱TA𝐱𝐱T𝐛.

Infatti:

Q(𝐱)=A𝐱𝐛

da cui

Q(𝐱)=0A𝐱=𝐛.
Confronto tra il metodo del gradiente classico (in bianco) e metodo del gradiente con direzioni coniugate (in rosso) per la risoluzione di un sistema lineare di dimensione n=2. La soluzione iniziale è, per entrambi i metodi, 𝐱0=[2,2]T e la soluzione esatta del sistema è 𝐱0=[2,2]T.

Questo suggerisce di procedere iterativamente, partendo da una data soluzione iniziale 𝐱0 e muovendosi lungo direzioni {𝐩k}k=0n che minimizzano la forma quadratica Q(𝐱). A differenza del metodo del gradiente, in cui la direzione di discesa 𝐩k al k-esimo passo è scelta pari a 𝐩k=Q(𝐱k), nel caso del gradiente coniugato essa viene scelta in modo che risulti A-ortogonale alle direzioni precedenti, cioè 𝐩j,𝐩kA=0,j=0,,k1. Il significato geometrico di tale scelta è mostrato nella figura a lato, da cui emerge in particolare il vantaggio di scegliere direzioni A-ortogonali e non semplicemente ortogonali alle linee di livello della funzione Q(𝐱).

Alla k-esima iterazione la soluzione viene dunque aggiornata nel modo seguente:

𝐱k+1=𝐱k+αk𝐩k,

dove αk+ corrisponde alla lunghezza del passo di discesa. È possibile dimostrare (si veda ad esempio Soluzione di sistemi lineari) che la scelta ottimale per αk, che porta cioè al minimo di Q(𝐱k+1), è

αk=𝐩k𝖳𝐫k𝐩k𝖳A𝐩k,

dove

𝐫k=𝐛A𝐱k

è il residuo del sistema.

Un metodo per calcolare direzioni di discesa A-ortogonali alle precedenti è il seguente[2]:

𝐩k+1=𝐫k+1βk𝐩k,

con 𝐩0=𝐫0; la scelta ottimale per βk è

βk=𝐩kTA𝐫k+1𝐩kTA𝐩k.

Algoritmo risolutivo

Lo schema generale per la soluzione mediante metodo del gradiente coniugato è il seguente:

𝐱0=vettore iniziale arbitrario𝐫0=𝐛A𝐱0𝐩0=𝐫0for k=0,,nαk=𝐩k𝖳𝐫k𝐩k𝖳A𝐩k𝐱k+1=𝐱k+αk𝐩k𝐫k+1=𝐛A𝐱k+1βk=𝐩kTA𝐫k+1𝐩kTA𝐩k𝐩k+1=𝐫k+1βk𝐩kk=k+1end.

L'eventuale implementazione dell'algoritmo in aritmetica floating point, in cui la convergenza in al più n passi non è garantita, il ciclo for può essere sostituito da un ciclo while che verrà eseguito finché la norma del residuo 𝐫k non sia più piccola di una tolleranza impostata dall'utente.

Metodo del gradiente coniugato precondizionato

In molti casi è possibile accelerare ulteriormente la velocità di convergenza dell'algoritmo migliorando le proprietà di condizionamento della matrice A. Si introduca a tal fine una matrice di precondizionamento P simmetrica e definita positiva. L'algoritmo corrispondente al metodo del gradiente coniugato precondizionato (spesso abbreviato in PCG, dall'inglese preconditioned conjugate gradient) si ottiene applicando la versione senza precondizionamento per trovare la soluzione 𝐱^ del seguente sistema:

R1AR1𝐱^=R1𝐛,

dove R è la radice quadrata di P e 𝐱^=R𝐱.

Lo schema risolutivo in questo caso diventa[2]:

for k=0,,nαk=𝐩k𝖳𝐫k𝐩k𝖳A𝐩k𝐱k+1=𝐱k+αk𝐩k𝐫k+1=𝐛A𝐱k+1trovare la soluzione 𝐳k+1 del sistema P𝐳k+1=𝐫k+1βk=𝐩kTA𝐳k+1𝐩kTA𝐩k𝐩k+1=𝐳k+1βk𝐩kk=k+1end.

Analisi dell'errore

È possibile dimostrare che l'errore commesso alla k-esima iterazione del metodo del gradiente coniugato soddisfa la seguente stima[2]:

𝐞kA2ck1+c2k𝐞0A,

dove

c=κ(A)1κ(A)+1,

κ(A) il numero di condizionamento in norma 2 di A e 𝐱A:=𝐱,𝐱A è la norma indotta da A.

Nel caso precondizionato vale la stessa stima con

c=κ(P1A)1κ(P1A)+1.

Esempio di implementazione

Si riporta un esempio di possibile implementazione del metodo del gradiente coniugato non precondizionato compatibile con i linguaggi di programmazione Octave e MATLAB.

function [xk, iter] = gradiente_coniugato(A, b, x0, toll, nmax)
    xk = x0;        
    rk = b - A * xk;
    pk = rk;
    iter = 0;
    while (norm(rk) >= toll*norm(b))
        alphak = (pk' * rk) / (pk' * A * pk);
        xk = xk + alphak * pk;
        rk = b - A * xk;
        betak = (pk' * A * rk) / (pk' * A * pk);
        pk = rk - betak * pk;
        iter = iter+1;
      if (iter == nmax && norm(rk) > toll*norm(b)) 
        disp(['warning: Convergenza non raggiunta in ' num2str(iter) ' iterazioni!']);
        break
      end
    end
end

La funzione che implementa il metodo del gradiente coniugato precondizionato è già salvata in MATLAB nel comando pcg().
Esempio:

x=pcg(A,b) 
%determina la soluzione x del sistema lineare Ax=b di una matrice simmetrica e definita positiva mediante il metodo del gradiente coniugato a partire dal vettore iniziale x0 nullo.

x=pcg(A,b,tol,nmax)
%determina la soluzione x imponendo come criterio d'arresto la tolleranza e il numero di iterazioni.

Note

Bibliografia

Voci correlate

Collegamenti esterni

Template:Controllo di autorità Template:Portale