Precedente | Indice | Successivo |
Scopo: | fattorizzazione di una matrice quadrata tridiagonale. |
Specifiche: |
subroutine lut(d, e, f, n, ifail) Integer n, ifail Real d(n), e(n-1), f(n-1) |
Descrizione: |
Backgroud del problema
Il problema in esame riguarda l'eliminazione di Gauss per una matrice quadrata tridiagonale 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 tridiagonali, senza applicazione di pivot, al fine di preservare la struttura della matrice. Raccomandazioni sull'uso E' necessario fornire in ingresso alla routine una matrice avente i minori principali non singolari (teorema LU). Tale matrice, supposta di ordine n, deve essere inserita sotto forma di tre vettori d, e, f di lunghezza rispettivamente n, n-1, n-1, rappresentanti la diagonale principale, quella inferiore e quella superiore. Gli stessi vettori rappresentano in uscita la diagonale principale di U, quella inferiore di L e quella superiore di U. |
Bibliografia: | [1], [2] |
Parametri di I/O: |
input
d - vettore di reali, diagonale principale di A output
d - vettore di reali, diagonale principale di U |
Indicatori d'errore: |
Errori gestiti dalla subroutine: ifail = 0 nessun errore ifail = 3 la dimensione inserita non è valida (non positiva) ifail = 7 un minore è singolare |
Routines ausiliarie: | nessuna |
Tempo d'esecuzione: | la complessità asintotica è O(3*n) |
Memoria richiesta: | sono allocati tre array di dimensione n, n-1, n-1 |
Accuratezza fornita: | metodo esatto a meno del condizionamento della matrice e degli errori di round-off |
Esempio di programma chiamante: |
Program lutd c Programma dimostrativo della subroutine lut external lut integer dim parameter (dim=6) real d(dim),e(dim-1),f(dim-1) integer n,ifail character*12 fin,fout print* print*,'*** PROGRAMMA DIMOSTRATIVO DELLA SUBROUTINE LUT ***' 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 read(11,*)d(i) 1 continue do 2 i=1,n-1 read(11,*)e(i) 2 continue do 3 i=1,n-1 read(11,*)f(i) 3 continue close(11) call lut(d,e,f,n,ifail) if (ifail .eq. 3) stop 'Errore! dimensione non valida' if (ifail .eq. 5) stop 'Errore! minore principale singolare' print*,'Nome del file di output= ' read(*,'(A)')fout open(12,FILE=fout) write(12,20)(d(i),i=1,n) write(12,*) write(12,20)(e(i),i=1,n-1) write(12,*) write(12,20)(f(i),i=1,n-1) close(12) print*,'Matrice fattorizzata= ' print*,'diagonale principale= ' write(*,20)(d(i),i=1,n) print*,'diagonale inferiore= ' write(*,20)(e(i),i=1,n-1) print*,'diagonale superiore= ' write(*,20)(f(i),i=1,n-1) 10 format (1X,A,I3,A) 20 format (1X,E14.7) End |
Precedente | Indice | Successivo |