Precedente | Indice | Successivo |
Scopo: | risoluzione di un sistema lineare A*x=b con A matrice tridiagonale |
Specifiche: |
subroutine slut(d, e, f, b, n, ifail) integer n, ifail real d(n), e(n-1), f(n-1), b(n) |
Descrizione: |
Backgroud del problema
Si deve risolvere un sistema lineare A*x=b di n equazioni in n incognite, attraverso la risoluzione del sistema equivalente (L*U)*x=P*b con P vettore delle permutazioni e L*U=P*A, con A, matrice dei coefficienti del sistema tridiagonale. Descrizione dell'algoritmo Per risolvere il sistema (L*U)*x=P*b l'algoritmo esegue prima una forward substitution per calcolare la soluzione del sistema L*y=P*b, poi una backward substitution per computare il sistema U*x=y. Le procedure di risoluzione per sostituzione implementate, sono progettate appositamente per matrici tridiagonali. Raccomandazioni sull'uso La matrice dei coefficienti di A deve essere ricevuta in ingresso sotto forma di tre vettori, contenenti rispettivamente la diagonale principale, quella inferiore e quella superiore di A. La dimensione n della matrice deve essere positiva. In uscita il vettore b dei termini noti contiene la soluzione del sistema, si consiglia di effettuarne una copia se si ha necessità di un loro riutilizzo. |
Bibliografia: | [1], [2] |
Parametri di I/O: |
input
d - vettore di reali, diagonale principale di A 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 è valida (non positiva) ifail = 4 la matrice inserita è singolare |
Routines ausiliarie: | nessuna |
Tempo d'esecuzione: | la complessità asintotica è O(3*n) |
Memoria richiesta: | sono allocati quattro array di cui due di dimensione n, e due di dimensione n-1 |
Accuratezza fornita: | metodo esatto a meno del condizionamento della matrice e degli errori di round-off |
Esempio di programma chiamante: |
Program slutd c Programma dimostrativo della subroutine slut external slut integer dim parameter (dim=6) real d(dim),e(dim-1),f(dim-1),b(dim) integer n,ifail character*12 fin print* print*,'*** PROGRAMMA DIMOSTRATIVO DELLA SUBROUTINE SLUT ***' print* write(*,10)'Ordine del sistema (max ',dim,')= ' read(*,*)n print*,'Nome del file di input= ' read(*,'(A)')fin open(11,FILE=fin) 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 do 4 i=1,n read(11,*)b(i) 4 continue close(11) call slut(d,e,f,b,n,ifail) if (ifail .eq. 3) stop 'Errore! dimensione non valida' if (ifail .eq. 4) stop 'Errore! matrice singolare' print*,'Soluzione del sistema= ' write(*,20)(b(i),i=1,n) 10 format (1X,A,I3,A) 20 format (1X,E14.7) End |
Precedente | Indice | Successivo |