Precedente | Indice | Successivo |
Scopo: | fattorizzazione di Cholesky di una matrice A simmetrica definita positiva |
Specifiche: |
subroutine chol(a, l, n, ifail) integer n,ifail real a(n * (n+1)/2), l(n* (n+1)/2) |
Descrizione: |
Backgroud del problema
Il problema riguarda la fattorizzazione di una matrice quadrata. Nel caso in cui la matrice sia simmetrica 'definita positiva', il procedimento risulta semplificato per due ragioni: non è necessario pivoting ed è possibile operare solo sul triangolo inferiore della matrice, essendo quello superiore il trasposto dell'inferiore. Pertanto, la fattorizzazione della matrice consisterà nel prodotto di due matrici L e Lt, la prima triangolare inferiore, la seconda trasposta della prima. La determinazione degli elementi della matrice L={lij} avviene nel seguente modo: La matrice in ingresso deve essere 'definita positiva' , perché in caso contrario, nella (3.1) si calcolerebbero radici complesse e nella (3.2) si eseguirebbero divisioni per zero, rendendo in entrambi i casi impossibile l'applicazione dell'algoritmo. Descrizione dell'algoritmo Caratteristica fondamentale dell'algoritmo è quella di operare non su di una matrice n*n, ma su di un vettore di lunghezza n*(n+1)/2 (array in formato packed) ottenendo così una diminuzione notevole della complessità sia di tempo che di spazio. Raccomandazioni sull'uso Se si desidera fattorizzare una matrice AÎ Mnxn(R)è necessario che questa sia simmetrica e definita positiva; bisogna fornire in ingresso un vettore di lunghezza n*(n+1)/2 contenente solo gli elementi del triangolo inferiore della matrice da fattorizzare, compresi quelli della diagonale, ordinati per righe. In uscita la subroutine fornirà un vettore contenente gli elementi della matrice L, triangolare inferiore, tale che A=L*Lt. |
Bibliografia: | [1], [2] |
Parametri di I/O: |
input a - vettore di reali, elementi del triangolo inferiore di A n - intero, ordine della matrice
output |
Indicatori d'errore: |
Errori gestiti dalla subroutine: ifail = 0 nessun errore ifail = 3 la dimensione inserita non è valida ifail = 5 la matrice inserita non è positiva definita |
Routines ausiliarie: | nessuna |
Tempo d'esecuzione: | La complessità asintotica O(n3/6) |
Memoria richiesta: | sono dichiarati due array di dimensione n*(n+1)/2 |
Accuratezza fornita: | metodo esatto a meno del condizionamento della matrice e degli errori di round-off |
Esempio di programma chiamante: |
Program chold c Programma dimostrativo della subroutine chol external chol integer dim parameter (dim=100) real a(dim*(dim+1)/2),l(dim*(dim+1)/2) integer n,ifail character*12 fin,fout print* print*,'*** PROGRAMMA DIMOSTRATIVO DELLA SUBROUTINE CHOL ***' print* write(*,10)'Ordine della matrice (max ',dim,') = ' read(*,*)n print*,'Nome del file di input = ' read(*,'(A)')fin open(11,FILE=fin,STATUS='OLD') do 1 i=1,n*(n+1)/2 read(11,*)a(i) 1 continue close(11) call chol(a,l,n,ifail) if (ifail .eq. 3) stop 'Errore! dimensioni non valide' if (ifail .eq. 5) stop 'Errore! matrice non definita positiva' print*,'Nome del file di output = ' read(*,'(A)')fout open(12,FILE=fout) write(12,20)(l(i),i=1,n*(n+1)/2) close(12) print*,'Matrice fattorizzata = ' write(*,20)(l(i),i=1,n*(n+1)/2) 10 format (1X,A,I3,A) 20 format (1X,E14.7) End |
Precedente | Indice | Successivo |