next up previous contents
Next: Calcolo del precondizionatore Up: Implementazione del prodotto matrice-vettore Previous: Caso non simmetrico   Indice

Caso simmetrico

Si vuole ora calcolare il prodotto (17) in cui $ A$ è matrice simmetrica di cui si memorizza la sola triangolare alta. Poiché gli elementi $ a_{ij}$ con $ j<i$ non sono ora immediatamente disponibili nella sequenza di coefficienti della riga $ i$, conviene scrivere la definizione (18) come:

$\displaystyle w_i = \displaystyle{\sum_{j=1}^{i-1}} a_{ji} v_j + \displaystyle{\sum_{j=i}^n} a_{ij} v_j$ (19)

avendo sfruttato la condizione per cui $ a_{ij} = a_{ji}$.

Dalla (19) si deduce che il contributo a $ w_i$ relativo agli elementi con $ j \geq i$ può essere implementato in maniera del tutto analoga a quanto fatto nel paragrafo precedente, mentre il contributo relativo agli elementi con $ j<i$ può essere determinato selezionando in SYSMAT le componenti $ k$ per cui JA$ (k)=i$, cioè appartenenti alla colonna $ i$-esima. È del tutto evidente, tuttavia, che questo modo di procedere, seppure intuitivo, risulta inapplicabile da un punto di vista pratico. Sarebbe, infatti, necessario procedere ad una ricerca su $ nt$ componenti per $ n$ volte, con un dispendio che renderebbe inutile il vantaggio fornito dalla memorizzazione compatta della matrice e, in certi casi, dalla convergenza accelerata del GCM.

Conviene osservare che gli elementi della triangolare alta della riga $ i$, oltre a contribuire al calcolo di $ w_i$, entrano in gioco, in virtù della simmetria di $ A$, anche nel calcolo di $ w_j$, con $ j$ pari all'indice di colonna dell'elemento considerato. All'interno del medesimo ciclo sulle righe $ i$ si aggiornerà pertanto non solo $ w_i$ ma anche tutti i $ w_j$ corrispondenti. L'algoritmo descritto nel precedente paragrafo viene quindi modificato nel modo seguente:




001 Per $ i=1,n$
002 azzero $ w_i$
003 Fine Per
004 Per $ i=1,n$
005 $ k:=$ IA$ (i)$
006 $ w_i:=w_i \; +$ SYSMAT $ (k) \cdot v_i$
007 Per $ k=$ IA$ (i)+1$, IA$ (i+1)-1$
008 $ j:=$ JA$ (k)$
009 $ w_i:=w_i \; +$ SYSMAT $ (k) \cdot v_j$
010 $ w_j:=w_j \; +$ SYSMAT $ (k) \cdot v_i$
011 Fine Per
012 Fine Per




Si noti che, a differenza dell'algoritmo utilizzato per matrici non simmetriche, in questo caso l'azzeramento del vettore prodotto $ \bw$ va fatto con un ulteriore ciclo (righe 1-3) esterno a quello di calcolo di $ \bw$. Inoltre, il contributo a $ w_i$ dato dall'elemento diagonale $ a_{ii}$ viene conteggiato a parte (riga 6) per evitare di considerarlo due volte nel ciclo successivo (corrisponde infatti al caso in cui $ i=j$).


next up previous contents
Next: Calcolo del precondizionatore Up: Implementazione del prodotto matrice-vettore Previous: Caso non simmetrico   Indice
Massimiliano Ferronato 2005-09-27