Precedente Indice Successivo


Lub



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
lda - intero, leading dimension
n - intero, ordine della matrice
p - intero, ampiezza di banda inferiore
q - intero, ampiezza di banda superiore

output

a - matrice di reali, matrice fattorizzata
ifail - intero, indicatore d'errore

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