Tag Archives: Calcolo Numerico

Studio dell’indice di condizionamento su alcune classi di matrici, rispetto alla norma 1 [FORTRAN 77]

Il condizionamento in matematica, in particolare nel calcolo numerico, riguarda il rapporto tra errore commesso sul risultato di un calcolo e incertezza sui dati in ingresso. Un problema è ben condizionato quando la soluzione del problema con delle piccole variazioni, non differisce molto dalla soluzione del problema originale; al contrario, un problema mal condizionato è un problema dove le soluzioni sono molto sensibili a piccole perturbazioni dei dati iniziali. In questo programma, scritto in FORTRAN 77, viene studiato l’indice di condizionamento delle matrici di Toepliz, Henkel, Vandermonde e Wilkinson rispetto alla norma 1.

Source Code:

cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
c 			  Realizzazione a cura di: 												   
c 			- Paolo Musolino			
c 			- Maria Emanuela Aricò
c 			- Armando Ruggeri
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc

	PROGRAM main

	PARAMETER (n=4)
	REAL h(n,n), t(n,n), k(n,n), v(n,n), w(n,n), z(n,n), cond
	cond=0

c PREMESSA
	WRITE (*,*) '****************************************************'
	WRITE (*,*) 'Studio indice di condizionamento delle matrici'
	WRITE (*,*) 'di Toepliz, Henkel, Vandermonde e Wilkinson per la'
	WRITE (*,*) 'norma 1'
	WRITE (*,*) '****************************************************'
	WRITE (*,*)

c CREAZIONE MATRICI
	CALL hilbert(h, n)
	CALL toepliz(t, n)
	CALL toepliz2(z,n)
	CALL henkel(k, n)
	CALL vandermonde(v, n)
	CALL wilkinson (w, n)

c CALCOLO  E STAMPA CONDIZIONAMENTO
 	WRITE (*,*)
	WRITE (*,*) 'Indici di condizionamento' 
	CALL condz(h, n, cond)
	WRITE (*,*) 'Hilbert      :     ', cond
	CALL condz(t, n, cond)
	WRITE (*,*) 'Toepliz d.d  :     ', cond
	CALL condz(z, n, cond)
	WRITE (*,*) 'Toepliz n.d.d:     ', cond	
	CALL condz(k, n, cond)
	WRITE (*,*) 'Henkel       :     ', cond
	CALL condz(v, n, cond)
	WRITE (*,*) 'Vandermonde  :     ', cond
	CALL condz(w, n, cond)
	WRITE (*,*) 'Wilkinson    :     ', cond

	END

c SUBROUTINE DEL CALCOLO DELLE NORME
	SUBROUTINE norma (a, n, n1)

	INTEGER n
	REAL a(n,n), n1, x
	n1=0
	x=0

	DO j=1, n
	  DO i=1, n
	    x = x + abs(a(i,j))
	  ENDDO
	  IF(x .gt. n1) THEN
	      n1 = x
	  ENDIF
	  x = 0
	ENDDO

	END

		SUBROUTINE condz (a, n, cond)

	USE MSIMSL

	REAL a(n,n), ainv(n,n), cond, n1, n1inv
	PARAMETER  (lda=4, ldainv=4)
	CALL azzera(cond)
	n1 = 0
c CALCOLO INVERSA
	CALL LINRG (n, a, lda, ainv, ldainv)

c CALCOLO NORMA MATRICE
	CALL norma(a, n, n1)
c	WRITE (*,*) 'Norma 1        : ', n1
c CALCOLO NORMA MATRICE INVERSA
	CALL norma(ainv, n, n1inv)
c	WRITE (*,*) 'Norma 1 inversa: ', n1inv

c CALCOLO CONDIZIONAMENTO
	cond = n1 * n1inv

	END

	SUBROUTINE azzera (x)
	REAL x
	x=0
	END  

c MATRICE HILBERT
	SUBROUTINE hilbert (h, n)
	INTEGER n,i,j
	REAL h(n,n)
	DO i=1, n
	  DO j=1, n
	    h(i,j) = 1./(i+j-1)
	  ENDDO
	ENDDO
      WRITE (*,*) 'Matrice di Hilbert:' 
      DO i=1, n
	  WRITE (*,*) (h(i,j), j=1, n)
	ENDDO
	END

c MATRICE TOEPLIZ	DIAG. DOMINANTE
	SUBROUTINE toepliz (t, n)
	integer n,i,j 
	real vet(-(n-1):(n-1)),t(n,n)
	do i=-(n-1), (n-1)
	   vet(i) = 1
      enddo 
	write(*,*) 'Inserire vettore di 3 elementi per Toepliz d.d.'
	read (*,*) (vet(i), i=-1, 1)
	do i=1,n
	  do j=1,n
	    t(i,j)=vet(j-i)
	  enddo
	enddo
	write(*,*)'La matrice di Toepliz:'
	DO i=1, n
	WRITE (*,*) (t(i,j), j=1, n)
	ENDDO	
	END

c MATRICE TOEPLIZ
	SUBROUTINE toepliz2 (t, n)
	integer n,i,j 
	real vet(-(n-1):(n-1)),t(n,n)
	do i=-(n-1), (n-1)
	   vet(i) = 1
      enddo 
	write(*,*) 'Inserire vettore di 3 elementi per Toepliz non d.d.'
	read (*,*) (vet(i), i=-1, 1)
	do i=1,n
	  do j=1,n
	    t(i,j)=vet(j-i)
	  enddo
	enddo
	write(*,*)'La matrice di Toepliz:'
	DO i=1, n
	WRITE (*,*) (t(i,j), j=1, n)
	ENDDO	
	END

c MATRICE HENKEL
	SUBROUTINE henkel (k, n)
	integer n,i,j
	real vet(-(n-1):(n-1)),k(n,n) 
	do i=-(n-1), (n-1)
	   vet(i) = 1
      enddo 
	write(*,*) 'Inserire vettore di 3 elementi per la matrice Henkel'
	read (*,*) (vet(i), i=-1, 1)
	do i=1,n
	  do j=1,n
	    k(i,j)=vet(i+j-(n+1))
	  enddo
	enddo
	write(*,*)'La matrice di Henkel:'
	DO i=1, n
	WRITE (*,*) (k(i,j), j=1, n)
	ENDDO	
	END

c MATRICE VANDERMONDE
	SUBROUTINE vandermonde (k, n)
	integer n,i,j
	real k(n,n),vet(n),a,b,x
	write(*,*) 'Inserire estremo a per la matrice Vandermonde'
	read (*,*) a
	write(*,*) 'Inserire estremo b per la matrice Vandermonde'
	read (*,*) b
	x = (b-a)/(n-1)
	do i=1, n
	  vet(i) = a + (i-1)*x
	enddo
	do i=1,n
	  do j=1,n
	    k(i,j)=vet(i)**(j-1)
	  enddo
	enddo
	write(*,*)'La matrice di Vandermonde:'
	DO i=1, n
	   WRITE (*,*) (k(i,j), j=1, n)
	ENDDO	
	END

c MATRICE WILKINSON
	SUBROUTINE wilkinson (w, n)
	integer n,i,j
	REAL w(n,n)
	DO i=1, n
	  DO j=1, n
	    IF (i .eq. j) THEN
	       w(i,j) = 1
		ELSE IF (i .gt. j) THEN
		   w(i,j) = (-1)**(j-i+1)
		ELSE IF ((i .lt. j) .and. (j .eq. n)) THEN
		   w(i,j) = (-1)**i
		ELSE
		   w(i,j) = 0
		ENDIF
	  ENDDO
	ENDDO
	WRITE (*,*) 'La matrice di Wilkinson:'
	DO i=1, n
	  WRITE (*,*) (w(i,j), j=1, n)
	ENDDO	
	END
 

Eseguendo il nostro programma, possiamo vedere che l’ indice di condizionamento, rispetto alla norma 1, è molto alto per la matrice di Hilbert. Sono stati restituiti degli alti valori anche per quelli della matrice di Henkel. E’ bene notare che se la Toepliz diagonale dominante e la Toepliz non diagonale dominante hanno gli stessi valori, la Toepliz non diagonale dominante presenta un indice di condizionamento peggiore di quella diagonale dominante. Possiamo affermare, infine, che la matrice di Toepliz diagonale dominante, insieme a quella di Wilkinson sono due esempi di matrici ben condizionate.