Precedente | Indice | Successivo |
Scopo: | risoluzione di un sistema lineare A*x=b |
Specifiche: |
Subroutine slup(lu, p, b, ldlu, n, ifail) integer ldlu, n, p(n), ifail real lu(ldlu, n), b(n) |
Descrizione: |
Backgroud del problema
Il problema è quello della risoluzione di 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 ed L*U=P*A Descrizione dell'algoritmo Per risolvere il sistema (L*U)*x=P*b l'algoritmo esegue prima una forward substitution per risolvere il sistema L*y=P*b e poi una backward substitution per il sistema U*x=y Raccomandazioni sull'uso La matrice lu deve contenere la fattorizzazione di A eseguita dalla subroutine Lup e non deve essere singolare. La dimensione ldlu deve essere positiva e pari alla dimensione di riga dichiarata nel programma chiamante. La dimensione n deve essere positiva e non maggiore di ldlu. Il vettore p deve contenere il vettore delle permutazioni restituito da Lup. In uscita il vettore b conterrà la soluzione del sistema. |
Bibliografia: | [1], [2] |
Parametri di I/O: |
input
lu - 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 = 4 la matrice inserita è singolare |
Routines ausiliarie: | nessuna. |
Tempo d'esecuzione: | complessità asintotica O(n2) |
Memoria richiesta: | sono allocati una matrice n*n, e tre vettori di dimensione n |
Accuratezza fornita: | metodo esatto a meno del condizionamento della matrice e degli errori di round-off |
Esempio di programma chiamante: |
Program slupd c Programma dimostrativo della subroutine slup external slup integer dim parameter (dim=6) real lu(dim,dim),b(dim) integer p(dim),n,ifail,log character*12 fin,fout print* print*,'*** PROGRAMMA DIMOSTRATIVO DELLA SUBROUTINE SLUP ***' print*,'*** RISOLUZIONE DI UN SISTEMA LINEARE Ax=b ***' print* write(*,10)'Ordine del sistema (max ',dim,') =' read(*,*)n print*,'Nome del file di input =' read(*,'(A)')fin open(11,FILE=fin,STATUS='OLD') do 2 i=1,n do 1 j=1,n read(11,*)lu(i,j) 1 continue 2 continue read(11,*) do 4 i=1,n read(11,*)b(i) 4 continue close(11) c fattorizzazione LU della matrice A call lup(lu,dim,n,p,ifail,1) c risoluzione di Ax=b call slup(lu,p,b,dim,n,ifail,log) if (ifail .eq. 3) stop 'Errore! dimensione non valida' if (ifail .eq. 4) stop 'Errore! matrice singolare' 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) end |
Precedente | Indice | Successivo |