Precedente Indice Successivo



Slub



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
b - vettore di reali, vettore dei termini noti
lda -intero, leading dimension di A
n - intero, ordine della matrice
p - intero, ampiezza di banda inferiore
q - intero, ampiezza di banda superiore

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 = 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