Metodo del gradiente coniugato

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 aritmetica esatta) 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 x R n {\displaystyle \mathbf {x} \in \mathbb {R} ^{n}} del sistema lineare

A x = b {\displaystyle A\mathbf {x} =\mathbf {b} }

dove A R n × n {\displaystyle A\in \mathbb {R} ^{n\times n}} è una matrice simmetrica e definita positiva a coefficienti reali e b R n {\displaystyle \mathbf {b} \in \mathbb {R} ^{n}} è il termine noto.

La matrice A {\displaystyle A} , grazie alle sue proprietà, induce un prodotto scalare , A : R n × R n R {\displaystyle \langle \cdot ,\cdot \rangle _{A}:\mathbb {R} ^{n}\times \mathbb {R} ^{n}\to \mathbb {R} } definito da

u , v A := u T A v , u , v R n . {\displaystyle \langle \mathbf {u} ,\mathbf {v} \rangle _{\mathbf {A} }:=\mathbf {u} ^{T}\mathbf {A} \mathbf {v} ,\qquad \forall \mathbf {u} ,\mathbf {v} \in \mathbb {R} ^{n}.}

Una coppia di vettori u , v {\displaystyle \mathbf {u} ,\mathbf {v} } che soddisfa u , v A = 0 {\displaystyle \langle \mathbf {u} ,\mathbf {v} \rangle _{A}=0} , cioè ortogonale rispetto a questo prodotto scalare, si dice A {\displaystyle A} -coniugata.

Inoltre la soluzione x {\displaystyle \mathbf {x} } del sistema lineare precedente corrisponde al punto di minimo della forma quadratica

Q ( x ) = 1 2 x T A x x T b . {\displaystyle Q(\mathbf {x} )={\frac {1}{2}}\mathbf {x} ^{T}A\mathbf {x} -\mathbf {x} ^{T}\mathbf {b} .}

Infatti:

Q ( x ) = A x b {\displaystyle \nabla Q(\mathbf {x} )=A\mathbf {x} -\mathbf {b} }

da cui

Q ( x ) = 0 A x = b . {\displaystyle \nabla Q(\mathbf {x} )=0\Leftrightarrow A\mathbf {x} =\mathbf {b} .}
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. {\displaystyle n=2.} La soluzione iniziale è, per entrambi i metodi, x 0 = [ 2 , 2 ] T {\displaystyle \mathbf {x} _{0}=[-2,2]^{T}} e la soluzione esatta del sistema è x 0 = [ 2 , 2 ] T . {\displaystyle \mathbf {x} _{0}=[2,-2]^{T}.}

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

Alla k {\displaystyle k} -esima iterazione la soluzione viene dunque aggiornata nel modo seguente:

x k + 1 = x k + α k p k , {\displaystyle \mathbf {x} _{k+1}=\mathbf {x} _{k}+\alpha _{k}\mathbf {p} _{k},}

dove α k R + {\displaystyle \alpha _{k}\in \mathbb {R} ^{+}} corrisponde alla lunghezza del passo di discesa. È possibile dimostrare (si veda ad esempio Soluzione di sistemi lineari) che la scelta ottimale per α k {\displaystyle \alpha _{k}} , che porta cioè al minimo di Q ( x k + 1 ) {\displaystyle Q(\mathbf {x} _{k+1})} , è

α k = p k T r k p k T A p k , {\displaystyle \alpha _{k}={\frac {\mathbf {p} _{k}^{\mathsf {T}}\mathbf {r} _{k}}{\mathbf {p} _{k}^{\mathsf {T}}A\mathbf {p} _{k}}},}

dove

r k = b A x k {\displaystyle \mathbf {r} _{k}=\mathbf {b} -A\mathbf {x} _{k}}

è il residuo del sistema.

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

p k + 1 = r k + 1 β k p k , {\displaystyle \mathbf {p} _{k+1}=\mathbf {r} _{k+1}-\beta _{k}\mathbf {p} _{k},}

con p 0 = r 0 {\displaystyle \mathbf {p} _{0}=\mathbf {r} _{0}} ; la scelta ottimale per β k {\displaystyle \beta _{k}} è

β k = p k T A r k + 1 p k T A p k . {\displaystyle \beta _{k}={\frac {\mathbf {p} _{k}^{T}A\mathbf {r} _{k+1}}{\mathbf {p} _{k}^{T}A\mathbf {p} _{k}}}.}

Algoritmo risolutivo

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

x 0 = v e t t o r e   i n i z i a l e   a r b i t r a r i o r 0 = b A x 0 p 0 = r 0 for  k = 0 , , n α k = p k T r k p k T A p k x k + 1 = x k + α k p k r k + 1 = b A x k + 1 β k = p k T A r k + 1 p k T A p k p k + 1 = r k + 1 β k p k k = k + 1 end . {\displaystyle {\begin{aligned}&\mathbf {x} _{0}=vettore\ iniziale\ arbitrario\\&\mathbf {r} _{0}=\mathbf {b} -A\mathbf {x} _{0}\\&\mathbf {p} _{0}=\mathbf {r} _{0}\\&{\text{for }}k=0,\dots ,n\\&\qquad \alpha _{k}={\frac {\mathbf {p} _{k}^{\mathsf {T}}\mathbf {r} _{k}}{\mathbf {p} _{k}^{\mathsf {T}}A\mathbf {p} _{k}}}\\&\qquad \mathbf {x} _{k+1}=\mathbf {x} _{k}+\alpha _{k}\mathbf {p} _{k}\\&\qquad \mathbf {r} _{k+1}=\mathbf {b} -A\mathbf {x} _{k+1}\\&\qquad \beta _{k}={\frac {\mathbf {p} _{k}^{T}A\mathbf {r} _{k+1}}{\mathbf {p} _{k}^{T}A\mathbf {p} _{k}}}\\&\qquad \mathbf {p} _{k+1}=\mathbf {r} _{k+1}-\beta _{k}\mathbf {p} _{k}\\&\qquad k=k+1\\&{\hbox{end}}.\end{aligned}}}

L'eventuale implementazione dell'algoritmo in aritmetica floating point, in cui la convergenza in al più n {\displaystyle n} passi non è garantita, il ciclo for può essere sostituito da un ciclo while che verrà eseguito finché la norma del residuo r k {\displaystyle \|\mathbf {r} _{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 {\displaystyle A} . Si introduca a tal fine una matrice di precondizionamento P {\displaystyle 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 x ^ {\displaystyle {\hat {\mathbf {x} }}} del seguente sistema:

R 1 A R 1 x ^ = R 1 b {\displaystyle R^{-1}AR^{-1}{\hat {\mathbf {x} }}=R^{-1}\mathbf {b} } ,

dove R {\displaystyle R} è la radice quadrata di P {\displaystyle P} e x ^ = R x {\displaystyle {\hat {\mathbf {x} }}=R\mathbf {x} } .

Lo schema risolutivo in questo caso diventa[2]:

for  k = 0 , , n α k = p k T r k p k T A p k x k + 1 = x k + α k p k r k + 1 = b A x k + 1 trovare la soluzione  z k + 1  del sistema  P z k + 1 = r k + 1 β k = p k T A z k + 1 p k T A p k p k + 1 = z k + 1 β k p k k = k + 1 end . {\displaystyle {\begin{aligned}&{\text{for }}k=0,\dots ,n\\&\qquad \alpha _{k}={\frac {\mathbf {p} _{k}^{\mathsf {T}}\mathbf {r} _{k}}{\mathbf {p} _{k}^{\mathsf {T}}A\mathbf {p} _{k}}}\\&\qquad \mathbf {x} _{k+1}=\mathbf {x} _{k}+\alpha _{k}\mathbf {p} _{k}\\&\qquad \mathbf {r} _{k+1}=\mathbf {b} -A\mathbf {x} _{k+1}\\&\qquad {\text{trovare la soluzione }}\mathbf {z} _{k+1}{\text{ del sistema }}P\mathbf {z} _{k+1}=\mathbf {r} _{k+1}\\&\qquad \beta _{k}={\frac {\mathbf {p} _{k}^{T}A\mathbf {z} _{k+1}}{\mathbf {p} _{k}^{T}A\mathbf {p} _{k}}}\\&\qquad \mathbf {p} _{k+1}=\mathbf {z} _{k+1}-\beta _{k}\mathbf {p} _{k}\\&\qquad k=k+1\\&{\hbox{end}}.\end{aligned}}}

Analisi dell'errore

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

e k A 2 c k 1 + c 2 k e 0 A , {\displaystyle \|\mathbf {e} _{k}\|_{A}\leq {\frac {2c^{k}}{1+c^{2k}}}\|\mathbf {e} _{0}\|_{A},}

dove

c = κ ( A ) 1 κ ( A ) + 1 , {\displaystyle c={\frac {{\sqrt {\kappa (A)}}-1}{{\sqrt {\kappa (A)}}+1}},}

κ ( A ) {\displaystyle \kappa (A)} il numero di condizionamento in norma 2 {\displaystyle 2} di A {\displaystyle A} e x A := x , x A {\displaystyle \|\mathbf {x} \|_{A}:=\langle \mathbf {x} ,\mathbf {x} \rangle _{A}} è la norma indotta da A {\displaystyle A} .

Nel caso precondizionato vale la stessa stima con

c = κ ( P 1 A ) 1 κ ( P 1 A ) + 1 . {\displaystyle c={\frac {{\sqrt {\kappa (P^{-1}A)}}-1}{{\sqrt {\kappa (P^{-1}A)}}+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

  1. ^ Hestenes, M. e Stiefel, E., Methods of Conjugate Gradients for Solving Linear Systems (PDF), in Journal of Research of the National Bureau of Standards, vol. 49, n. 6, 1952, pp. 409-436. URL consultato il 17 giugno 2016 (archiviato dall'url originale il 22 aprile 2021).
  2. ^ a b c Quarteroni, Sacco, Saleri.

Bibliografia

  • A. Quarteroni, R. Sacco e F. Saleri, Matematica numerica, 4ª ed., Milano, Springer Verlag, 13 marzo 2014, ISBN 978-88-470-5643-5.

Voci correlate

Collegamenti esterni

  • Il metodo del Gradiente Coniugato (PDF), su ing.unibs.it. URL consultato il 17 giugno 2016.
  • Metodo del gradiente coniugato per la soluzione di sistemi lineari (PDF), su bugs.unica.it. URL consultato il 17 giugno 2016.
  • (EN) An Introduction to the Conjugate Gradient Method Without the Agonizing Pain (PDF), su cs.cmu.edu. URL consultato il 17 giugno 2016.
Controllo di autoritàLCCN (EN) sh85031141 · GND (DE) 4255670-3 · BNF (FR) cb12168447j (data) · J9U (ENHE) 987007555420405171
  Portale Matematica: accedi alle voci di Wikipedia che trattano di matematica