Precedente | Indice | Successivo |
Scopo: | risoluzione di un sistema lineare A*x=b, con A matrice simmetrica definita positiva. |
Specifiche: |
Subroutine schol(l, b, n, ifail) integer n, ifail real l(n*(n+1)/2), b(n) |
Descrizione: |
Backgroud del problema
Il problema è relativo alla risoluzione di un sistema lineare A*x=b, con A matrice simmetrica definita positiva. Viste le caratteristiche di simmetria della matrice A, si effettua la fattorizzazione di Cholesky di A in modo da ottenere una matrice L, triangolare inferiore tale che A=L*Lt. In questo modo la risoluzione del sistema A*x=b è ricondotto alla risoluzione di (L*Lt)*x=b, al quale sono applicabili gli algoritmi di forward e backward substitution. Descrizione dell'algoritmo Caratteristica 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), contenente una matrice triangolare inferiore ottenuta dalla fattorizzazione di Cholesky della matrice A, ottenendo così una diminuzione notevole della complessità sia di tempo che di spazio. Per risolvere il sistema (L*Lt)*x=b l'algoritmo esegue prima una forward substitution per risolvere il sistema L*y=b e poi una backward substitution per il sistema Lt*x=y. La forward e la backward substitution sono implementate nella versione colonna. Per effettuare la backward substitution occorrerebbe calcolare Lt, trasposta di L, ma in realtà si opera sempre sulla matrice L. Raccomandazioni sull'uso Il vettore l deve contenere la fattorizzazione di A eseguita dalla subroutine Chol e non deve essere singolare. In uscita il vettore b conterrà la soluzione del sistema, quindi è opportuno salvare b se è necessario per ulteriori elaborazioni. |
Bibliografia: | [1], [2] |
Parametri di I/O: |
input
l- matrice di reali, matrice dei coefficienti output
b - vettore di reali, soluzione del sistema |
Indicatori d'errore: |
Errori gestiti dalla subroutine: ifail = 0 nessun errore ifail = 3 la dimensione inserita è non positiva o è superiore a ldlu ifail = 5 la matrice inserita non è definita positiva |
Routines ausiliarie: | nessuna |
Tempo d'esecuzione: | complessità asintotica O(n2) |
Memoria richiesta: | sono allocati un vettore n*(n-1)/2 , e un vettore di dimensione n. |
Accuratezza fornita: | metodo esatto a meno del condizionamento della matrice e degli errori di round-off |
Esempio di programma chiamante: |
Program schold c Programma dimostrativo della subroutine schol external schol integer dim parameter (dim=100) real l(dim*(dim+1)/2), b(dim) integer n,ifail character*12 fin,fout print* print*,'*** PROGRAMMA DIMOSTRATIVO DELLA SUBROUTINE SCHOL ***' 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,*)l(i) 1 continue do i=1, n read(11,*)b(i) end do close(11) call schol(l,b,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)(b(i),i=1,n) close(12) print*,'Soluzione del sistema = ' write(*,20)(b(i),i=1,n) 10 format (1X,A,I3,A) 20 format (1X,E14.7) |
Precedente | Indice | Successivo |