Visualizzazione post con etichetta octave. Mostra tutti i post
Visualizzazione post con etichetta octave. Mostra tutti i post

venerdì 8 ottobre 2010

OCTAVE: risolvere un sistema di equazioni lineari sparso

Supponiamo di aver inizializzato una matrice sparsa Q quadrata di dimensione 8x8.
Inizializziamo un vettore di termini noti, anch'esso sparso, in questo modo:
 b = sparse([1],[1],[1],8,1) 
Il sistema rappresentato da Q e b può essere risolto tramite metodo tradizionale (eliminazione di Gauss) con il seguente comando:
 x = Q \ b 
e tale comando vale sia per le matrici sparse che per quelle piene.

Se la matrice è più grande (molto più grande) possono essere necessari metodi meno tradizionali, potenzialmente meno accurati, ma spesso gli unici efficaci. Il sistema pruò essere risolto tramite metodi iterativi, il seguente comando risolve il sistema usando il metodo iterativo Preconditioned Conjugate Gradient:
 x = pcg(Q,b) 
Per sistemi particolarmente difficili da risolvere possono essere utilizzati dei cosiddetti precondizionatori:
 [L, U, P, R] = luinc (Q,1.e-3) 
x = pcg(Q,b,1.e-6,500,L*U)

Nell'esempio:
1.e-6, rappresenta la soglia di errore sotto la quale la soluzione si considera accettabile
500, rappresenta il numero massimo di iterazioni ammesse

OCTAVE: inizializzare una matrice sparsa

Il seguente comando per Octave
 Q = sparse([2 3 7],[1 2 7],[1 1 1],7,7) 
genera una matrice sparsa di dimensioni 7x7 in cui solo tre elementi sono diversi da 0 (e solo questi tre elementi sono effettivamente memorizzati): l'elemento in posizione (2,1), quello in posizione (3,2) e quello in posizione (7,7), tutti assumono valore 1.
Dei cinque parametri del comando, infatti, il primo vettore rappresenta l'insieme ordinato degli indici di riga, il secondo è il vettore ordinato degli indici di colonna e il terzo è il vettore, ancora ordinato, dei valori. I valori non nulli possono essere ancor più facilmente individuati sovrapponendo i tre vettori:
  riga      [2 3 7] 
colonna [1 2 7]
valore [1 1 1]

Il quarto ed il quinto parametro rappresentano le dimensioni complessive della matrice, in assenza di questi due parametri, Octave assume come dimensione della matrice i due indici massimi per riga e per colonna.
Se due valori differenti per lo stesso elemento vengono impostati, di default i due valori vengono sommati. Se si desidera che l'ultimo valore impostato sia l'unico corretto allora è necessario utilizzare un sesto argomento, in questo modo:
 Q = sparse([2 3 7 2],[1 2 7 1],[1 1 1 2],7,7,"unique") 
che, in questo caso, fa si che il valore associato alla posizione (2,1) sia pari a 2.