Precedente Indice Successivo



Slut



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

output

b - vettore di reali, soluzione del sistema
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 = 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