Laboratorio di Calcolo. AA 2019/20.

Esercitazione n. 3

  1. Creare una nuova directory per i file relativi a questa esercitazione (per le istruzioni necessarie cfr. quanto fatto nell' esercitazione n. 2). Il seguente programma chiede il numero dei dati che verranno immessi, li legge e ne calcola la media aritmetica. Verificarne il corretto funzionamento e poi modificarlo aggiungendo il calcolo della media dei quadrati in modo da poter valutare anche la varianza (differenza tra media dei quadrati e quadrato della media). Suggerimento: il compio non è molto diverso da quello del punto 5 della scorsa esercitazione. Aggiungere una nuova variabile per la nuova quantità ed aggiungere il calcolo nello stesso ciclo do (un nuovo ciclo costringerebbe a riscrivere tutti i dati una seconda volta!).

    program media
      implicit none
      real :: aver,x
      integer :: i,N                                                  
    
      print*," N= ?"
      read*,N
      print*," immetti i dati uno alla volta"
    
      aver=0.0
      do i=1,N                                            
         read*,x
         aver = aver + x
      end do                      
      aver = aver/N
      print*," media di ",N," dati : ",aver
    end program media    
    


  2. Scrivere un programma che calcoli  e-x  usando le somme parziali della serie di Taylor:  ∑0 (-x)n/n!   troncata ad un valore n=nmax Controllare il risultato con la funzione EXP(-x),  per i valori di x=  0.1,  1,  10  e 100   in funzione di nmax (numero di termini utilizzati).
    Per il calcolo dei fattoriali, se occorre calcolarli, si può far riferimento all'  esercizio  precedente.

    Verificare se c' è  e  quanto è  grande la differenza tra il calcolo diretto e il calcolo mediante la formula e-x= 1/ex  (dove ex è ottenuto dalla serie ∑0 xn/n!  

  3. In un programma può essere utile utilizzare nomi simbolici al posto di costanti numeriche o di altro tipo. E' evidente che se si tratta di costanti non si desidera che il loro valore possa essere modificato. Per definire una costante simbolica (di qualsiasi tipo dati), si aggiunge alla dichiarazione di tipo dati  l' attributo  parameter. P.es.:  integer,parameter  :: i=2.   Come esempio,  cerchiamo di compilare il seguente programma:
     
    program par
    implicit none
    integer,parameter :: i=2
    print*,i
    i=i+1    
    
    print*,i , i+3 read*,i print*,i end program par
     
     
    osservare il messaggio di errore del compilatore  e poi modificare il programma eliminando le istruzioni che modificano  la costante simbolica i. 



  1. La funzione abs(x)  calcola il valore assoluto del suo argomento (con valori dello stesso tipo dati dell'  argomento).  Cosa scriverà  il seguente frammento di codice ?  Perché ? 
    integer :: n
    n=-2**30
    print*,abs(2*n)
              
    Ricordare la spiegazione data a lezione basata su come avviene un cambio di segno nella rappresentazione complemento a due.

  2. Scrivere un programma che scriva 5 interi consecutivi generati in un ciclo DO...END DO sommando per 5 volte il numero 1 al precedente valore di una variabile inizializzata fuori del ciclo con il valore 231-2.  Suggerimento:  231 supera il massimo intero rappresentabile a 32 bit e pertanto non può essere direttamente calcolato dal compilatore che utilizza il meccanismo di overflow invece di lavorare con le classi dei resti. Tuttavia  231-2, scritto come  2*(230-1),  non presenta problemi .

  3. Calcolare i fattoriali dei primi n interi e scriverli su schermo. Occorre organizzare il calcolo in modo simile al calcolo di una somma ma con un prodotto.
    Provare con n=30.

  4. Il seguente programma Fortran per il calcolo della derivata della funzione  x2 nel punto x=1 usando tre formule diverse per il rapporto incrementale è quello utilizzato nella lezione. Dove si vedono risultati numerici strani o sbagliati, si può provare ad individuare la parte del calcolo che  ne è all' origine. (Una tecnica di base di identificazione dei problemi consiste nell' inserire varie istruzioni di print nel sorgente per controllare a che punto dell' esecuzione insorge la condizione di errore). In particolare cercare di rispondere alle domande: a) quale istruzione del programma crea le condizioni  per le stranezze numeriche?  b) quale formula appare più  accurata ? c) cosa cambia se si usa un incremento di partenza (variabile deltax0) diverso (p.es. 0.2 o 0.25)? d) e se la funzione fosse exp(x)? Non è richiesto di elaborare teorie o spiegare il perché di quanto si osserva, solo di identificare la parte del calcolo che dà origine all' inaccuratezza dei risultati e accumulare evidenza numerica del comportamento.
        
    program der                                                      
    implicit none                                                               
    real :: x,xp,xm, f,fp, fm, deriv1,deriv2,deriv3, deltax,deltax0
    integer ::i                                                                     
    x = 1.0
    deltax0 = 0.1
    do i = 1,20
     deltax = deltax0**i
     xp = x + deltax
     xm = x - deltax
     f  = x**2
     fp = xp**2
     fm = xm**2
     deriv1 = ( fp - f ) / deltax     ! f'(x)=lim(deltax->0) (f(x+deltax)-f(x))/deltax
     deriv2 = ( fp - f ) / ( xp - x ) ! f'(x)=lim(deltax->0) (f(x+deltax)-f(x))/((x+deltax)-x)
     deriv3 = ( fp - fm ) / (2*deltax)! f'(x)=lim(deltax->0) (f(x+deltax)-f(x-deltax))/(2*deltax)
    
     print *, i,deltax, deriv1,deriv2, deriv3
    end do
    end program der
     


  5. Usare il programma per i fattoriali. Ricompilare lo stesso programma con l'istruzione di compilazione modificata:

    gfortran -fsanitize=signed-integer-overflow nomefile.f90

    dove nomefile.f90 sarà il nome dato al file fortran. Su Mac e su Linux qusta modalità di compilazione fa sì che venga generato un errore quando il programma esegue un'operazione che porta oltre il massimo o il minimo degli interi. Nel caso dell' installazione in mobaxterm, viene generato un messaggio di errore a livello di compilazione dovuto alla mancanza di una parte dl software necessario.

    Questo mostra come soluzioni troppo legate ad un compilatore o una piattaforma possano esser poco stabili o poco "portabili" da un sistema all' altro.

    Un esercizio potrebbe essere di pensare a come verificare se una moltiplicazione ha oltrepassato il massimo intero positivo.