Precedente | Indice | Successivo |
Scopo: | risoluzione di un sistema lineare A*x=b, con A matrice a banda |
Specifiche: |
subroutine slub(a, b, lda, n, p, q, ifail) integer n, p, q, ifail real a(lda, n), b(n) |
Descrizione: |
Backgroud del problema
Il problema è quello della risoluzione di un sistema lineare A*x=b, dove A è una matrice a banda. Con banda inferiore p, e banda superiore q. Descrizione dell'algoritmo L'algoritmo effettua la risoluzione del sistema A*x=b, implementando la forward e la backward substitution. La matrice A è contenuta in un vettore compatto di dimensione (p+q+1,n). Raccomandazioni sull'uso La matrice A fornita alla subroutine slub deve essere in forma impaccata. Le prime q righe devono contenere le diagonali superiori della matrice fattorizzata U, la diagonale principale di U deve occupare la riga q+1 di A, mentre le diagonali inferiori di L sono contenute nelle p rimanenti righe. La matrice deve essere non singolare. La soluzione del sistema è ritornata nel vettore b. Si consiglia di salvarlo se necessario per ulteriori elaborazioni. |
Bibliografia: | [1], [2], [5] |
Parametri di I/O: |
input
a - 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 è 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: | l'algoritmo richiede l'esecuzione di (n-1)*p addizioni e moltiplicazioni per risolvere la forward substitution e di n*(q+1) moltiplicazioni e addizioni per la backward substitution, la complessità è asintotica dell'ordine O(n). |
Memoria richiesta: | in memoria sono allocati la matrice dei coefficienti e il vettore dei termini noti, 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 slubd c Programma dimostrativo della subroutine slubd external slub integer dim,maxp,maxq parameter (dim=10, maxp=4, maxq=4) real a(dim,maxp+maxq+1), b(dim) integer n,ifail,amp,p,q character*12 fin,fout print* print*,'*** PROGRAMMA DIMOSTRATIVO DELLA SUBROUTINE SLUB ***' 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') C lettura matrice fattorizzata (formato packed) do 2 i=1,amp do 1 j=1,n read(11,*)a(i,j) 1 continue 2 continue C lettura termine noto read(11,*) do i=1,n read(11,*)b(i) end do close(11) call slub(a,b,dim,n,p,q,ifail,log) if (ifail .eq. 3) stop 'Errore! dimensione non valida' if (ifail .eq. 6) stop 'Errore! ampiezza di banda non valida' 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) 30 format (1X,I3) End |
Precedente | Indice | Successivo |