Precedente Indice Successivo


Lut



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
e - vettore di reali, diagonale inferiore di A
f - vettore di reali, diagonale superiore di A
n - intero, ordine della matrice

output

d - vettore di reali, diagonale principale di U
e - vettore di reali, diagonale inferiore di L
f - vettore di reali, diagonale superiore di U
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 = 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