Precedente Indice Successivo



Slup



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
p - vettore di interi, vettore delle permutazioni
b - vettore di reali, vettore dei termini noti
ldlu - intero, leading dimension di lu
n - intero, ordine del sistema

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