Precedente | Indice | Successivo |
Scopo: | fattorizzazione di una matrice quadrata a banda |
Specifiche: |
subroutine lub(a, lda, n, p, q, ifail) integer n, p, q, ifail real a(lda, n) |
Descrizione: |
Backgroud del problema Si vuole implementare l'eliminazione di Gauss per una matrice quadrata a banda A, nella forma A=L*U, con L matrice triangolare inferiore a diagonale unitaria e U matrice triangolare superiore. Descrizione dell'algoritmo L'algoritmo implementa la fattorizzazione di Gauss particolarizzata per matrici a banda senza impiego di pivot, al fine di preservare la struttura della matrice. Tuttavia, affinché sia possibile applicare l'algoritmo di Gauss senza utilizzo di pivot, è necessario che la matrice sia a predominanza diagonale o simmetrica definita positiva. Raccomandazioni sull'uso Per essere eseguita, la subroutine necessita di una matrice di ingresso avente minori principali non singolari (teorema LU). Tale matrice, supposta di ordine n, deve essere inserita sotto forma impaccata, cioè come matrice avente, per dimensione di riga l'ampiezza della banda p+q+1 e per dimensione di colonna l'ordine della matrice. Tale matrice in uscita conterrà la matrice fattorizzata, quindi si consiglia di salvare la matrice di input se è necessaria per ulteriori elaborazioni. |
Bibliografia: | [1], [2], [5] |
Parametri di I/O: |
input
a - matrice di reali, matrice da fattorizzare output
a - matrice di reali, matrice fattorizzata |
Indicatori d'errore: |
Errori gestiti dalla subroutine: ifail = 0 nessun errore ifail = 3 la dimensione inserita non è valida (non positiva) ifail = 6 una delle ampiezze di banda non è valida ifail = 7 la matrice inserita ha un minore principale singolare |
Routines ausiliarie: | nessuna |
Tempo d'esecuzione: | la complessità asintotica è O(n). |
Memoria richiesta: | in memoria è allocata la sola matrice da fattorizzare, la complessità di spazio dipende quindi dalla leading dimension della matrice |
Accuratezza fornita: | metodo esatto a meno del condizionamento della matrice e degli errori di round-off |
Esempio di programma chiamante: |
Program lubd c Programma dimostrativo della subroutine lubd external lub integer dim, maxp, maxq, p, q parameter (dim=10, maxp=4, maxq=4) real a(dim,maxp+maxq+1) integer n,ifail,amp character*12 fin, fout print* print*,'*** PROGRAMMA DIMOSTRATIVO DELLA SUBROUTINE LUB ***' print* write(*,10)'Ordine della matrice (max ',dim,') = ' read(*,*)n write(*,10)'Ampiezza di banda inferiore (max ',maxp,') = ' read(*,*)p write(*,10)'Ampiezza di banda superiore (max ',maxq,') = ' read(*,*)q amp=p+q+1 print*,'Nome del file di input = ' read(*,'(A)')fin open(11,FILE=fin,STATUS='OLD') do 2 i=1,amp do 1 j=1,n read(11,*)a(i,j) 1 continue 2 continue close(11) call lub(a,dim,n,p,q,ifail) if (ifail .eq. 3) stop 'Errore! dimensione non valida' if (ifail .eq. 6) stop 'Errore! ampiezza di banda non valida' if (ifail .eq. 7) stop 'Errore! minore principale singolare' print*,'Nome del file di output =' read(*,'(A)')fout open(12,FILE=fout) write(12,20)((a(i,j),j=1,n),i=1,amp) close(12) print*,'Matrice fattorizzata =' write(*,20)((a(i,j),j=1,n),i=1,n) 10 format (1X,A,I3,A) 20 format (1X,E14.7) 30 format (1X,I3) End |
Precedente | Indice | Successivo |