Sei sulla pagina 1di 197

Guida al FORTRAN

applicato

Lorenzo Zaninetti
zaninetti@ph.unito.it
Dipartimento di Fisica Generale
Edizione III
ii
Introduzione

Questa guida cerca di combinare due esigenze molto sentite al secon-


do anno del corso di Laurea in Fisica: un corso di introduzione ad un
linguaggio di programmazione scientifica e alcuni esempi di programmi
( funzionanti ! ) per l elaborazione dei dati raccolti durante le espe-
rienze di laboratorio. Abbiamo quindi dedicato il capitolo uno ad una
introduzione concisa al linguaggio di programmazione FORTRAN ed il
capitolo due alla descrizione dei programmi per l elaborazione dei dati
che possono essere usati dagli studenti in ambiente MS/DOS oppure
LINUX oppure UNIX. Per soddisfare le esigenze degli studenti degli
anni superiori riportiamo nel capitolo tre alcune subroutine di interesse
fisico-matematico che sono utilissime nei calcoli numerici di probabilita
e statistica scritte in FORTRAN-77 standard. In realta questa guida
puo essere anche utile agli studenti degli anni superiori e quindi dedi-
chiamo il capitolo quattro ai programmi del frattali e il capitolo cinque
a quelli dei sistemi Monte Carlo. L appendice A riporta le funzioni
intrinseche che possono essere richiamate dai programmi, l appendi-
ce B alcune subroutines di interesse comune, l appendice C introduce
alcuni cenni del sistema operativo UNIX, l appendice D riporta i carat-
teri ASCII, l appendice E i comandi del compilatore FORTRAN della
MICROSOFT .

iii
CAPITOLO 0. INTRODUZIONE

iv
Indice

Introduzione iii

1 Il Fortran-77 1
1.1 Alcuni libri . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.2 Caratteri e linee . . . . . . . . . . . . . . . . . . . . . . 2
1.3 Lunghezza della linea . . . . . . . . . . . . . . . . . . . 3
1.4 Linea di commento . . . . . . . . . . . . . . . . . . . . . 3
1.5 Linea iniziale e di continuazione . . . . . . . . . . . . . 4
1.6 Nomi simbolici . . . . . . . . . . . . . . . . . . . . . . . 4
1.7 Nomi locali e globali . . . . . . . . . . . . . . . . . . . . 4
1.8 Parole chiave . . . . . . . . . . . . . . . . . . . . . . . . 5
1.9 Etichette . . . . . . . . . . . . . . . . . . . . . . . . . . 5
1.10 Tipi di dati e costanti . . . . . . . . . . . . . . . . . . . 5
1.11 Unita di memoria . . . . . . . . . . . . . . . . . . . . . 6
1.12 Tipo INTEGER . . . . . . . . . . . . . . . . . . . . . . 6
1.13 Tipo REAL . . . . . . . . . . . . . . . . . . . . . . . . . 6
1.14 Tipo DOUBLE PRECISION . . . . . . . . . . . . . . . 7
1.15 Tipo COMPLEX . . . . . . . . . . . . . . . . . . . . . . 7
1.16 Tipo LOGICAL . . . . . . . . . . . . . . . . . . . . . . . 7
1.17 Tipo Character . . . . . . . . . . . . . . . . . . . . . . . 7
1.18 Vettori . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.19 Sottostringa CHARACTER . . . . . . . . . . . . . . . . 8
1.20 Espressioni . . . . . . . . . . . . . . . . . . . . . . . . . 9
1.21 Espressioni aritmetiche . . . . . . . . . . . . . . . . . . 9
1.22 Espressioni costanti intere . . . . . . . . . . . . . . . . . 10
1.23 Espressioni CHARACTER . . . . . . . . . . . . . . . . 11
1.24 Espressioni di relazione . . . . . . . . . . . . . . . . . . 12
1.25 Espressioni logiche . . . . . . . . . . . . . . . . . . . . . 12
1.26 Struttura del programma . . . . . . . . . . . . . . . . . 14

v
INDICE INDICE

1.27 Classi di istruzione . . . . . . . . . . . . . . . . . . . . . 14


1.28 Ordine delle istruzioni . . . . . . . . . . . . . . . . . . . 15
1.29 Sequenza di esecuzione . . . . . . . . . . . . . . . . . . . 16
1.30 Unita principale del programma . . . . . . . . . . . . . 16
1.31 Unita di programma FUNCTION . . . . . . . . . . . . 16
1.32 Funzioni di referenza . . . . . . . . . . . . . . . . . . . . 17
1.33 Funzioni istruzione . . . . . . . . . . . . . . . . . . . . . 18
1.34 Funzioni intrinseche . . . . . . . . . . . . . . . . . . . . 18
1.35 Sottoprogrammi SUBROUTINE . . . . . . . . . . . . . 18
1.36 Istruzione CALL . . . . . . . . . . . . . . . . . . . . . . 19
1.37 Argomenti della subroutine . . . . . . . . . . . . . . . . 19
1.38 Dimensione tramite PARAMETER . . . . . . . . . . . . 20
1.39 Dimensione tramite numeri . . . . . . . . . . . . . . . . 20
1.40 Dimensione tramite * . . . . . . . . . . . . . . . . . . . 21
1.41 Istruzione RETURN . . . . . . . . . . . . . . . . . . . . 21
1.42 Istruzione ENTRY . . . . . . . . . . . . . . . . . . . . . 21
1.43 Istruzioni di specificazione . . . . . . . . . . . . . . . . . 22
1.44 Istruzione IMPLICIT . . . . . . . . . . . . . . . . . . . 22
1.45 Istruzione PARAMETER . . . . . . . . . . . . . . . . . 22
1.46 Dichiarazioni dei vettori . . . . . . . . . . . . . . . . . . 23
1.47 Istruzioni tipologiche . . . . . . . . . . . . . . . . . . . . 24
1.48 Istruzione DIMENSION . . . . . . . . . . . . . . . . . . 24
1.49 Istruzione COMMON . . . . . . . . . . . . . . . . . . . 24
1.50 Istruzione EQUIVALENCE . . . . . . . . . . . . . . . . 25
1.51 Istruzione EXTERNAL . . . . . . . . . . . . . . . . . . 25
1.52 Istruzione INTRINSIC . . . . . . . . . . . . . . . . . . . 26
1.53 Istruzione SAVE . . . . . . . . . . . . . . . . . . . . . . 26
1.54 Istruzione DATA . . . . . . . . . . . . . . . . . . . . . . 27
1.55 Istruzioni di assegnazione . . . . . . . . . . . . . . . . . 27
1.56 Assegnazioni aritmetiche . . . . . . . . . . . . . . . . . . 27
1.57 Assegnazioni logiche . . . . . . . . . . . . . . . . . . . . 28
1.58 Assegnazioni CHARACTER . . . . . . . . . . . . . . . . 28
1.59 Istruzione ASSIGN . . . . . . . . . . . . . . . . . . . . . 28
1.60 Istruzioni di controllo . . . . . . . . . . . . . . . . . . . 29
1.61 Istruzione GO TO incondizionata . . . . . . . . . . . . . 29
1.62 Istruzione GO TO calcolata . . . . . . . . . . . . . . . . 29
1.63 Istruzione GO TO assegnata . . . . . . . . . . . . . . . 30
1.64 Blocco IF . . . . . . . . . . . . . . . . . . . . . . . . . . 30
1.65 Istruzione IF logica . . . . . . . . . . . . . . . . . . . . 31

vi
INDICE INDICE

1.66 Istruzione IF aritmetica . . . . . . . . . . . . . . . . . . 31


1.67 Istruzione DO . . . . . . . . . . . . . . . . . . . . . . . 31
1.68 Istruzione DO-WHILE . . . . . . . . . . . . . . . . . . . 32
1.69 Istruzione CONTINUE . . . . . . . . . . . . . . . . . . . 33
1.70 Istruzione STOP . . . . . . . . . . . . . . . . . . . . . . 34
1.71 Istruzione PAUSE . . . . . . . . . . . . . . . . . . . . . 34
1.72 Istruzioni di INPUT/OUTPUT . . . . . . . . . . . . . . 34
1.73 Nozioni generali . . . . . . . . . . . . . . . . . . . . . . 35
1.74 Record . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
1.75 File . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
1.76 Accesso ai file . . . . . . . . . . . . . . . . . . . . . . . . 36
1.77 File interni . . . . . . . . . . . . . . . . . . . . . . . . . 37
1.78 Istruzione OPEN . . . . . . . . . . . . . . . . . . . . . . 37
1.79 Istruzione CLOSE . . . . . . . . . . . . . . . . . . . . . . 38
1.80 Istruzione INQUIRE . . . . . . . . . . . . . . . . . . . . 39
1.81 Istruzioni READ/WRITE . . . . . . . . . . . . . . . . . 39
1.82 Istruzione REWIND . . . . . . . . . . . . . . . . . . . . 40
1.83 Istruzione BACKSPACE . . . . . . . . . . . . . . . . . . 41
1.84 Istruzione ENDFILE . . . . . . . . . . . . . . . . . . . . 41
1.85 La specificazione FORMAT . . . . . . . . . . . . . . . . 42
1.86 Descrittori ripetibili . . . . . . . . . . . . . . . . . . . . 42
1.87 Descrittori non ripetibili . . . . . . . . . . . . . . . . . . 44

2 Il Laboratorio 47
2.1 RETTA . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
2.2 PARABO . . . . . . . . . . . . . . . . . . . . . . . . . . 50
2.3 PENDO . . . . . . . . . . . . . . . . . . . . . . . . . . . 52
2.4 CAVEN . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
2.5 GAUSS . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
2.6 TESTT . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
2.7 TESTC2 . . . . . . . . . . . . . . . . . . . . . . . . . . . 80

3 Probabilita e statistica 85
3.1 Gamma . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
3.2 Fattoriale . . . . . . . . . . . . . . . . . . . . . . . . . . 86
3.3 Funzione beta . . . . . . . . . . . . . . . . . . . . . . . . 88
3.4 Gamma incompleta . . . . . . . . . . . . . . . . . . . . . 88
3.5 Funzione errori . . . . . . . . . . . . . . . . . . . . . . . 91
3.6 Distribuzioni . . . . . . . . . . . . . . . . . . . . . . . . . 92

vii
INDICE INDICE

3.6.1 Distribuzione del chiquadro . . . . . . . . . . . . 92


3.6.2 Distribuzione Beta incompleta . . . . . . . . . . . 93
3.6.3 Distribuzione di Student . . . . . . . . . . . . . . 95
3.7 Numeri random . . . . . . . . . . . . . . . . . . . . . . . 95
3.7.1 Generatori di sistema . . . . . . . . . . . . . . . . 95
3.7.2 Generatore Random - portatile . . . . . . . . . . 96
3.7.3 Generatore di interi . . . . . . . . . . . . . . . . . 97
3.7.4 Distribuzione esponenziale . . . . . . . . . . . . . 98
3.7.5 Distribuzione Gaussiana . . . . . . . . . . . . . . 99
3.8 Momenti . . . . . . . . . . . . . . . . . . . . . . . . . . . 101
3.9 Test di Student . . . . . . . . . . . . . . . . . . . . . . . 103
3.10 Fit con retta . . . . . . . . . . . . . . . . . . . . . . . . . 105

4 I frattali 109
4.1 Henon mapping . . . . . . . . . . . . . . . . . . . . . . . 109
4.2 Feigenbaum mapping . . . . . . . . . . . . . . . . . . . . 112
4.3 Mandelbrot-set . . . . . . . . . . . . . . . . . . . . . . . 115
4.4 Implementazione dei set . . . . . . . . . . . . . . . . . . 116
4.5 Set di Julia e derivati . . . . . . . . . . . . . . . . . . . . 119
4.6 Le trasformazioni affini . . . . . . . . . . . . . . . . . . . 120
4.7 Il sistema L . . . . . . . . . . . . . . . . . . . . . . . . . 126

5 Sistemi Monte Carlo 133


5.1 DLA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
5.2 Aggregazione ballistica . . . . . . . . . . . . . . . . . . . 142
5.3 Percolazione . . . . . . . . . . . . . . . . . . . . . . . . . 148
5.4 Catene di Voronoi . . . . . . . . . . . . . . . . . . . . . . 156

A Funzioni intrinseche 165

B Subroutine di interesse comune 173


B.1 CLEANTOP . . . . . . . . . . . . . . . . . . . . . . . . 173
B.2 MAXMIN . . . . . . . . . . . . . . . . . . . . . . . . . . 174

C Sistema operativo UNIX 175


C.1 Alcuni comandi UNIX . . . . . . . . . . . . . . . . . . . 175
C.2 Editor . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176
C.3 Compilazione+link/esecuzione . . . . . . . . . . . . . . . 177
C.4 Shell Script . . . . . . . . . . . . . . . . . . . . . . . . . 177

viii
INDICE INDICE

C.5 Le librerie . . . . . . . . . . . . . . . . . . . . . . . . . . 178

D I caratteri ASCII 179

ix
INDICE INDICE

x
Capitolo 1

Il Fortran-77

Il linguaggio di programmazione FORTRAN, contrazione delle parole


FORmula
TRANslation, e un linguaggio per la soluzione di problemi compu-
tazionali. A causa della sua somiglianza con il familiare linguaggio
aritmetico semplifica enormemente la preparazione dei problemi da sot-
toporre alla macchina. Fu implementato per la prima volta nel 1956
e disponibile per gli utenti dal 1957. Negli anni tra il 1957 e il 1966
il linguaggio sub alcuni cambiamenti e fu standardizzato dall Ame-
rican National Standards Institute (ANSI) nel 1966. Questa versione,
essendo la quarta dalla nascita del linguaggio, assunse il nome di FOR-
TRAN IV. Il FORTRAN77 e l ultima implementazione ufficiale del
FORTRAN-IV: commissionato all ANSI per migliorare il linguaggio
precedente e renderlo piu portabile, e stato finito nel 1977 ed e stato
pubblicato come ANSI standard X3-9-1978. Successivamente e stato
adottato dalle maggiori compagnie e adesso funziona su tutti i PC e
main frame. Infatti, in FORTRAN, sia i dati che le istruzioni sono or-
ganizzati in una sequenza di istruzioni, chiamata normalmente codice
sorgente. Un codice sorgente scritto in FORTRAN puo essere eseguito
su qualunque computer possegga un compilatore, con poche o nessuna
modifica. Queste ultime dipendono dal fatto che diverse case costrut-
trici forniscono implementazioni al linguaggio legate alle possibilita del
tipo di computer che esse fabbricano. Occorre quindi, ad esempio, fare
attenzione nel trasferimento di codici sorgente (o file) da UNIX/LINUX
a personal computer.

1
1.1. ALCUNI LIBRI CAPITOLO 1. IL FORTRAN-77

1.1 Alcuni libri


Prima di continuare introduciamo brevemente una lista di libri che
possono essere utili per chi volesse avventurarsi in una trattazione piu
completa

1. Un introduzione ingegneristica alla programmazione stile Politec-


nico si trova in [Or 86]. Troverete anche una utile serie di esercizi
e l associazione fra metalinguaggio e codice FORTRAN.

2. Una trattazione completa viene invece sviluppata in [El 85]. Ven-


gono svolti o proposti molti esercizi.

3. Una trattazione sommaria viene invece svolta in [Do 83].

4. Un riassunto di tutte le istruzioni si trova invece in [Pa 83] : un


manualetto tascabile in inglese.

1.2 Caratteri e linee


L insieme dei caratteri in FORTRAN consiste di 26 lettere dalla A alla
Z, le 10 cifre da 0 a 9 e dai seguenti 13 caratteri speciali:

+ piu

meno
asterisco
spazio
= eguale
/ barra (slash)
( parentesi sinistra
) parentesi destra
. punto decimale
, virgola
: due punti
0
apostrof o

2
CAPITOLO 1. IL FORTRAN-77 1.3. LUNGHEZZA DELLA LINEA

Figura 1.1: La scheda

< minore
> maggiore
$ simbolo corrente
Attualmente il simbolo corrente puo avere un valore diverso a seconda
della tastiera usata: non ha pero una funzione precisa in FORTRAN e
quindi si puo usare come simbolo di continuazione. Il carattere spazio e
ignorato dappertutto eccetto che nelle variabili CHARACTER e quindi
puo essere usato a piacere per migliorare la leggibilita dei programmi.

1.3 Lunghezza della linea


Il compilatore fa uso solamente delle prime 72 colonne in ogni linea:
dalla colonna 73 in poi si possono mettere dei simboli di identificazio-
ne. Nelle linee di istruzione, le colonne da 1 a 5 sono riservate come
etichetta, la numero 6 ai segni di continuazione e quelle dal 7 al 72 per
l istruzione stessa. Una linea di commento puo essere adoperata dalla
colonna 2 in poi. Questa tipologia deriva dall impostazione originaria
tramite scheda, vedi figura 1.1.

1.4 Linea di commento


Qualsiasi linea con i caratteri C o * in prima colonna viene considerata
una linea di commento. Le linee di commento non contano nulla ai fini

3
1.5. LINEA INIZIALE E DI CONTINUAZIONE
CAPITOLO 1. IL FORTRAN-77

della compilazione ed in esse si puo inserire qualsiasi tipo di carattere:


di solito vengono usate per annotazioni nelle varie parti del programma.
La linea composta di spazi nelle sue prime 72 colonne e equivalente ad
uno spazio solo; ossia non conta ai fini della compilazione.

1.5 Linea iniziale e di continuazione


Una linea di istruzione e caratterizzata da uno spazio oppure da uno
zero nella colonna 6; dalla 1 alla 5 devono esserci degli spazi oppure
una etichetta. Qualsiasi istruzione, eccetto l END, puo continuare
su linee seguenti fino ad un totale di 20 linee ( una iniziale e 19 di
continuazione ): le linee di commento possono essere frammezzate e
quindi non contano. Ogni linea di continuazione deve avere spazi dalla
colonna 1 alla colonna 5 e il simbolo di continuazione in colonna 6.
Il simbolo di continuazione puo essere qualsiasi carattere FORTRAN
eccetto, chiaramente, lo spazio o lo zero.

1.6 Nomi simbolici


Si puo usare un nome simbolico per identificare entita FORTRAN co-
me costanti, variabili, vettori, funzioni e subroutines, blocchi common
e unita di programma. Un nome simbolico e formato da una a 6 let-
tere o numeri,con la condizione che il primo carattere sia una lettera.
In alcuni casi, come per esempio in UNIX, i nomi possono essere piu
lunghi ma,di conseguenza, non sono trasportabili su tutti i sistemi. La
prima lettera determina il tipo di variabile ma questa regola puo essere
ignorata usando una particolare specificazione. Normalmente abbiamo
tipi INTEGER dalla lettera I alla N e REAL negli altri casi e questa
situazione viene solitamente descritta dalla istruzione IMPLICIT.

1.7 Nomi locali e globali


I nomi di tutte le unita di programma, punti di entrata e blocchi COM-
MON sono nomi globali, cioe comuni a tutto il programma: per questo
motivo devono essere unici. Il nome di costanti, variabili, vettori e fun-
zioni di istruzione sono locali, limitati all unita in uso, e quindi possono

4
CAPITOLO 1. IL FORTRAN-77 1.8. PAROLE CHIAVE

essere adoperati per un altro scopo in un altra parte del programma.


Sovente, pero, nome locale e globale devono essere differenti.

1.8 Parole chiave


Una parola chiave e una sequenza di caratteri con un significato pre-
definito per il compilatore (per esempio istruzioni FORTRAN). Molte
di esse ( ad esempio DATA, IF, CLOSE, ERR ) hanno la forma di un
nome simbolico valido: l interpretazione come parola chiave o come
nome simbolico dipende solo dal contesto. Nel dubbio pero e meglio
evitare i nomi delle istruzioni FORTRAN come nomi di variabili per
evitare errori di compilazione o di esecuzione.

1.9 Etichette
Un istruzione di etichetta e un numero intero da 0 a 99999, senza segno,
scritto nelle colonne da 1 a 5 della linea di istruzione. L etichetta non
deve essere allineata a destra e caratteri (spazio) e 0 posti davanti sono
ignorati; deve essere unica nel programma e non puo essere messa su una
linea di continuazione. Le etichette possono comparire non in ordine
numerico. L istruzione FORMAT deve sempre avere un etichetta;
qualsiasi altra istruzione eseguibile puo avere un etichetta, compresa
l istruzione END.

1.10 Tipi di dati e costanti


Qualsiasi costante, variabile, vettore, espressione o funzione deve ap-
partenere a uno di sei tipi di dati: INTEGER, REAL, DOUBLE PRE-
CISION, COMPLEX, LOGICAL O CHARACTER. Il numero di tipi
puo aumentare in alcune implementazioni: si ha, ad esempio, doppia
precisione sulle variabili COMPLEX ( vedi UNIX-FORTRAN). Interi,
reali, doppia precisione e complessi sono tipi aritmetici e la conversione
tra di essi e fatta automaticamente in assegnazioni aritmetiche, DATA e
PARAMETER. La conversione invece non e automatica nelle chiamate
interne tipo SUBROUTINE e FUNCTION.

5
1.11. UNITA DI MEMORIA CAPITOLO 1. IL FORTRAN-77

1.11 Unita di memoria


Ogni variabile o elemento di vettore di tipo INTEGER, REAL, DOU-
BLE PRECISION o LOGICAL occupa un unita di memoria numerica.
Qualsiasi variabile o elemento di vettore in DOUBLE PRECISION o
COMPLEX occupa due unita di memoria numerica. Ogni variabile
oppure elemento di vettore di tipo CHARACTER occupa un unita di
tipo CHARACTER. Il rapporto fra le due unita dipende dalla macchina
usata.

1.12 Tipo INTEGER


In una variabile INTEGER si memorizza un numero intero, che e rap-
presentato esattamente nella macchina. Il range coperto dipende da
macchina a macchina e nel UNIX-FORTRAN abbiamo:

integer 2 da 32768 a 32768

integer 4 da 2147483648 a 2147483648 .


In unita UNIX-FORTRAN una variabile integer*2 occupa 2 bytes men-
tre quella integer*4 ne occupa 4.

1.13 Tipo REAL


Ogni variabile REAL memorizza un numero in virgola mobile, con o
senza segno. Seppure lo zero e i numeri interi piccoli siano memorizzati
in maniera corretta, i numeri con virgola mobile sono approssimati
con una certa precisione che, seppure piccola, e finita e dipende dalla
macchina. Nel UNIX-FORTRAN i numeri con virgola mobile variano:

real 4 da 0.79E 38 a 1.78E + 38

real 8 da 0.56E 308 a 0.9E + 308


Una costante reale deve contenere un punto ( che rappresenta la
virgola ) o un esponente che specifichi la potenza di 10 applicata alla
variabile, o ambedue. Il segno e un optional da mettersi di fronte al
numero o all esponente. Esempi di costanti espresse in maniera valida:

1. 3.14159 + 5E3 6.67E 18

6
CAPITOLO 1. IL FORTRAN-77 1.14. TIPO DOUBLE PRECISION

Sul UNIX-FORTRAN una variabile real *4 ( precisione singola ) occupa


4 bytes.

1.14 Tipo DOUBLE PRECISION


La DOUBLE PRECISION e simile a quella REAL ma memorizza un
numero in virgola mobile con una precisione maggiore. Anche qula
precisione dipende dalla macchina usata. Scriviamo qualche esempio:

1D0 3.141592653589793238462643D0 + 5D3 6.67D 18

Sul UNIX-FORTRAN una variabile real*8 (o doppia precisione) occupa


8 bytes. Notiamo che l esponente viene preceduto dalla lettera D e deve
sempre essere indicato, anche se nullo.

1.15 Tipo COMPLEX


Una variabile COMPLEX consiste in un paio ordinato di numeri reali,
rappresentanti della parte reale e immaginaria di un numero complesso
ed e scritta con due costanti reali o intere separate da una virgola
e contenute tra parentesi, la seconda delle quali rappresenta la parte
immaginaria:

(1, 50) (3.14, 2E3) (.123, +4567)

1.16 Tipo LOGICAL


Una variabile LOGICAL memorizza solo due valori, .true. oppure .f alse.,
ed occupa un byte: e quindi indicata per operazioni che richiedono molti
bytes di memoria.

1.17 Tipo Character


I dati di tipo CHARACTER sono stati introdotti per la memorizza-
zione e la manipolazione di testi. Ogni variabile CHARACTER puo
memorizzare una stringa completa di caratteri, ma la sua occupazio-
ne deve essere dichiarata all inizio del programma. In particolare in

7
1.18. VETTORI CAPITOLO 1. IL FORTRAN-77

UNIX-FORTRAN bisogna specificare il numero di caratteri e quindi di


bytes, per esempio
0
character 6 ERRORE 0
0
character 15 T ROP P I ELEM EN T I 0
Le stringhe sono definite da apostrofi () o virgolette (). La costante di
Hollerith del FORTRAN-IV e stata completamente sostituita da questo
tipo di variabili ( per fortuna ! ).

1.18 Vettori
Un vettore e un set ordinato di dati (tutti dello stesso tipo) riferito ad
un singolo nome simbolico. Il numero di dimensioni di un vettore puo
arrivare ad un massimo di sette. Nel FORTRAN77 qualsiasi dimensione
puo avere un limite inferiore diverso da uno e gli intervalli di variabilita
devono essere dichiarati nelle istruzioni COMMON o DIMENSION.
L elemento individuale viene chiamato specificando il nome simbolico
e un insieme di indici, uno per ogni dimensione.
Qualsiasi indice di un vettore deve avere un valore compreso fra i
due limiti dichiarati in quella dimensione. L indice puo essere un intero
complesso quanto si vuole, puo includere la chiamata di un altro vettore
oppure chiamate a funzioni intrinseche od esterne. Riportiamo alcuni
esempi:
matrice(0, 12)
hyper(i, j, l, m, n)
dlist(mod(npts, 4))
D(k(N (index)))

1.19 Sottostringa CHARACTER


Una sottostringa specifica un set di caratteri adiacenti dislocati in una
variabile CHARACTER. Una sottostringa consiste nella specificazio-
ne dell elemento seguito da due interi separati da : e rinchiusi fra
parentesi. Facciamo un esempio concreto:

CHARACT ER 8 regioni(1 : 23)

8
CAPITOLO 1. IL FORTRAN-77 1.20. ESPRESSIONI

regioni(55) =0 P IEM ON T E 0
regioni(55)(2 : 5) =0 IEM O0

1.20 Espressioni
Essendo un linguaggio essenzialmente computazionale, un gran nume-
ro di istruzioni FORTRAN impiega espressioni. La valutazione di una
espressione da come risultato un singolo valore che puo essere usato
per definire una variabile, puo entrare in una decisione logica, puo es-
sere scritto in un file, etc. La forma piu semplice di una espressione
e un valore scalare: una costante o una variabile singola. Espressioni
piu complesse vengono spesso formate con operazioni che coinvolgono
uno o piu operandi. Ci sono quattro tipi di espressioni disponibili in
FORTRAN 77: aritmetiche, CHARACTER, di relazione e logiche.

1.21 Espressioni aritmetiche


Un espressione aritmetica e usata per specificare un calcolo numerico
che deve essere svolto dal calcolatore. Consiste di uno o piu operan-
di ( interi, reali, doppia precisione oppure complessi ) combinati con
operatori aritmetici. Un espressione puo anche contenere una sottoe-
spressione in parentesi e referenze a funzioni standard. Il risultato di
un espressione aritmetica e un valore numerico del tipo specificato.
Elenchiamo le possibili operazioni:

somma(identita) +

sottrazione(negazione)
moltiplicazione
divisione /
elevazione a potenza
L ordine di valutazione di un espressione e:

1. sottoespressioni in parentesi,

2. funzioni standard,

9
1.22. ESPRESSIONI COSTANTI INTERE CAPITOLO 1. IL FORTRAN-77

3. esponente,
4. moltiplicazione o divisioni,
5. addizioni, sottrazioni o negazioni.
In ogni gruppo la valutazione procede da sinistra verso destra eccet-
to che per gli esponenti che sono valutati da destra a sinistra. Cosicche
A/B/C e equivalente ad (A/B)/C mentre A**B**C e equivalente ad
A** (B**C). Si possono mescolare tutte le combinazioni dei quattro ti-
pi fondamentali tra di loro eccetto che quelle COMPLEX con quelle di
DOUBLE PRECISION. Se gli operandi di una espressione aritmetica
sono dello stesso tipo il risultato sara anch esso dello stesso tipo. Se i
tipi sono diversi, viene applicata ad uno di essi un tipo di conversione
implicita. La direzione adoperata sara:
IN T EGER REAL COM P LEX o DOU BLE P RECISION
La sola eccezione a queste regole di conversione e l elevazione a potenza
con esponente intero. Se la potenza e negativa, si valuta l inverso della
potenza positiva:
2 (3) 1/(2.0 3) 1/8.0 0.125
Altrimenti la potenza e calcolata con i logaritmi cosicche A**B sara
calcolato con la formula EXP(B * LOG (A)) dove EXP e LOG sono
funzioni standard del compilatore. La divisione fra interi produce un
troncamento della parte frazionale. Esempi:
8/3 2 , 2 (3) 1/(2 3) 1/8 0

1.22 Espressioni costanti intere


Le espressioni aritmetiche in cui tutti gli operandi siano costanti o nomi
simbolici, vengono chiamate espressioni aritmetiche costanti. Un espres-
sione costante intera puo essere usata per dichiarare i limiti di un vettore
o la lunghezza di una variabile CHARACTER o usata per fissare i valori
di una costante attraverso l istruzione PARAMETER. Per esempio:
P ARAM ET ER (N P T = 50, N T OT AL = N P T 2)
COM P LEX COEF F S (N P T S (N P T S 1))
ARRAY (N T OT AL(2))

10
CAPITOLO 1. IL FORTRAN-77 1.23. ESPRESSIONI CHARACTER

1.23 Espressioni CHARACTER


Una espressione CHARACTER produce un risultato di tipo CHARAC-
TER ed e ottenuta usando operatori e operandi di tipo CHARACTER.
Gli operandi di tipo CHARACTER possono essere: un valore scalare,
un elemento di vettore, una sottostringa, una espressione CHARAC-
TER chiusa tra parentesi, il risultato di una funzione CHARACTER.
Esiste un unico operando CHARACTER denotato con // che permette
di concatenare due stringhe. Esempio:
0 0
A = ESEM P IO DI
0
B = P ROGRAM M A0
0
C = SU BROU T IN E 0
0
A//B = ESEM P IO DI P ROGRAM M A0
0
A//C = ESEM P IO DI SU BROU T IN E 0
Ambedue gli apostrofi sono richiesti .
Il valore della variabile CHARACTER e la stringa di caratteri fra
gli apostrofi. Il suddetto valore non include gli apostrofi, include invece
tutti gli spazi ed eventuali tabs inseriti fra i due apostrofi . Nella
variable CHARACTER il carattere apostrofo e rappresentato da due
apostrofi consecutivi con nessun spazio o carattere fra di loro () . La
lunghezza della variabile CHARACTER e il numero di caratteri fra
gli apostrofi, eccetto che due apostrofi consecutivi rappresentano un
singolo apostrofo . La lunghezza di una variabile CHARACTER deve
essere nel range da 1 a 2000 .
Esempi
I seguenti esempi rappresentano delle variabili CHARACTER valide
ed invalide .
Valide
Cosa hai detto ?
Labbiamo trovato
La risposta media e stata 12:00

Invalide Spiegazione
La formula manca l apostrofo finale
la variabile CHARACTER deve

11
1.24. ESPRESSIONI DI RELAZIONE CAPITOLO 1. IL FORTRAN-77

contenere almeno un carattere

1.24 Espressioni di relazione


Un espressione di relazione da un risultato di tipo logico (vero o falso)
ed e formata da espressioni aritmetiche o CHARACTER e operatori di
relazione. Abbiamo sei tipi di operatori di relazione:

.LT. minore di

.LE. minore di o uguale a


.EQ. uguale a
.
.GT. maggiore di
.GE. maggiore di o uguale a
.N E. non uguale a
Le variabili confrontate devono essere omogenee e ovviamente in campo
complesso potremo solamente usare lespressione .eq. o.ne..
Inoltre nei test di uguaglianza su variabili REAL o DOUBLE PRE-
CISION, bisogna tenere conto della precisione adoperata. Il confronto
tra variabili CHARACTER avviene carattere per carattere secondo la
sequenza ASCII. Dato che la lettera A precede la lettera B nel codice
ASCII, A e minore di B. Inoltre le lettere maiuscole hanno valori minori
delle minuscole.

1.25 Espressioni logiche


Un espressione logica consiste di operandi e operatori logici e ritorna
un valore . true./.false .. Essa puo essere usata nell espressione IF
o blocco IF. Dato il termine logico lterm possiamo avere le seguenti
espressioni logiche:
(lterm)
(.not. lterm)
(lexp lop lterm)

12
CAPITOLO 1. IL FORTRAN-77 1.25. ESPRESSIONI LOGICHE

Tabella 1.1: Tabella sugli operatori OR e AND

L1 ed L2 sono espressioni logiche


.OR. e.AND. sono operatori logici

L1 L2 L1.OR.L2 L1.AN D.L2


.true. .true. .true. .true.
.true. .f alse. .true. .f alse.
.f alse. .true. .true. .f alse.
.f alse. .f alse. .f alse. .f alse.

dove LTERM e la costante logica, variabile oppure elemento di vet-


tore, LEXP un espressione logica e LOP uno degli operatori logi-
ci.AND.,.OR.,.EQV., o.NEQV.. Riportiamo l ordine di valutazione
di un espressione di tipo logico:
1. Espressione aritmetica
2. Espressioni di relazione
3. operatore.NOT.
4. operatore.AND.
5. operatore.OR.
6. operatori.EQV. e.NEQV.
L effetto degli operatori.OR. da come risultato .true. se e vero uno
dei due operandi mentre.AND. da come risultato.true. se sono verificati
tutti e due, vedi per esempio la seguente tabella:
L operatore.EQV. da come risultato.true. se entrambi gli operan-
di hanno lo stesso valore ( cioe entrambi veri oppure entrambi falsi )
mentre il secondo.NEQV. da il risultato.true. se hanno valore opposto,
come indicato nella tabella che segue:
Attenzione che l operatore.EQV. (che esprime equivalenza ) logica
e.NEQV. (non - equivalenza) non possono essere adoperati nella stes-
sa espressione. Le parentesi vanno sempre utilizzate per semplificare
l ordine di espressioni complicate.

13
1.26. STRUTTURA DEL PROGRAMMA CAPITOLO 1. IL FORTRAN-77

Tabella 1.2: Tabella sugli operatori EQV e NEQV

L1 ed L2 sono espressioni logiche


EQV. e.NEQV. sono operatori logici

L1 L2 L1.EQV.L2 L1.N EQV.L2


.true. .true. .true. .f alse.
.true. .f alse. .f alse. .true.
.f alse. .true. .f alse. .true.
.f alse. .f alse. .true. .f alse.

1.26 Struttura del programma


Un programma deve contenere un corpo principale, detto main. Puo
poi contenere diverse sottounita che possono essere di tre tipi: SUB-
ROUTINE, FUNCTION e blocco DATA (procedura non eseguibile).

1.27 Classi di istruzione


Possiamo chiamare istruzioni tipologiche INTEGER, REAL, DOUBLE
PRECISION,
COMPLEX, LOGICAL e CHARACTER mentre IMPLICIT, PARA-
METER, DIMENSION, COMMON, EQUIVALENCE, EXTERNAL,
SAVE sono classificate come istruzioni di specificazione. PROGRAM,
SUBROUTINE, FUNCTION, blocco DATA, FORMAT sono invece
istruzioni di funzione e non sono eseguibili. Le istruzioni di assegnazio-
ne ( incluso ASSIGN ), tutte le forme di IF e GO TO, e inoltre ELSE,
ELSEIF, END IF,DO, CONTINUE, CALL, RETURN, READ, WRI-
TE, PRINT, OPEN, CLOSE, INQUIRE, REWIND, BACKSPACE,
END FILE, STOP, PAUSE ed END sono classificate come istruzioni
eseguibili.

14
CAPITOLO 1. IL FORTRAN-77 1.28. ORDINE DELLE ISTRUZIONI

+-------+--------------------------------------------------------+
| | Istruzione OPTIONS |
| |--------------------------------------------------------|
| | Istruzione PROGRAM, FUNCTION, SUBROUTINE,o BLOCCO DATA |
| |--------+-----------------------------------------------|
|COMMENT| | Istruzione IMPLICIT NONE |
| Linee,| |-------------------------------+--------------|
|INCLUDE|NAMELIST,| Istruzione IMPLICIT | |
| Istru-| FORMAT, |------+------------------------| |
| zioni,| & | | Altre Istruzioni | ISTRUZIONE |
|& Gen- | ENTRY | DATA | di specificazione | PARAMETER |
| erali | Istru- |Istru-| Istruzione DICTIONARY | |
|Diret- | zioni | zioni|------------------------+--------------|
| tive | | | Istruzioni Function Definizioni |
| | | |---------------------------------------|
| | | | Istruzioni Eseguibili |
|-------+---------+------+---------------------------------------|
| Istruzione END |
+----------------------------------------------------------------+

Figura 1.2: Le priorita nelle istruzioni

1.28 Ordine delle istruzioni


Nella scrittura del codice sorgente devono essere rispettate alcune regole
di priorita con un certo ordine, vedi figura 1.2 .
PROGRAM NOME
Istruzioni di specificazione
........................
Istruzioni eseguibili
.......................
STOP
END
Questo significa, per esempio, che se si usa una istruzione di tipo
IMPLICIT,questa deve precedere tutte le altre eccetto che PARAME-
TER, inseribile ovunque. Le linee di commento possono essere inseri-
te in ogni punto eccetto che dopo l istruzione END, che deve essere
sempre l ultima del programma. Nella figura che precede le linee ver-

15
1.29. SEQUENZA DI ESECUZIONE CAPITOLO 1. IL FORTRAN-77

ticali separano le istruzioni che possono essere mescolate. Per esempio


l istruzione DATA puo essere mescolata con istruzioni eseguibili. Le
linee orizzontali invece separano istruzioni che non possono essere me-
scolate; per esempio le istruzioni di dichiarazione non possono essere
mescolate con istruzioni eseguibili.

1.29 Sequenza di esecuzione


L esecuzione parte con la prima istruzione eseguibile del programma
main e continua sequenzialmente, soggetta pero alle istruzioni di con-
trollo come GO TO, IF, CALL, etc.. L esecuzione finisce con l istruzio-
ne END del programma principale o con uno STOP in qualsiasi parte
del programma. Certi errori tipo OVERFLOW possono creare una fine
prematura ma segnalata mentre altri, tipo superamento della memoria
disponibile, provocano una fine non segnalata.

1.30 Unita principale del programma


Il main incomincia con l istruzione PROGRAM e puo contenere qual-
siasi altra
istruzione eccetto che: SUBROUTINE, FUNCTION oppure RETURN.
La forma dell istruzione e:
PROGRAM pnome
dove pnome e un nome simbolico. Questa istruzione non e adoperata
in altre parti del programma e quindi ha un significato principalmente
di documentazione.

1.31 Unita di programma FUNCTION


Una funzione ritorna un valore al punto, nell ambito di una espres-
sione, in cui e stata chiamata. Quest unita comincia con l istruzio-
ne FUNCTION e puo contenere qualsiasi altra istruzione eccetto che
PROGRAM, SUBROUTINE o blocco DATA. Abbiamo due possibilta
di definizione:
FUNCTION fnome ( a1, a2,.... an )
oppure
tipo FUNCTION fnome (a1, a2,... an )

16
CAPITOLO 1. IL FORTRAN-77 1.32. FUNZIONI DI REFERENZA

dove tipo va scelto fra INTEGER, REAL, DOUBLE PRECISION,


COMPLEX, LOGICAL, CHARACTER o CHARACTER * len; fnome
e il nome simbolico della funzione e a1, a2,.... an sono gli argomenti
trasmessi. Si puo anche non trasferire alcun argomento ma le parentesi
devono ancora essere presenti. E meglio evitare che nella FUNCTION
ci siano operazioni di PRINT/WRITE perche non funzionerebbero ed
inoltre bisogna essere estremamente prudenti nel modificare gli argo-
menti indicati nell istruzione COMMON. Come esempio riportiamo la
funzione MYSIN che calcola il seno del primo argomento con lo svi-
luppo in serie di Taylor e ritorna il numero dei termini dello sviluppo
necessari ad avere una precisione di 107 .
REAL FUNCTION MYSIN(P1,P2)
REAL P1
DOUBLE PRECISION FACTRL
INTEGER P2
MYSIN = P1
DO 10 P2 = 1,100
DELTA = (-1)**P2 * P1**(2*P2+1) / FACTRL(2*P2+1)
IF (ABS(DELTA).LT. 1E-7) RETURN
10 MYSIN = MYSIN + DELTA
RETURN
END
Bisogna fare attenzione a dichiarare la funzione chiamata nel pro-
gramma principale; nel nostro caso dovremo mettere
REAL MYSIN
se poi la funzione e inserita in qualche libreria dovremo mettere
EXTERNAL MYSIN

1.32 Funzioni di referenza


Una funzione di referenza puo occorrere come operando in qualsiasi
espressione appropriata ed ha la forma del tipo:
fnome ( a1,....., an)
dove fnome e il nome della funzione. Quella piu usate sono le fun-
zioni matematiche che variano fortemente da macchina a macchina. Ri-
portiamo l esempio dei numeri random fra 0 ed 1 in UNIX-FORTRAN:
X = RAN (IGEN)
dove IGEN deve essere un intero grande meglio se dispari. Le funzio-

17
1.33. FUNZIONI ISTRUZIONE CAPITOLO 1. IL FORTRAN-77

ni intrinsiche non vanno dichiarate perche sono inserite nel compilatore.


Per maggiori dettagli vedere l appendice A sulle funzioni intrinsiche.

1.33 Funzioni istruzione


Una istruzione di funzione puo essere usata per specificare una relazione
semplice ed e usata in una sola unita. Ovviamente essa deve precedere
qualsiasi istruzione di esecuzione. E definita tramite una via simile alle
istruzioni di assegnazione:
fnome (a1,...,an) = exp
dove fnome e il nome simbolico della funzione ed e seguito dagli
argomenti fittizi, exp e una espressione che viene valutata utilizzando
gli argomenti fittizi. Questi ultimi sono locali e possono essere usati
indipendentemente nel resto del programma. Esempi:
LOGICAL DIGIT
CHARACTER CHAR
DIGIT (CHAR ) = CHAR.GE.0.AND.CHAR.LE.9
VAB (X,Y,Z) = SQRT (XX**2 +Y**2 +Z**2)

1.34 Funzioni intrinseche


Il FORTRAN contiene una quantita considerevole di funzioni incor-
porate, note come funzioni intrinseche, che vengono automaticamente
messe a disposizione in qualsiasi parte del programma esse vengano
chiamate. La maggior parte di queste funzioni ha un nome generico
che elimina la necessita di cambiare nome in base al tipo di parametro
usato. Su varie macchine troviamo poi funzioni intrinseche diverse a
seconda del tipo di variabile utilizzata. Visto il loro numero notevole
rimandiamo il lettore all appendice A per una lista aggiornata.

1.35 Sottoprogrammi SUBROUTINE


Una subroutine e una procedura separata, definita come esterna rispet-
to all unita di programma che la chiama ed e specificata in una unita
sottoprogramma. L istruzione SUBROUTINE seguita o meno dagli
argomenti e l istruzione iniziale e in seguito si possono inserire tutte

18
CAPITOLO 1. IL FORTRAN-77 1.36. ISTRUZIONE CALL

le istruzioni eccetto che PROGRAM, FUNCTION o blocco DATA. La


forma puo essere:
SUBROUTINE snome (a1,....,an)
oppure
SUBROUTINE snome
dove snome e il nome simbolico della subroutine e a1,....., an sono
gli argomenti di entrata / uscita. La SUBROUTINE viene chiamata
con l istruzione CALL e ovviamente al suo interno non puo chiamare
se stessa direttamente o indirettamente. Le informazioni si possono
trasferire al di fuori della subroutine mediante i suoi argomenti, i blocchi
COMMON oppure file esterni. Si ritorna al main mediante l istruzione
END oppure RETURN.

1.36 Istruzione CALL


Questa istruzione e usata per eseguire una procedura specificata da una
subroutine. Le forme sono del tipo:
CALL SUBROUTINE snome (a1,....,an)
oppure
CALL SUBROUTINE snome

1.37 Argomenti della subroutine


Normalmente l istruzione iniziale SUBROUTINE contiene una lista
di parametri formali chiusi fra parentesi. La chiamata CALL ad una
subroutine contiene una lista di parametri attuali che devono concor-
dare esattamente in numero e tipo con i parametri formali. Durante
l esecuzione di un istruzione CALL, le locazioni di memoria dei para-
metri attuali vengono passate alla subroutine in modo tale da permet-
tere ai parametri formali di riferirsi alle stesse locazioni di memoria dei
parametri attuali. Questi ultimi possono essere costituiti da:

1. una costante

2. un nome di variabile

3. il nome di un elemento di un vettore o del vettore stesso

4. una sottostringa di caratteri

19
1.38. DIMENSIONE TRAMITE PARAMETER
CAPITOLO 1. IL FORTRAN-77

5. un espressione
6. il nome una funzione intrinseca
7. il nome di una procedura esterna ( subroutine o funzione )
8. il nome di una procedura formale
9. uno specificatore di ritorno alternativo ( vedi sotto )
I parametri formali possono essere invece costituiti da:
a) il nome di una variabile ( per i tipi 1 - 5 )
b) il nome di un vettore ( per il tipo 3 )
c) il nome di una procedura formale ( per i tipi 7 e 9 )
d) un asterisco ( per il tipo 10 )
Se il parametro formale e una variabile di tipo CHARACTER, deve
essere naturalmente dichiarato come tale e gli deve essere attribuita
una certa lunghezza che deve essere inferiore o uguale alla lunghezza
del parametro attuale; se e inferiore, verranno trattati come parametro
formale solo i lun ( lun = lunghezza dichiarata nella SUBROUTINE
) caratteri piu a sinistra del parametro attuale. Particolare attenzione
va posta alle dimensioni dei vettori e possiamo avere tre tipi diversi di
configurazioni:

1.38 Dimensione tramite PARAMETER


SUBROUTINE LAVORO (VEC,N)
DIMENSION VEC (1:N)
dove VEC e il vettore di dimensione da uno ad N e N e definito nel
main tramite l istruzione PARAMETER.

1.39 Dimensione tramite numeri


SUBROUTINE LAVORO (VEC)
DIMENSION VEC (1:1000)
dove VEC e il vettore di dimensione da uno ad a 1000 e nel MAIN e
definito nella stessa maniera.

20
CAPITOLO 1. IL FORTRAN-77 1.40. DIMENSIONE TRAMITE *

1.40 Dimensione tramite *


SUBROUTINE LAVORO (A,B,C)
DIMENSION A (1:*),B(0:*),C(-4:*)
Questo tipo di dichiarazione e detto dichiarazione di vettore a dimensio-
ni presunte, in quanto si suppone che il vettore sia abbastanza grande
per tutti i riferimenti ad esso fatti nel corso del programma e non ha
dimensioni definite. Se invece abbiamo l istruzione in blocchi COM-
MON abbiamo un associazione fra elementi corrispondenti; si abbia ad
esempio
SUBROUTINE SUB ( X,Y,Z)
COMMON C
e nell unita principale si abbiano le istruzioni seguenti:
COMMON S
CALL SUB (X1,Y1,Z1 )
Cosicche sia X,Y,Z sono associati con X1, Y1, Z1 mentre C e asso-
ciata con S.

1.41 Istruzione RETURN


Questa istruzione fa terminare l esecuzione di una SUBROUTINE o
di una FUNCTION e restituisce il controllo all unita di chiamata. La
forma normale e:
RETURN
Puo anche essere chiamata all interno di un if /end if.

1.42 Istruzione ENTRY


Qualche volta puo essere utile combinare due o piu subroutines o fun-
zioni in una sola per potere trarre vantaggio da una grossa porzione di
codice in comune. Essa assume la forma del tipo:
ENTRY enome (a1,....,an)
dove enome e il nome di entrata seguito dai relativi argomenti, il
cui numero deve essere uguale al numero di argomenti nella subroutine
o funzione corrispondente. L uso di punti alternativi di ingresso e in
conflitto con i principi di programmazione modulare ma puo risultare
conveniente in alcuni casi particolari. Bisogna evitare comunque che
l istruzione ENTRY compaia in una qualsiasi struttura a blocchi

21
1.43. ISTRUZIONI DI SPECIFICAZIONE CAPITOLO 1. IL FORTRAN-77

1.43 Istruzioni di specificazione


Le istruzioni di specificazione sono usate per definire le proprieta di
entita simboliche, costanti, variabili, vettori, etc., usate in una unita di
programma. Per questo motivo vengono anche chiamate istruzioni di
dichiarazione e sono raggruppate nella sezione iniziale del codice sorgen-
te, dopo l istruzione PROGRAM e prima di tutte le altre. Ricordiamo
che non sono istruzioni eseguibili. In questo capitolo si esamineran-
no anche le istruzioni DATA, utilizzate per stabilire i valori iniziali di
variabili e vettori presenti in un programma FORTRAN.

1.44 Istruzione IMPLICIT


Il tipo di dati delle variabili o vettori usati nel programma puo essere
stabilito tramite un istruzione tipologica. La regola standard e che
i nomi simbolici con la lettera iniziale da I ad N specificano variabili
intere mentre gli altri sono reali. Con l istruzione IMPLICIT si puo
modificare questa situazione. Questo puo essere utile per poter utiliz-
zare allo stesso tempo variabili in precisione semplice e in doppia nelle
stesse unita. Se usiamo il tipo CHARACTER deve essere specificata
anche la lunghezza con un *len. Esempi:
IMPLICIT REAL *4 (A-H,O-Z)
oppure
IMPLICIT REAL *8 (A-H,O-Z)
oppure
IMPLICIT REAL *4 (C-H,O-Z)
IMPLICIT REAL *8 (A)
IMPLICIT CHARACTER * 80 ( B)
In questo ultimo esempio tutte le variabili saranno in semplice pre-
cisione eccetto che quelle inizianti con A ( precisione doppia ) e B (
variabile CHARACTER di lunghezza 80 ).

1.45 Istruzione PARAMETER


Con questa istruzione si assegna un nome logico ad una costante, che
puo essere un numero oppure un espressione contenente altre costan-
ti. Si possono trasportare le variabili cos definite in altre unita senza

22
CAPITOLO 1. IL FORTRAN-77 1.46. DICHIARAZIONI DEI VETTORI

modificarle: il compilatore segnalerebbe in questo caso qualcosa di ano-


malo. Il tipo di costante o espressione deve chiaramente essere lo stesso
del nome simbolico. Se il nome di un parametro CHARACTER ha
la lunghezza specificata con un *(*), vale la lunghezza dichiarata in
PARAMETER. Esempio:
PARAMETER (LOGN=8, NPT = 2** LOGN)
DIMENSION INDEX (1:LOGN), X(0:NPT)
CHARACTER *(*) TITLE
PARAMETER ( TITLE =Tabella dei risultati)
PARAMETER ( PI = 3.14159,PI2 = 2*PI )
Esse risultano molto utili per dimensionare i vettori.

1.46 Dichiarazioni dei vettori


Il nome di un vettore puo comparire in piu di una istruzione di speci-
ficazione ma la sua dimensione deve essere dichiarata solo una volta.
Questo puo essere fatto in una istruzione tipologica, in un COMMON
oppure in un DIMENSION. I vettori possono avere fino a sette dimen-
sioni, per ognuna delle quali si deve specificare un limite inferiore e
superiore. Se non e specificato diversamente, il limite inferiore e uno.
Esempi:
PARAMETER (NPUNTI = 1000 )
REAL 8 4 (NPUNTI),Y(-5:5,0:NPUNTI -1),DUE(2,2,2,2)
LOGICAL * 1 CUBO
DIMENSION CUBO (1:NPUNTI,1:NPUNTI,1:NPUNTI)
Se invece il vettore si trova in una subroutine abbiamo due possibi-
lita: dimensione regolabile oppure fissa. Nel primo caso le dimensioni
sono regolate dalla lista degli argomenti della subroutine oppure tramite
il blocco COMMON:
SUBROUTINE CALCOLA (X,NX,Y,NY, R,F)
IMPLICIT REAL *8 (A-H,O-Z)
COMMON NR,NF
DIMENSION X (1:NX),Y(1:NY),F(0:NF),R(0:NR)
Se invece vogliamo usare un vettore di dimensione fissa possiamo
introdurre un * che rappresenta una dimensione indefinita. Esempio:
FUNCTION ESPANDE (XX,YY)
IMPLICIT REAL *8 XX, YY
DIMENSION XX (*),YY(0:*)

23
1.47. ISTRUZIONI TIPOLOGICHE CAPITOLO 1. IL FORTRAN-77

1.47 Istruzioni tipologiche


Queste sono usate per alterare ( o confermare ) il tipo di dati associati
con un nome simbolico. Possono anche essere usate per specificare le
dimensioni dei vettori. Una volta associato un tipo ad un nome sim-
bolico, questo rimane invariato all interno dell unita di programma
in cui e stato definito. Possiamo avere tipi LOGICAL, CHARACTER
e aritmetici. Usando l istruzione CHARACTER bisogna ovviamen-
te sempre specificare la lunghezza. Nel caso dell argomento fittizio
di una SUBROUTINE possiamo mettere un *(*) che rappresenta una
lunghezza e dimensione variabili. Esempio:
DOUBLE PRECISION X, FUNZ, Z(100)
CHARACTER * 30 NOME, INDIRIZZI (5)*20
LOGICAL * 1 CUBO (1:100,1:100)

1.48 Istruzione DIMENSION


E usata per dare un nome simbolico e specificare la dimensione di un
vettore. Il tipo di dati e implicito nel nome usato. La forma e del tipo:
DIMENSION A1(D1),A2(D2).....
dove ogni An e un vettore e Dn specifica la dimensione; a sua volta
Dn puo essere scomposto in limite superiore e inferiore.

1.49 Istruzione COMMON


Le istruzioni COMMON sono usate per dichiarare blocchi di variabili
in comune con due o piu unita del programma, secondo un ordine di
memorizzazione consistente. Questo e possibile attraverso una struttu-
ra di dati FORTRAN chiamata blocco COMMON, che costituisce un
blocco di memoria contiguo e assume la forma:
COMMON /NOME/ nlist
dove nome e il nome globale del blocco e nlist e la lista dei nomi
delle variabili, dei vettori e dei dichiaratori di vettori locali. Si nota
che un blocco COMMON non possiede un tipo. Una volta stabilito
l ordine di memorizzazione in un blocco COMMON, qualsiasi unita di
programma che dichiari lo stesso blocco COMMON, puo riferirsi ai dati
ivi memorizzati senza dover passare nomi simbolici attraverso liste di
argomenti. L istruzione COMMON e un istruzione di specificazione e

24
CAPITOLO 1. IL FORTRAN-77 1.50. ISTRUZIONE EQUIVALENCE

deve venire quindi dopo tutte le istruzioni IMPLICIT e precedere tutte


quelle DATA. Esempio:
INTEGER *2 ETA (1:50)
REAL *4 LIVELLO (1:50,1:6)
COMMON /ESAM/NUM,LIVELLO,ETA
In questo caso nel blocco COMMON /ESAM/ abbiamo 1 + 300 +
50 = 351 unita.

1.50 Istruzione EQUIVALENCE


L istruzione EQUIVALENCE fornisce un mezzo affinche due o piu
variabili possano occupare la stessa dislocazione in memoria. Assume
la forma:
EQUIVALENCE (nlista1),(nlista2)
Questo significa che la memorizzazione per tutti gli elementi del-
la lista avviene con la stessa locazione di partenza. Gli elementi in
questione possono essere di tipo e lunghezza differente. Facciamo un
esempio:
REAL *4 R(2), RL,IM
COMPLEX *8 C
EQUIVALENCE ( R,RL,C),(R(2),IM)
Questo significa che R(1) e RL occupano la stessa dislocazione della
parte reale di C mentre R(2) ed IM occupano la parte immaginaria di
C. Le istruzioni COMMON ed EQUIVALENCE sono di difficile com-
prensione e diventano veramente utili in sistemi composti da molte
subroutines tipo pacchetti grafici o matematici.

1.51 Istruzione EXTERNAL


L istruzione EXTERNAL permette che nomi simbolici possano essere
usati come argomenti in istruzioni CALL e in chiamate a funzioni, senza
che il compilatore crei automaticamente una variabile nel momento
della referenza. In pratica specifica che un nome e un simbolo globale
definito fuori dell unita del programma. Si presentano due casi:

a) identificare sottoprogrammi o punti ENTRY passati come ar-


gomenti,

25
1.52. ISTRUZIONE INTRINSIC CAPITOLO 1. IL FORTRAN-77

b) identificare un blocco DATA nel momento del link del pro-


gramma.

1.52 Istruzione INTRINSIC


Questa istruzione indica che un certo nome simbolico e una funzione
intrinseca e puo essere passata come argomento in istruzioni CALL
e chiamate a funzioni. Il nome della funzione intrinseca specificato
mantiene il tipo di variabile associato. Riportiamo un esempio sull uso
di INTRINSIC/EXTERNAL:
INTRINSIC SINH,COSH
nna7 EXTERNAL MYFUNC
CALL GRAPH (SINH)
CALL GRAPH (MYFUNC)
END
SUBROUTINE GRAPH (FUNC)
EXTERNAL FUNC
CALL PLOT (FUNC,0.0, 3.14)
END

1.53 Istruzione SAVE


Il FORTRAN permette l allocazione in memoria sia dinamica che sta-
tica. Le variabili, i vettori e i blocchi COMMON dichiarati nell unita
MAIN, sono allocati staticamente e mantengono sempre la loro defini-
zione. Le variabili, i vettori e i blocchi COMMON dichiarati solo in
sottoprogrammi vengono allocati dinamicamente al momento dell ese-
cuzione del sottoprogramma. Quando questo esegue l istruzione RE-
TURN o END, sono deallocati e perdono la loro definizione(e chiara-
mente il loro valore!). L istruzione SAVE permette di mantenere la de-
finizione di queste variabili e di salvare il loro contenuto, specificandole
in due diversi modi:
SAVE nome1,nome2
SAVE
Nel primo sono salvati nome1 e nome2, mentre nel secondo tutti
gli argomenti della sottunita. IN UNIX-FORTRAN questo avviene gia
anche senza l istruzione SAVE.

26
CAPITOLO 1. IL FORTRAN-77 1.54. ISTRUZIONE DATA

1.54 Istruzione DATA


Questa istruzione e adoperata per definire i valori iniziali delle variabili
e dei vettori. Strettamente parlando non e un istruzione di specificazio-
ne, segue tutte le istruzioni di dichiarazione e prende effetto solamente
quando il programma e inserito nella memoria. La forma e del tipo:
DATA nlista/clista/nlista/clista/
dove ogni nlista e una lista di variabili, vettori, elementi di vettori,
sottostringhe oppure liste di DO implicite; ogni clista e una lista di
costanti che forniscono il valore iniziale. Le virgole separanti il simbolo
/ e nlista sono degli optional.
I nomi di argomenti fittizi o funzioni non possono essere adoperati
in codesta istruzione. Riportiamo alcuni esempi:
PARAMETER (NX=64,NY=80,NTOTAL=NX*NY)
REAL*4 ALLSET (NX,NY)
DATA ALLSET /NTOTAL * 0.0 /
CHARACTER * 8 A,B
DATA A,B,C/VOGLIAMO/TRONCARE/

1.55 Istruzioni di assegnazione


Le istruzioni di assegnazione sono usate per assegnare un valore, usual-
mente quello di un espressione, ad una variabile o ad un elemento di
vettore. Possono anche essere utilizzate per modificare i contenuti di
locazioni di memoria assoluta.

1.56 Assegnazioni aritmetiche


Le istruzioni di assegnazione aritmetica sono usate per assegnare un
valore a variabili aritmetiche. Assumono la forma:

v = espr

dove v e una variabile o elemento di vettore di un certo tipo aritmetico


ed espr e un espressione aritmetica. Se il tipo di espr e diverso da
quello di v, allora il valore di espr viene convertito al tipo di v prima
della memorizzazione: questo potrebbe causare dei troncamenti.

27
1.57. ASSEGNAZIONI LOGICHE CAPITOLO 1. IL FORTRAN-77

1.57 Assegnazioni logiche


Le istruzioni di assegnazione logica assegnano un valore ad una variabile
logica ed operano nello stesso modo delle assegnazioni aritmetiche:
v = espr
dove v e una variabile o elemento di vettore di tipo logico ed espr e
un espressione logica o anche di tipo aritmetico. Questa ultima puo
contenere espressioni relazionali o espressioni di tipo CHARACTER.
Se il tipo di espr non e logico, il valore assegnato a v e. false., se il
valore di espr e zero, mentre e. true. se il valore di espr e diverso da
zero. Esempio:
LOGICAL LIMITE (1:10)
REAL*4 R(1:100)
LIMITE(J)=R(J).GE.RMIN.AND.R(J).LE.RMAX

1.58 Assegnazioni CHARACTER


Ha la forma del tipo:
v = espr
dove v e una variabile o elemento di vettore o ancora sottostringa di
tipo CHARACTER ed espr e un espressione CHARACTER. Se la
lunghezza di v e maggiore di espr vengono aggiunti degli spazi alla
destra di espr fino a raggiungere la lunghezza di v; se v e minore di espr
i caratteri in eccesso sulla destra sono rimossi.

1.59 Istruzione ASSIGN


Questa istruzione e usata per assegnare l indirizzo di un istruzione
etichettata ad una variabile intera. La forma e del tipo:
ASSIGN S TO V
dove S e un etichetta di un istruzione eseguibile o un istruzione
FORMAT presente nella stessa unita e V e una variabile intera. La
variabile V puo essere poi adoperata nello stesso programma sia in
un istruzione GO TO sia come identificatore di FORMAT in un istru-
zione READ/ WRITE /PRINT. La variabile non puo ovviamente es-
sere richiamata in altre espressioni aritmetiche a meno che non sia
riassegnata con un valore intero. Esempio:

28
CAPITOLO 1. IL FORTRAN-77 1.60. ISTRUZIONI DI CONTROLLO

DIMENSION ARRAY (1:10)


101 FORMAT (10F10.4)
ASSIGN 101 TO MYFORM
WRITE ( LP, MYFORM) ARRAY

1.60 Istruzioni di controllo


Le istruzioni di controllo vengono utilizzate, in FORTRAN, per dirige-
re il flusso dell elaborazione: sono inclusi in questo tipo di istruzione
costrutti per il loop, diramazioni condizionate e incondizionate, strut-
ture decisionali a scelta multipla e possibilita di pausa o interruzione
dell esecuzione di un programma. I trasferimenti di controllo in una
unita del programma si effettuano principalmente con l uso di istru-
zioni GO TO e IF e, inoltre, con l uso sporadico di END ed ERR in
istruzioni di input/output.

1.61 Istruzione GO TO incondizionata


Questa istruzione produce un trasferimento incondizionato del flusso su
un altra istruzione etichettata:
GO TO S
dove S e un etichetta di un istruzione eseguibile presente nella stessa
unita.

1.62 Istruzione GO TO calcolata


Questa istruzione trasferisce il controllo ad una istruzione scelta da una
lista secondo una condizione specifica. La forma e del tipo:
GO TO(s1,s2,....sn) espr
dove ogni sn e un etichetta di un istruzione eseguibile presente nella
stessa unita ed espr e un istruzione di tipo intero utilizzata per selezio-
nare,tra le sn, l istruzione cui trasferire il controllo. La virgola prima
di espr e un optional. La scelta viene effettuata nel modo seguente: se
il valore di espr e 1, il controllo viene trasferito ad s1, se espr ha valore
2, il controllo viene trasferito ad s2, e cos via. Se il valore di espr e
minore di 1 o maggiore del numero di etichette nella lista, non viene

29
1.63. ISTRUZIONE GO TO ASSEGNATA CAPITOLO 1. IL FORTRAN-77

effettuato alcun trasferimento. La stessa etichetta puo comparire piu


di una volta nella stessa lista. Esempio:
GO TO(100,200,300,...100) MOD(KCONTA,5)+1

1.63 Istruzione GO TO assegnata


E un istruzione obsoleta ma mantenuta per compatibilita con il FOR-
TRAN IV. Trasferisce il controllo ad una istruzione che ha un etichetta
assegnata ad un intero tramite un ASSIGN. Ha la forma:
GO TO V
dove V e la variabile intera cui e stato assegnato l indirizzo di una
istruzione eseguibile etichettata.

1.64 Blocco IF
Un blocco IF permette di eseguire le istruzioni in maniera condizionale.
La forma e del tipo:
IF (LEXP1) THEN
BLOCCO1
ELSEIF (LEXP2) THEN
BLOCCO2
ELSE
BLOCCO3
END IF
dove ogni LEXP e un espressione logica e ogni blocco contiene istru-
zioni eseguibili (eccetto l END), compresi altri blocchi IF. Ogni blocco
di istruzioni che segue un IF / ELSEIF e eseguito solo se la corrispon-
dente espressione logica ha il valore .true.; il blocco ELSE e eseguito
solo se tutte le precedenti espressioni logiche sono risultate false. Dopo
l esecuzione delle istruzioni contenute in un blocco, il controllo viene
trasferito all istruzione immediatamente seguente l ENDIF. Le istru-
zioni ELSE ed ELSE IF possono essere omesse: l ultima in particolare
puo essere ripetuta quante volte si vuole.
Per ogni istruzione IF-THEN deve essere sempre presente l END
IF. Ricordiamo che non e possibile passare dal blocco in un altra parte
dell unita.

30
CAPITOLO 1. IL FORTRAN-77 1.65. ISTRUZIONE IF LOGICA

1.65 Istruzione IF logica


L istruzione logica IF permette che una singola istruzione sia eseguibile
in maniera condizionale. L istruzione assume la forma:
IF (LEXP) ISTRUZ
dove LEXP e un espressione logica ed ISTRUZ e un istruzione
eseguibile,escluso DO, IF-THEN, ELSE IF, ELSE, END IF, END o un
altro IF logico. L istruzione ISTRUZ e eseguita solo se l espressione
logica LEXP ha il valore.TRUE.. Esempio:
IF (X.GT.0.5 ) CALL MODIFICA (X)

1.66 Istruzione IF aritmetica


Quest istruzione e obsoleta e viene mantenuta solo per compatibilita
con il
FORTRAN-IV. La sua forma e del tipo:
IF (ESPR)s1,s2,s3
dove ESPR e un espressione INTEGER, REAL o DOUBLE PRE-
CISION, e ogni s e un etichetta relativa ad una istruzione eseguibile.
Il flusso e trasferito ad s1, s2, s3 a seconda che il valore di ESPR sia
negativo, zero o positivo.

1.67 Istruzione DO
L istruzione DO e usata per definire un DO-LOOP. Questo loop puo
contenere un numero a piacere di istruzioni eseguibili ( eccetto l END )
che vengono eseguite ripetutamente con una sequenza regolare di valori
di una variabile chiamata variabile del do. La forma dell istruzione e
del tipo:
DO s, v=e1,e2,e3
oppure
DO s, v=e1,e2, e
dove s e l etichetta di un istruzione eseguibile, v e la variabile
del DO di tipo INTEGER, REAL o DOUBLE PRECISION e ogni e
e un espressione di tipo intero, reale o doppia precisione, indicanti,
rispettivamente, il valore iniziale, il valore finale e l incremento di v.
La virgola dopo l etichetta e un optional ma e raccomandato contro
gli errori. Esempio:

31
1.68. ISTRUZIONE DO-WHILE CAPITOLO 1. IL FORTRAN-77

DO 55, N= -100, MAX (LIMIT, 100),2


blocco istruzioni
55 continue
Il DO-LOOP consiste nel blocco di istruzioni eseguibili dall istru-
zione DO a quella con etichetta s inclusa. Il LOOP puo contenere
istruzioni CALL, funzioni di referenza e blocchi IF/ END IF come al-
tri blocchi DO. E necessario pero che ogni struttura, sia blocco IF che
DO-LOOP, venga interamente contenuta nel range del DO-LOOP piu
esterno. In alcune implementazioni, tipo UNIX-FORTRAN o MICRO-
SOFT, e stata soppressa l etichetta del DO e abbiamo semplicemente:
DO v=e1, e2, e3
blocco istruzioni
END DO
L esecuzione di un DO-LOOP procede nel modo seguente:

1. viene valutato e1 (valore iniziale) ed assegnato alla variabile v del


loop, con appropriata conversione di tipo, se necessaria.

2. vengono valutate le espressioni e2 ed e3 ( rispettivamente valo-


re limite ed incremento o passo ). Se e3 e stato omesso, viene
considerato il valore di default 1.

3. Viene calcolato il numero di iterazioni con la seguente espressione:


MAX ( INT (( e2 - e1 + e3 )/e3 ), 0 ). Si ottiene quindi il numero
di volte che il blocco di istruzioni nel loop verra eseguito.

4. se questo numero di istruzioni e nullo, il controllo dell esecuzio-


ne viene trasferito alla prima istruzione che segue l END DO o
l etichetta del loop.

5. se il numero di iterazioni e maggiore di zero, vengono eseguite le


istruzioni del blocco.

6. la variabile del loop viene incrementata di e3, il numero di itera-


zioni e decrementato di uno e si riprende dal passo 4.

1.68 Istruzione DO-WHILE


Questa e un istruzione che esiste solo sul UNIX-FORTRAN o MICRO-
SOFT e fornisce un metodo per il loop non necessariamente controllato

32
CAPITOLO 1. IL FORTRAN-77 1.69. ISTRUZIONE CONTINUE

da un conto di iterazioni. In pratica si esegue un blocco di istruzioni


fino a che il valore dell espressione logica e falsa. In ogni passo del
LOOP viene controllata la variabile logica; se e vera (.true. ) vengono
eseguite le espressioni del LOOP, se e falsa (.false. ) il controllo viene
trasferito all istruzione dopo il LOOP. La forma dell istruzione e la
seguente:
[ DO s ] WHILE expr
dove s e l istruzione etichettata eseguibile che definisce il ran-
ge del loop: puo essere anche una istruzione REPEAT o END DO.
L espressione expr e un test di tipo logico. Il seguente esempio e tratto
dalla teoria dei frattali e costituisce il loop principale dell insieme di
Mandelbrot:
IM = 0
DO I= 0,NPIX1
CY=YMIN + I*DELTA/NPIX
DO J=0,NPIX1
CX=XMIN+J*DELTA/NPIX
COMPLEX = CX + IMM*CY
C DIMENSIONE NUMERO COMPLESSO
Z=0
NDIM = 0
DO WHILE (CABS(Z).LE. 2.0.AND. NDIM .LT.ITER)
Z=Z*Z+COMPLEX
NDIM=NDIM+1
END DO
IM = IM +1
MATRIX (IM) = NDIM
END DO
END DO

1.69 Istruzione CONTINUE


L istruzione CONTINUE fornisce un punto di riferimento e, pratica-
mente, traferisce il controllo all istruzione seguente. E usato princi-
palmente come fine del vecchio DO LOOP, ma puo comparire ovunque
nell unita di programma. Esempi:
GO TO 400
...........

33
1.70. ISTRUZIONE STOP CAPITOLO 1. IL FORTRAN-77

400 CONTINUE
DO 600 J=1,300
..................
600 CONTINUE

1.70 Istruzione STOP


Questa istruzione termina l esecuzione del programma e produce un
ritorno al sistema operativo usato. Si presentano due casi:
STOP
oppure
STOP [disp]
dove [disp] rappresenta una variabile CHARACTER oppure un nu-
mero non piu grande di 5 cifre. Questa variabile puo essere un messaggio
da visualizzare o un numero di riferimento per errori di esecuzione del
programma. Esempio:
STOP Ci sono troppi elementi

1.71 Istruzione PAUSE


L istruzione PAUSE e simile all istruzione dello STOP con la differenza
che la sospensione dell esecuzione e solo temporanea. L esecuzione
riprende con una istruzione del sistema operativo che nel caso del VMS
e $ CONTINUE. Si sconsiglia l uso di questa istruzione quando i sistemi
devono essere trasportabili. La forma e del tipo
PAUSE [s]
dove s e una stringa di caratteri o un numero fino a 5 cifre, inviata
su uno schermo come messaggio per l utente.

1.72 Istruzioni di INPUT/OUTPUT


Le istruzioni di Input/Output forniscono un canale di comunicazione
tra il programma FORTRAN e il mondo esterno. Ci sono tre gruppi
di istruzioni di input/output. Nel primo gruppo si trovano le istruzioni
READ, WRITE, PRINT che attuano il trasferimento dei dati fra unita;
fanno parte del secondo gruppo BACKSPACE, ENDFILE e REWIND

34
CAPITOLO 1. IL FORTRAN-77 1.73. NOZIONI GENERALI

che compiono operazioni ausiliarie. Tutte queste istruzioni fanno riferi-


mento ad unita logiche intere che si riferiscono a file ed apparati esterni
( lettori di nastri / stampanti / dischetti / terminali ). Nel terzo gruppo
troviamo OPEN, CLOSE e INQUIRE che correlano le unita logiche di
uscita o ingresso con il nome dei file.

1.73 Nozioni generali

In questo paragrafo verranno spiegati in generale i concetti che riguar-


dano record e file per una migliore comprensione delle istruzioni di
Input / Output.

1.74 Record

Tutti gli I/O del FORTRAN hanno luogo tramite una struttura chiama-
ta RECORD. Un record puo essere un singolo carattere, una sequenza
di caratteri o di valori; puo essere una linea di testo, le coordinate per
il pennino di un plotter, i dati letti da uno scanner o ( fino a circa 10
anni fa ) una scheda perforata.
Il FORTRAN usa tre tipi di record: formattato, non formattato
e di fine file ( endfile ). Un record formattato e costituito da una
sequenza di caratteri ASCII, terminata o meno con un carriage return
, un avanzamento di linea o entrambi. Ogni singola riga di testo di
questo manuale, per esempio, e un record formattato. La lunghezza
minima per un record formattato e zero e la massima e 1024. Un
record non formattato e una sequenza di valori e la sua interpretazione
dipende dal tipo di dati. Per esempio il binario 01010111 puo essere
interpretato come valore intero 87 o valore carattere W a seconda del
tipo di dato. La lunghezza minima di un record non formattato e zero
e la massima e 1024, eccetto per i record ad accesso sequenziale ( vedi
oltre ) non contenenti informazioni sulla lunghezza del record, che puo
quindi essere illimitata. Il record di endfile e l ultimo record di un file
e non ha lunghezza.

35
1.75. FILE CAPITOLO 1. IL FORTRAN-77

1.75 File
Un file e composto da record, puo essere creato ed e accessibile anche
con mezzi diversi dai programmi in linguaggio FORTRAN. Per esempio
si puo creare e modificare un file di testo con un editor e manipolarne
le informazioni con un programma in FORTRAN. I file contenuti in
nastri e dischi sono generalmenti detti esterni; i file memorizzati nella
memoria principale sono chiamati file interni. La posizione all interno
di un file si riferisce al prossimo record che sara letto o scritto. Quando
si accede ad un file ( lo si apre ) si e posizionati prima del primo record
e la fine del file e subito dopo il record di endfile. Alcune istruzioni di
I/O permettono di cambiare la posizione corrente in un file.

1.76 Accesso ai file


Il metodo usato per trasferire record a o da file e chiamato modalita di
accesso. L accesso ai file avviene attraverso il loro nome. I file esterni
possono contenere sia record formattati che non formattati. Quando un
record in un file puo essere letto o scritto in modo arbitrario, casuale,
la modalita di accesso e detta DIRETTA. Si accede ai singoli record
attraverso un numero di record, che e un intero positivo. Tutti i record
in un file ad accesso diretto hanno la stessa lunghezza e contengono solo
i dati attualmente scritti su di essi; non ci sono caratteri di fine record.
I record possono essere riscritti ma non cancellati. Generalmente solo
i file su disco possono usare la modalita di accesso diretto per il trasfe-
rimento dei record. Quando i record vengono trasferiti in ordine, uno
dopo l altro, la modalita di accesso e detto SEQUENZIALE. I record
in un file ad accesso sequenziale possono essere di diversa lunghezza.
Alcuni file, come terminali, stampanti e lettori di nastri, possono usare
solo questa modalita di accesso. I file ad accesso sequenziale formattato
contengono solitamente informazioni di tipo testo e ogni record ha un
carattere di fine record. L accesso sequenziale non formattato e gene-
ralmente utilizzato per due motivi che possono sembrare contrastanti:
1) per il controllo di plotters, terminali grafici, stampanti, etc. e per
procedere su informazioni binarie non codificate come i file.OBJ. In
questo caso e importante che i dati trasferiti da e al mezzo esterno sia-
no un flusso di bytes senza informazioni sulla lunghezza del record. 2)
per la comprensione dei dati e la velocita di accesso che caratterizzano

36
CAPITOLO 1. IL FORTRAN-77 1.77. FILE INTERNI

questa modalita. In questo caso deve poter essere possibile determinare


la lunghezza del record per letture parziali.

1.77 File interni


I file interni possono contenere variabili CHARACTER, elementi di
vettore di tipo CHARACTER e sottostringhe CHARACTER. Un fi-
le interno che contenga una variabile, un elemento di vettore o una
sottostringa, tutti di tipo CHARACTER, ha un solo record, la cui lun-
ghezza e quella dell entita CHARACTER considerata. Un file interno
che contenga un vettore di tipo CHARACTER, ha tanti record quanti
sono gli elementi del vettore, la cui lunghezza e uguale a quella degli
elementi stessi. I dati di questi file possono essere trasferiti solo con
la modalita di accesso sequenziale formattato. Solitamente questi file
vengono utilizzati per la conversione del tipo di variabili da numerico
a CHARACTER.

1.78 Istruzione OPEN


Questa istruzione e adoperata per connettere un unita logica ad un file
e specificare le sue caratteristiche. Puo aprire un file esistente oppure
crearne uno nuovo. Assume la forma del tipo
OPEN ( olista )
dove OLISTA e una lista di argomenti ognuno separato da una
virgola:
UNIT= u Specifica il numero dell unita. I numeri 5, 6, (*)
indicano lo standard input ( tastiera ) e lo standard output (schermo ).
STATUS = cexpr Dove cexpr e un espressione CHARACTER
che assume il valore OLD se il file e gia esistente, NEW se voglia-
mo crearne uno nuovo, SCRATCH per inserire un file nella memoria
dinamica.
FILE = cexpr dove cexpr e una espressione CHARACTER che
riporta il nome del file; non deve essere usata insieme a SCRATCH.
ACCESS = cexpr dove cexpr e un espressione CHARACTER
che assume il valore SEQUENTIAL o ( per default ) DIRECT.
FORM = cexpr dove cexpr e un espressione CHARACTER con
il valore FORMATTED oppure UNFORMATTED

37
1.79. ISTRUZIONE CLOSE CAPITOLO 1. IL FORTRAN-77

RECL = iexp dove iexp e un espressione intera che specifica la


lunghezza del record; deve essere data per i file ad accesso DIRECT.
Le unita sono CHARACTERS per i file FORMATTED.
BLANK = cexpr , dove cexpr e un espressione CHARACTER
che specifica il trattamento standard degli spazi: puo essere un NULL (
gli spazi vengono ignorati ) oppure uno ZERO ( gli spazi sono sostituiti
da zeri ).
ERR = s dove s e una etichetta che si riferisce ad una istruzione
cui viene passato il controllo dell esecuzione in caso di errore.
IOSTAT=ios dove ios e il nome simbolico di una variabile IN-
TEGER*4 o di un elemento di vettore. Nel caso di errori, ios assume
un valore positivo; se si verifica la condizione di endfile, ios assume il
valore -1 ed infine in caso di operazione conclusa senza errori ios assume
il valore zero. Esempi:
OPEN (unit=8, file=espe.dat, status=NEW)
OPEN (unit=N+5, file=dev//dati, status=OLD,
$ ERR = 99 )
OPEN (unit= 1,file=fnome, status=OLD,
$ FORM=UNFORMATTED, IOSTAT= KODE )

1.79 Istruzione CLOSE


Tutti i file e le unita sono chiuse automaticamente alla fine del pro-
gramma. Una istruzione CLOSE esplicita puo servire per riassegnare
successivamente un file o una unita;
CLOSE ( lista )
dove lista e una serie di argomenti scelti da:
UNIT = u specifica l unita
STATUS = cexp e un espressione CHARACTER del tipo KEEP
per conservare i file oppure DELETE per cancellarli.
IOSTAT = iv ritorna il tipo di errore.
ERR = s se si verifica un errore di chiusura, ritorna all unita s.
Esempio:
CLOSE (UNIT=15, STATUS=DELETE,ERR=999)

38
CAPITOLO 1. IL FORTRAN-77 1.80. ISTRUZIONE INQUIRE

1.80 Istruzione INQUIRE


L istruzione INQUIRE e usata per ottenere informazioni sulle proprieta
di unita logiche o di file. Ci sono due forme:
INQUIRE (unit = u, ilist )
INQUIRE (file= cexp, ilist )
dove ilist e una lista contenente uno o piu dei seguenti argomenti:
ERR = s specifica un label per errore di uscita NUMBER= iv ri-
torna il numero dell unita logica RECL = iv ritorna la lunghezza del
record se il file e ad accesso diretto IOSTAT= iv ritorna lo stato del
codice NEXTREC =iv ritorna il numero del prossimo record da leg-
gere o da scrivere EXIST = lv ritorna.true. oppure.false., se l unita
o file esiste o meno OPENED = lv ritorna.true. oppure.false., se
l unita o file e connesso o meno NAMED = lv ritorna.true. se il
file ha un nome, oppure.false. NAME = variabile CHARACTER
definisce il nome del file ACCESS = cv ritorna SEQUENTIAL op-
pure DIRECT secondo il tipo di accesso definito in OPEN FORM
= cv ritorna FORMATTED oppure UNFORMATTED secondo il
tipo di file connesso BLANK = cv ritorna un NULL oppure un
BLANK SEQUENTIAL =cv ritorna YES oppure NOoppure
indefinito secondo il tipo di accesso al file DIRECT =cv ritorna
YES oppure NOoppure indefinito FORMATTED =cv ritorna
YES oppure NO oppure indefinito secondo il tipo di FORM indi-
cato UNFORMATTED =cv ritorna YES oppure NO oppure
indefinito

1.81 Istruzioni READ/WRITE


L istruzione READ trasferisce i dati da un file interno od esterno ad
una lista di espressioni o elementi di vettori. L istruzione WRITE
valuta una lista di espressioni o elementi di vettori e trasferisce i valori
su file interni od esterni. Le istruzioni hanno la forma seguente:
READ (unit= 1,FMT = fmt, REC=iexpp,
$ ERR =s,END = s,IOSTAT =iv)rlista
WRITE (unit= 1,FMT = fmt,REC=iexpp,
$ ERR =s,END = s,IOSTAT =iv)wlista
dove unit = u indica l unita cui e connesso il file. FMT =
fmt specifica il formato in cui leggere o scrivere i dati. REC = rec

39
1.82. ISTRUZIONE REWIND CAPITOLO 1. IL FORTRAN-77

specifica il record in caso di connessioni con accesso diretto. ERR


= s per ridirigere l esecuzione in caso di errore nell operazione di
trasferimento dati. END = s per ridirigere l esecuzione in caso si
verifichi la condizione di endfile durante l operazione di trasferimento
dati. IOSTAT = ios per monitorare gli errori o lo stato di fine file.
Ricordiamo che:

1. il trasferimento di dati unformatted e permesso solo con file


esterni.

2. viene trasferito un record per ogni istruzione di I/O.

3. il trasferimento di dati formatted richiede la specifica del formato


in cui sono stati scritti o devono essere scritti i dati.

4. per ogni istruzione di I/O possono essere trasferiti uno o piu


record.

L istruzione PRINT trasferisce i dati dalla dislocazione interna al


terminale in modo interattivo oppure al batch log in modo batch (ossia
il comando viene posto in coda ). Prende la forma:
Print fmt,list
L istruzione TYPE e praticamente uguale al PRINT ma funzio-
na solo per alcune implementazioni tipo UNIX-FORTRAN. Assume la
forma:
TYPE *,list
L istruzione ACCEPT trasferisce i dati dal terminale alla memo-
ria interna; l accesso e di tipo sequenziale. Anche questa istruzione
funziona solo in UNIX-FORTRAN. Riportiamo la forma piu semplice:
ACCEPT *,list
Esempi:
WRITE (91,101)jx,jy,index(1),index(2)
WRITE (5,(A))TEXT

1.82 Istruzione REWIND


Quest istruzione e usata per posizionare un file sequenziale all inizio
del primo record. Non ha effetto se il file e gia riavvolto. Assume la
forma:
REWIND ( UNIT = u, ERR =s,IOSTAT =iv)

40
CAPITOLO 1. IL FORTRAN-77 1.83. ISTRUZIONE BACKSPACE

Esempio:
REWIND ( UNIT = 3,ERR =120 )

1.83 Istruzione BACKSPACE


L istruzione puo essere usata su un file sequenziale per muovere la
posizione del file indietro di un record. Assume la forma del tipo:
BACKSPACE u
dove u e una variabile intera che specifica l unita logica interessata,
ad esempio un file su disco.

1.84 Istruzione ENDFILE


L istruzione ENDFILE e usata per scrivere un record di end alla fine
di un file. Questo record in UNIX-FORTRAN corrisponde ad un byte
con il valore ASCII 26 ( CTRL/Z). Prende la forma:
ENDFILE u
dove u e una variabile intera che specifica l unita logica interessata.
Supponiamo adesso di volere aggiungere alcuni dati su un file gia esi-
stente. Dovremo prima arrivare alla fine del file tramite un istruzione
di READ, ritornare indietro di una posizione tramite BACKSPACE,
inserire tramite WRITE i dati interessati, richiudere il file tramite EN-
DFILE e finalmente chiudere il file. Come esempio pratico riportiamo
la SUBROUTINE SCRIVIDATI:

SUBROUTINE scrividati (ave,sdev )


implicit real *4 (a-h,o-z)
LOGICAL EXST
iunit = 12
iunit2 = 13
OPEN (iunit2,file=spessore.dat ,type=old)
read (iunit2 , 101) spessore_par,icasi
100 format (f10.4,f10.4,f10.4)
101 format (f10.4,i2)
INQUIRE(FILE=risultati.dat,EXIST=EXST )
IF (EXST) THEN
OPEN(iunit ,file=risultati.dat,type=old)
120 read (iunit , 100,end=130 )zz, xx ,yy

41
1.85. LA SPECIFICAZIONE FORMAT CAPITOLO 1. IL FORTRAN-77

go to 120
130 continue
backspace iunit
write (iunit , 100 )spessore_par,ave,sdev
endfile iunit
close (iunit )
close (iunit2)
ELSE
OPEN(iunit,file=risultati.dat,type=new)
write (iunit , 100)spessore_par, ave, sdev
close (iunit )
close (iunit2)
END IF
return
END

1.85 La specificazione FORMAT


La specificazione del formato dei dati e richiesta dalle istruzioni READ/
WRITE oppure PRINT per controllarne la traduzione fra forma interna
ed esterna. Un FORMAT puo essere inserito in qualsiasi parte del
programma ed e caratterizzato da una etichetta relativa posta nelle
prime cinque colonne. Assume la forma:
100 FORMAT (ed1,ed2.....)
dove ed1, ed2...edn sono i cosidetti descrittori di formato che si
dividono come segue.

1.86 Descrittori ripetibili


Ogni descrittore di questo tipo corrisponde ad una operazione di input
/output. Riportiamo i piu usati:
IW In input, trasferisce w caratteri dal campo esterno ai valori di
lista e assegna ad essi un valore intero. Il dato esterno deve essere un
intero. In output trasferisce il corrispondente valore ad un carattere
esterno che e lungo w elementi. Fw.d In input trasferisce w caratteri
dal campo esterno e assegna ad essi, come valore reale, i corrispondenti
elementi di lista ( che devono essere reali ). Se il primo carattere non

42
CAPITOLO 1. IL FORTRAN-77 1.86. DESCRITTORI RIPETIBILI

Tabella 1.3: Tabella sul format Gw.d

M agnitudine del dato Conversione ef f ettiva


m < 0.1 Ew.d[Ee]
0.1 m < 1.0 F (w 4).d, n(0 0 )
1.0 m < 10.0 F (w 4).(d 1), n( 0 0 )
. .
. .
. .
10 d 2 m < 10 d 1 F (w 4).1, n( 0 0 )
10 d 1 m < 10 d F (w 4).0, n( 0 0 )
m 10 d Ew.d[Ee]

nullo e un segno -, il campo e trattato come negativo. Se invece il


campo non contiene ne un numero decimale ne un esponente viene
trattato come un numero reale di w cifre in cui le d cifre sono a destra
rappresentate da degli zeri. In output, trasferisce la corrispondente
lista arrotondata alla d posizione decimale. Il termine w deve essere
grande abbastanza per includere il segno ( se necessario ), almeno una
cifra alla sinistra del punto decimale e d cifre alla destra del decimale.
Ew.d In input, funziona come il formato F. In output, E trasferisce il
valore della corrispondente lista, arrotondata a d cifre decimali con E
che specifica il valore dell esponente. Il termine w deve essere grande
abbastanza per includere: segno,uno zero,un punto decimale, d cifre e
un esponente. Quindi per tenere conto di queste esigenze il termine w
deve essere maggiore o uguale a d+ 7.
Dw.d Vale per i reali in doppia precisione. In output si comporta
come il formato E, eccetto che la lettera D rimpiazza la lettera E prece-
dente l esponente e abbiamo due cifre come esponente. Gw.d In input,
funziona come il formato F. In output trasferisce la lista corrisponden-
te in funzione della magnitudine, vedi tabella seguente. Tenendo conto
delle varie possibilita w deve essere piu grande o uguale a d+8.
nHc1..cn In input trasferisce n caratteri dal campo esterno al de-
scrittore medesimo.Il primo carattere appare subito dopo la H. Prende
il nome di variabile di Hollerith. Lw In input trasferisce w caratteri
dal campo esterno e assegna un valore logico al corrispondente elemen-

43
1.87. DESCRITTORI NON RIPETIBILI CAPITOLO 1. IL FORTRAN-77

to di lista. Se il primo carattere non nullo e T,t,.T,.t viene assegnato


il valore.TRUE. al corrispondente elemento se invece i primo carattere
non nullo vale F, f,.F, or.f, viene assegnato il valore.FALSE.. In output
trasferisce la lettera T ( se la variabile e vera ) o la lettera F ( se la
variabile e falsa ). La lettera T o F viene messa nella posizione piu
a destra preceduta da w-1 spazi. Aw Se il corrispondente elemento
di I/O e di tipo CHARACTER viene trasmesso un dato character. Il
valore di w deve essere minore od uguale a 32767. Il w puo essere omes-
so e per default viene assegnato un numero di caratteri uguali a quelli
dichiarati nella variabile numerica.

1.87 Descrittori non ripetibili


I seguenti descrittori servono a controllare la posizione in un record o in
un file, ma non corrispondono ad una operazione di I/O: stringa dove
la stringa viene mandata in uscita Tn si posiziona tramite il TAB alla
colonna n Trn si posiziona tramite il TAB a n colonne a destra Tln si
posiziona tramite il TAB a n colonne a sinistra nX lascia n spazi SP
produce un segno prima di tutti i numeri seguenti positivi SS sopprime
il segno prima di tutti i numeri seguenti positivi BN tratta i blanks
seguenti in input come nulli BZ tratta i blanks seguenti in input come
zeri KP setta il fattore di scala per i susseguenti I/O / comincia un
nuovo record
Facciamo alcuni esempi:
A=5
B = - 10
C = 2224
WRITE ( 5, 20 ) A, B, C
20 FORMAT(3I4)
WRITE ( 5, 21 ) A, B, C
21 FORMAT(3(1X,I4))
WRITE ( 5, 22 ) A, B, C
22 FORMAT(1X,A = ,I2 ,1X,B = ,I3,1X,C = ,I5,/)
A = 12
B = 25.4
C = -1.23
WRITE ( 5, 20 ) A, B, C
20 FORMAT(F3.0,F4.1,F5.2)

44
CAPITOLO 1. IL FORTRAN-77 1.87. DESCRITTORI NON RIPETIBILI

WRITE ( 5, 21 ) A, B, C
21 FORMAT(F3.0,1X,2(E12.4,1X))
WRITE ( 5, 22 ) A, B, C
22 FORMAT(F3.0,1X,E12.4,1X,D12.4)
A = 1.
B = 10.
C = 100.
D = 1000.
WRITE ( 5, 22 ) A, B, C, D
22 FORMAT(5G10.4)
WRITE ( 5, 22 ).TRUE.,.FALSE.
22 FORMAT(2L2)
WRITE ( 5, 22 ) BUONGIORNO
22 FORMAT(A6)

45
1.87. DESCRITTORI NON RIPETIBILI CAPITOLO 1. IL FORTRAN-77

46
Capitolo 2

Il Laboratorio

Nei prossimi capitoli verranno illustrati alcuni programmi per l ela-


borazione dei dati ricavati dalle esperienze di laboratorio. Questi pro-
grammi sono stati sviluppati in ambiente MS-DOS usando il compi-
latore Microsoft-FORTRAN versione 5.0. Le esercitazioni sono state
concepite ed implementate in modo tale da risultare accessibili sin dalla
prima volta anche agli utenti sprovvisti di ogni nozione di informatica.
L utente e infatti guidato attraverso tutte le fasi dell esercitazione,
dall immissione corretta dei dati all elaborazione dei parametri sta-
tistici di interesse ed infine alla presentazione finale dei risultati da
istruzioni che appaiono di volta in volta sullo schermo video o grafi-
co. Per alcuni programmi viene dapprima illustrato l argomento o gli
argomenti a cui esso si riferisce e le formule utilizzate. Viene inoltre
inserito il listato del programma in linguaggio FORTRAN,commentato
nelle varie fasi, per l utente che desidera apportare modifiche parti-
colari. I programmi sono quasi tutti scritti in ambiente MS-DOS in
FORTRAN-77 e fanno uso di subroutines contenute nel libro [REC 92]
e per semplicicita non contengono uscite grafiche.

2.1 RETTA
Questo programma illustra come, date due serie di datix ey e l er-
rore relativo alla variabile y in interattivo,al fine di stabilire eventuali
relazioni di tipo lineare tra di esse, vengono calcolati:

47
2.1. RETTA CAPITOLO 2. IL LABORATORIO

1. valor medio:
N
1 X
x = xi (2.1)
N i=1
N
1 X
y = yi (2.2)
N i=1

2. deviazione standard:
v
u N
u 1 X
sx = t (xi x)2 (2.3)
N 1 i=1
v
u N
u 1 X
sy = t (yi y)2 (2.4)
N 1 i=1

3. coefficienti della retta di regressione (coef. angolare b e intercetta


a):
PN
(xi x)(yi y)
b = i=1 PN 2
(2.5)
i=1 (xi x)

a = y bx (2.6)

4. errore sui coefficienti


v
u PN 2
i=1 (yi a bxi )
u
error(b) = t PN (2.7)
(N 2) i=1 (xi x)2
v
u PN
u (yi a bxi )2 1 x2
error(a) = t i=1 [ + PN ] (2.8)
(N 2) N i=1 (xi x)
2

5. coefficiente di correlazione r di Pearson


PN
i=1 (xi x)(yi y)
r = qP (2.9)
N PN
i=1 (xi x)2 i=1 (yi y)2

6. Valore di 2
N
(yi a bxi )
2
)2
X
(a, b) = ( (2.10)
i=1 i

48
CAPITOLO 2. IL LABORATORIO 2.1. RETTA

Segue il listato del programma che usa le subroutine FIT e PEARSN


estratte dal libro [REC 92]:

program retta
C definizione delle variabili e dei vettori utilizzati nel programma
implicit real (a-h,o-z)
character ris
parameter ( max =100)
dimension xreal (1:max)
dimension yreal (1:max)
dimension sigma (1:max)
print *,Programma per il calcolo statistico
print *,Media,Deviazione standard e correlazione lineare
print *,Calcolo del chiquadro e del coefficiente
print *,di correlazione lineare
call attesa
print *,riportiamo anche il parametro q che indica la bonta
print *,del fit , vedi Numerical Recipes I/II
print *,Q = gammq ( (N-2)/2 , chi**2 /2 )
print *,N ==> numero di dati
print *,dove gammq e la funzione gamma incompleta
print *, Q > 0.1 ==> fit accettabile
print *, Q > 0.001 ==> fit accettabile solo se gli
print *, errori sono non-normali oppure
print *, sottostimati ( vedi modulo Youg
print *,Q < 0.001 ==> il modello non funziona !!!
call attesa
100 format (a)
print *,Hai messo i dati nel file retta.dat a
print *,triplette x,y errore sulle y ?
print *,rispondere Y/N ?
read 100,ris
if ((ris.eq.Y).or.(ris.eq.y)) then
go to 150
elseif ((ris.eq.N).or.(ris.eq.n)) then
stop Metti i dati nel file retta.dat a triplette x,y,sy !!
else
stop SCEMO , risposta non valida !!!!!
end if

49
2.2. PARABO CAPITOLO 2. IL LABORATORIO

150 continue
call attesa
open (unit=90,file=retta.dat, status=old)
C input dati
n = 0
199 continue
read (90,*,end = 200)xx,yy ,sy
n = n + 1
xreal ( n ) = xx
yreal ( n ) = yy
sigma ( n ) = sy
go to 199
200 continue
close ( unit = 90 )
mwt = 1
call fit (xreal,yreal,n,sigma,mwt,a,b,errora,errorb,chi2,q)
call pearsn (xreal,yreal,n,r,prob,z)
print *,fit della retta y = a + b * x
print *,a =,a
print *,b =,b
print *,errore su a = ,errora
print *,errore su b = ,errorb
print *,valore del chiquadro =,chi2
print *,valore del coefficiente lineare r =,r
print *,valore di bonta del fit Q =,q
stop
end

2.2 PARABO
Questo programma viene utilizzato per l analisi dei dati dell esercita-
zione sulla bilancia di Cavendish (determinazione della costante di gra-
vitazione mediante il metodo della parabola) oppure per l esercitazione
sulla rotaia ad aria (determinazione della accelerazione di gravita). Si
devono immettere il numero n di dati e, successivamente le n triplette
di valori x,y e errore su y. Tramite la subroutine LFIT, ricavata dal
libro [REC 92] , si calcolano i coefficienti a,b,c della curva parabolica di

50
CAPITOLO 2. IL LABORATORIO 2.2. PARABO

regressione y = a + b x + c x2 e i relativi errori con il metodo dei


minimi quadrati. Viene anche visualizzato il valore sperimentale della
variabile 2 . Segue il listato del programma.

program parabo
C
C definizione delle variabili e dei vettori
C utilizzati nel programma
C
implicit real (a-h,o-z)
parameter ( max =50 )
parameter ( nterm = 3 )
dimension x (1:max)
dimension y (1:max)
dimension sig (1:max)
dimension a (1:nterm)
dimension covar (1:nterm,1:nterm)
dimension lista (1:nterm)
external funcs
C
print *,Programma per il calcolo statistico
print *,Fit con un polinomio di secondo grado
99 continue
C
C input dei dati da tastiera
C
call attesa
print *,Avete messo i dati nel file parabo.dat ?
print *,In sequenza , x , y , errore sulle y .....
call attesa
open (unit=11,file=parabo.dat,status=old)
n = 0
199 continue
read (11,*,end = 200)xx,yy,errory
n = n + 1
x ( n ) = xx
y ( n ) = yy
sig ( n ) = errory
go to 199

51
2.3. PENDO CAPITOLO 2. IL LABORATORIO

200 continue
close ( unit = 11)
do 201 jj = 1, nterm
lista ( jj ) = jj
201 continue
call lfit (x,y,sig,n,a,lista,nterm,covar,nterm,chisq,funcs)
errora = sqrt ( covar (1,1))
errorb = sqrt ( covar (2,2))
errorc = sqrt ( covar (3,3))
print *,fit del polinomio y = a + b * x + c * x**2
print *,a =,a(1)
print *,b =,a(2)
print *,c =,a(3)
print *,errore su a = ,errora
print *,errore su b = ,errorb
print *,errore su c = ,errorc
print *,Valore del chiquadro =,chisq
stop
end

2.3 PENDO
Questo programma e utile nell analisi dei dati dell esercitazione con il
pendolo composto. Vengono richiesti gli errori sulle misure della varia-
bile y (tempo) per la prima e la seconda serie di dati. Successivamenti
si immettono il numero di dati e le coppie di valori x (distanza),y (tem-
po) per la prima serie di dati. Il programma valuta immediatamente
i coefficienti della curva parabolica y = a + b x + c x2 , median-
te chiamata alla subroutine LFIT estratta dal libro [REC 92] che usa
il metodo dei minimi quadrati quando il polinomio interpolante e di
secondo grado.
Analogo procedimento viene seguito per la seconda serie di dati. Il
programma calcola poi lintersezione delle parabole, l errore sullinter-
sezione e finalmente il valore di g ed il suo errore. Alleghiamo il listato
del programma.
program pendo
implicit real (a-h,o-z)
parameter ( max =50 )

52
CAPITOLO 2. IL LABORATORIO 2.3. PENDO

parameter ( nterm = 3 )
parameter ( inc = 3 )
parameter ( reg = 980.5343)
character * 1 prova,video,rispo
character * 40 messag
dimension x (1:max)
dimension y (1:max)
dimension sig (1:max)
dimension x2 (1:max)
dimension y2 (1:max)
dimension sig2 (1:max)
dimension result(1:20)
dimension a (1:nterm)
dimension covar (1:nterm,1:nterm)
dimension lista (1:nterm)
dimension para (1: inc )
dimension epara (1: inc )
dimension messag (1: inc )
external funcs
prova =y
el = 99.3
errl = 0.1
teta = 5.0
eteta = 1.0
nosci = 30
if (( prova.eq.Y).or.(prova.eq.y)) then
print *,Programma per il calcolo di g in CGS tramite
print *,intersezione di due parabole
print *,ovviamente deve essere presente landamento parabolico
print *,nei dati .....
print *,i dati x rappresentano le distanze della massa mobile
print *,dal coltello e sono espresse in cm
print *,i dati y rappresentano i tempi impiegati a compiere
print *,n oscillazioni a vanno espressi in secondi
print *,gli errori sulle y (errori tempi) pure vanno espressi
print *,in secondi !
99 continue
100 format (a1)
print *,Hai messo i dati nel file pendo1.dat

53
2.3. PENDO CAPITOLO 2. IL LABORATORIO

print *,a triplette x [cm],y [sec] errore sulle y [sec] ?


print *,rispondere Y/N ?
read 100, rispo
if ((rispo.eq.Y).or.(rispo.eq.y)) then
go to 150
elseif ((rispo.eq.N).or.(rispo.eq.n)) then
stop Metti i dati nel file pendo1.dat a triplette x,y,sy !!
else
stop SCEMO , risposta non valida !!!!!
end if
150 continue
print *,Hai messo i dati nel file pendo2.dat
print *,a triplette x [cm],y [sec] errore sulle y [sec] ?
print *,rispondere Y/N !
read 100, rispo
if ((rispo.eq.Y).or.(rispo.eq.y)) then
go to 151
elseif ((rispo.eq.N).or.(rispo.eq.n)) then
stop Metti i dati nel file pendo2.dat a triplette x,y,sy !!
else
stop SCEMO , risposta non valida !!!!!
end if
151 continue
print*,Inserire l(distanza fra i coltelli)in [cm] tipo 99.3
read *,el
print*,Inserire errore l in [cm] tipo 0.1
read *,errl
print*,Inserire il numero di oscillazioni tipo 30
read *,nosci
print*,Inserire ampiezza iniziale [gradi] tipo 5
read *,teta
print*,Inserire errore ampiezza iniziale [gradi] tipo 1
read *,eteta
call attesa
end if
open (unit=90,file=pendo1.dat, status=old)
open (unit=91,file=pendo2.dat, status=old)
n = 0
199 continue

54
CAPITOLO 2. IL LABORATORIO 2.3. PENDO

read (90,*,end = 200)xx,yy ,sy


n = n + 1
x ( n ) = xx
y ( n ) = yy
sig ( n ) = sy
go to 199
200 continue
n2 = 0
299 continue
read (91,*,end = 300)xx,yy ,sy
n2 = n2 + 1
x2 ( n2 ) = xx
y2 ( n2 ) = yy
sig2 ( n2 ) = sy
go to 299
300 continue
errort = sig2 (1)
close ( unit = 90 )
close ( unit = 91 )
mfit = nterm
do 333 j=1,mfit
lista(j)= j
333 continue
call lfit (x,y,sig,n,a,lista,nterm,covar,nterm,chisq,funcs)
errora = sqrt ( covar (1,1))
errorb = sqrt ( covar (2,2))
errorc = sqrt ( covar (3,3))
print *,Risultati prima parabola .......................
print *,Minimi quadrati con y = a + b * x + c * x**2
print *,numero dati =,n
print *,a =,a(1)
print *,b =,a(2)
print *,c =,a(3)
print *,errore su a = ,errora
print *,errore su b = ,errorb
print *,errore su c = ,errorc
print *,Valore del chiquadro =,chisq
if (( prova.eq.Y).or.(prova.eq.y)) then
call attesa

55
2.3. PENDO CAPITOLO 2. IL LABORATORIO

end if
result (1) = a(1)
result (2) = a(2)
result (3) = errora
result (4) = errorb
result (5) = chisq
result (6) = a(3)
result (7) = errorc
mfit = nterm
do 334 j=1,mfit
lista(j)= j
334 continue
call lfit (x2,y2,sig2,n2,a,lista,nterm,covar,nterm,chisq,funcs)
errora = sqrt ( covar (1,1))
errorb = sqrt ( covar (2,2))
errorc = sqrt ( covar (3,3))
print *,Risultati seconda parabola .......................
print *,Minimi quadrati con y = a + b * x + c * x**2
print *,numero dati =,n
print *,a =,a(1)
print *,b =,a(2)
print *,c =,a(3)
print *,errore su a = ,errora
print *,errore su b = ,errorb
print *,errore su c = ,errorc
print *,Valore del chiquadro =,chisq
if (( prova.eq.Y).or.(prova.eq.y)) then
call attesa
end if
result (11) = a(1)
result (12) = a(2)
result (13) = errora
result (14) = errorb
result (15) = chisq
result (16) = a(3)
result (17) = errorc
a1 = result (1)
b1 = result (2)
c1 = result (6)

56
CAPITOLO 2. IL LABORATORIO 2.3. PENDO

a2 = result (11)
b2 = result (12)
c2 = result (16)
call radici (a1,b1,c1,a2,b2,c2,val,err,errort)
val = val / nosci
err = err / nosci
para (1) = val
para (2) = el
para (3) = teta
epara (1) = err
epara (2) = errl
epara (3) = eteta
messag (1)= peso-errore periodo =
messag (2)= peso-errore lunghezza =
messag (3)= peso-errore ampiezza =
print *,Dati di input per il calcolo di g
print *,periodo come da intersezione [sec]=,para(1)
print *,errore periodo [sec]=,epara(1)
print *,distanza fra i coltelli [cm ]=,para(2)
print *,errore distanza fra i coltelli[cm ]=,epara(2)
print *,ampiezza iniziale [gradi ]=,para(3)
print *,errore ampiezza iniziale [gradi ]=,epara(3)
print *,**************************************
print *,Dati di output
print*,g=4*(pigrec**2)*(l/T**2)(1+(0.5*sen(0.5*teta))**2)**2
call value (valore,para,inc)
error = 100 * abs ((reg - valore)/reg)
vero = valore
print *,g [cm/sec**2] =,valore
print *,g vero a TORINO [cm/sec**2]=,reg
video=N
call errori (valore,evalo,para,inc,epara,messag,video)
ippm = nint ( evalo /vero * 1.0E+6 )
print * ,errore su g [cm/sec**2] =,evalo
print * ,errore su g in ppm =,ippm
print * ,errore g sul valore vero =,error, %
teta=0.
para (3) = teta
call value (valoresenza,para,inc)

57
2.3. PENDO CAPITOLO 2. IL LABORATORIO

ippmteta=nint(((valoresenza-vero)/vero)* 10E+6)
print *,g senza teta =,valoresenza
print *,influenza di teta su g in ppm =,ippmteta
video=Y
valore = vero
call errori (valore,evalo,para,inc,epara,messag,video)
stop
end
subroutine radici (a1,b1,c1,a2,b2,c2,val,err,errort)
implicit real ( a-h,o-z)
c = a1 - a2
b = b1 - b2
a = c1 - c2
disc = b**2 - 4 *a*c
if ( disc.lt.0.0) then
stopradici immaginarie
end if
x1 = - ( b/(2*a)) + sqrt ( disc)/(2*a)
x2 = - ( b/(2*a)) - sqrt ( disc)/(2*a)
y1 = a1 + b1 * x1 + c1 *x1**2
y2 = a1 + b1 * x2 + c1 *x2**2
if ((y1.gt.0).and.(y2.gt.0)) then
print *,caso di due radici positive
val = ( y1 + y2 )/2.0
err = abs ( y1-y2)
if ( err.lt.errort) then
err = errort
end if
end if
if ((y1.lt.0).and.(y2.gt.0)) then
print *,caso di una radice positiva e una negativa
val = y2
err = errort
end if
if ((y2.lt.0).and.(y1.gt.0)) then
print *,caso di una radice positiva e una negativa
val = y1
err = errort
end if

58
CAPITOLO 2. IL LABORATORIO 2.3. PENDO

return
end

subroutine value (valore,para,inc)


implicit real (a-h,o-z )
parameter ( pigrec = 3.1415927 )
dimension para ( 1 : inc )
t = para (1)
el = para (2)
teta = para (3)
tetar = 2 * pigrec * teta / 360.
cor = ( 1.0 + (0.5 * sin (tetar/2.0))**2.0)**2.0
valore = (4 * pigrec**2 * el /( t **2))*cor
return
end

subroutine errori (valore,evalo,para,inc,epara,messag,video)


implicit real (a-h,o-z)
character * 40 messag
character * 1 video
parameter ( int = 10 )
parameter ( norma=10000 )
dimension para (1:inc )
dimension epara (1:inc )
dimension work (1:int )
dimension square (1:int )
dimension inter (1:int )
dimension messag (1:inc )
if (int.lt.inc)stop cambiare int
vero = valore
evalo = 0.0
do 100 j = 1 ,inc
work (j) = para (j)
100 continue
quadro = 0.0
do 200 j = 1 ,inc
do 190 i = 1 , inc
para (i) = work(i)
190 continue

59
2.4. CAVEN CAPITOLO 2. IL LABORATORIO

para (j) = para(j) + epara(j)


call value (valore,para,inc)
delta = valore - vero
d2 = delta *delta
quadro = quadro + d2
square (j) = d2
200 continue
sq2 = 0.0
do 205 j= 1,inc
sq2 = sq2 + square ( j)
205 continue
do 206 j= 1,inc
inter (j) = nint ( square ( j) * (norma*1.0)/sq2)
206 continue
if (( video.eq.Y).or.( video.eq.y)) then
print*,************************************
print *,Peso normalizzato a,norma, delerrore delle variabili
do 207 j= 1, inc
print *,messag(j),inter(j)
207 continue
end if
evalo = sqrt ( quadro)
do 210 i = 1 , inc
para (i) = work(i)
210 continue
return
end

2.4 CAVEN
Questo programma valuta i parametri caratteristici dell oscillatore
smorzato, con il quale vengono interpolati i dati delle ampiezze di oscil-
lazione [cm] in funzione del tempo [sec] ricavati dalla esperienza con
la bilancia di Cavendish. Le coppie di dati (tempi ed ampiezze) vanno
memorizzate nel file CAV.DAT, mentre in fase di esecuzione viene ri-
chiesto l errore [cm] sulla misura delle ampiezze e la distanza [cm] fra
asse della bilancia e riga per la rilevazione dati. Tramite la subrouti-
ne MRQMIN (estratta dal libro [REC 92]) vengono calcolati i cinque

60
CAPITOLO 2. IL LABORATORIO 2.4. CAVEN

parametri A,T,, ,Cost che caratterizzano la seguente equazione:


t
y = A seno(2 t/T + ) e + Cost (2.11)

In seguito si ricava la costante di Cavendish utilizzando i seguenti valori


caratteristici della bilancia:

m = (15.0 0.12) 103 Kg (2.12)

M = (1.503 0.001) Kg (2.13)


r = (4.5 0.1) 102 m (2.14)
d = (5.0 0.1) 102 m (2.15)
l 5.0m (misurato durante l0 esercitazione) (2.16)
Riportiamo la formula utilizzata per il calcolo;

G=ABC D (2.17)

dove
d r2
A= (2.18)
2M
2
B = 2 + 2 dove = (2.19)
T
C = |2 1 | (2.20)
con
E1
1 = E1 = posizione iniziale sull0 asta graduata (2.21)
l
E2
2 = E2 = posizione f inale sull0 asta graduata (2.22)
l
1
D= (2.23)
r3
1
3
[(2d)2 + r2 ] 2
Viene inoltre calcolato l errore percentuale sul valore esatto della co-
stante dato da
|Gricavato Gvero |
Errore = 100 . (2.24)
Gvero

61
2.4. CAVEN CAPITOLO 2. IL LABORATORIO

Viene calcolato poi l errore sulla costante G usando la legge di pro-


pagazione degli errori di Gauss: in questo caso le derivate parziali
vengolo calcolate tramite algoritmo numerico. Il programma calcola
poi G tramite il metodo dell escursione finale e quello della parabola.
Per confronto viene poi riportato Riportiamo il listato del programma
CAVEN:

program caven
implicit real (a-h,o-z )
character * 1 prova,video,rispo
parameter(max=250,ma =5,inc=7 )
parameter(nterm = 2 )
dimension x (1:max )
dimension y (1:max )
dimension sig (1:max )
dimension a (1:ma )
dimension ia (1:ma )
dimension covar(1:ma,1:ma)
dimension alpha(1:ma,1:ma)
dimension erroa (1:ma )
dimension para (1:inc )
dimension epara (1:inc )
dimension ovar (1:nterm,1:nterm)
dimension lista (1:nterm)
external fun2c
external fosci
prova =N
1000 format (A2)
100 format (a1)
print *,Programma per il calcolo statistico
print *,Interpolazione di una sinusoide smorzata
print *,*************************************************
if ((prova.eq.N).or.(prova.eq.n)) then
print *,Avete messo i dati nel file caven.dat ?
print *,in sequenza t [sec] , ampiezze [cm] ?
print *, inserire (Y/N ) !
read 100, rispo
if ((rispo.eq.Y).or.(rispo.eq.y)) then
go to 150

62
CAPITOLO 2. IL LABORATORIO 2.4. CAVEN

elseif ((rispo.eq.N).or.(rispo.eq.n)) then


stop Metti i dati nel file caven.dat a coppie !!
else
stop SCEMO , rispo non valida !!!!!
end if
150 continue
end if
print *,Attenzione il programma non funziona sempre e quindi
print *,osservate le seguenti regole !!!!!!!!!!!
print *,1)il primo dato rappresenta inizio della sinusoide
print *,2)il dato ultimo deve essere quello di equilibrio finale
print *,3)i dati anomali vanno eliminati
call attesa
if ((prova.eq.Y).or.(prova.eq.y)) then
el = 544.0
eel = 1.0
eey = 0.2
else
print *,Scrivere il valore della distanza [cm] ( circa 544)
read *,el
print *,Scrivere errore della distanza [cm] ( circa 1 )
read *,eel
print *,Scrivere errore lettura scala [cm] ( circa 0.2)
read *,eey
end if
open (unit=90,file=caven.dat, status=old)
npt = 0
199 continue
read (90,*,end = 200)xx,yy
npt = npt + 1
if ( npt.gt.max) stop Aumentare max !
x ( npt ) = xx
y ( npt ) = yy
sig ( npt ) = eey
go to 199
200 continue
close ( unit = 90 )
a (1) = abs ( y (npt) - y (1))
a (2) = 500

63
2.4. CAVEN CAPITOLO 2. IL LABORATORIO

a (3) = asin (( y (1)- y (npt))/a(1))


a (4) = 500
a (5) = y (npt)
do 210 j= 1 , ma
ia (j) = 1
210 continue
alamda=-1
call mrqmin(x,y,sig,NPT,a,ia,MA,covar,alpha,
* MA,chisq,fosci,alamda)
k=1
itst=0
1 continue
k=k+1
ochisq=chisq
call mrqmin(x,y,sig,NPT,a,ia,MA,covar,alpha,
* MA,chisq,fosci,alamda)
if (chisq.gt.ochisq) then
itst=0
else if (abs(ochisq-chisq).lt.0.1) then
itst=itst+1
endif
if (itst.lt.4) then
goto 1
endif
alamda=0
call mrqmin(x,y,sig,NPT,a,ia,MA,covar,alpha,
* MA,chisq,fosci,alamda)
erroa ( 1 ) = sqrt(covar (1,1))
erroa ( 2 ) = sqrt(covar (2,2))
erroa ( 3 ) = sqrt(covar (3,3))
erroa ( 4 ) = sqrt(covar (4,4))
erroa ( 5 ) = sqrt(covar (5,5))
print *,Fittiamo i dati con la seguente funzione nonlineare
print *,y=a(5)+a(1)*(sin(2*pigrec*x/a(2)+a(3)))*exp(-x/a(4))
print *,a(1) =,a(1), err a(1)=,erroa(1)
print *,a(2) =,a(2), err a(2)=,erroa(2)
print *,a(3) =,a(3), err a(3)=,erroa(3)
print *,a(4) =,a(4), err a(4)=,erroa(4)
print *,a(5) =,a(5), err a(5)=,erroa(5)

64
CAPITOLO 2. IL LABORATORIO 2.4. CAVEN

print *,chisq =,chisq


call attesa
recav = 6.67259 E-11
egran = 1.500
er = 4.652 E-02
eb = 4.500 E-02
ed = 5.0 E-02
eegran = 1.0 E-3
eer = 0.1 E-02
eed = 0.1 E-02
para(1) = egran
para(2) = el
para(3) = er
para(4) = ed
para(5) = a(1)
para(6) = a(2)
para(7) = a(4)
epara(1) = eegran
epara(2) = eel
epara(3) = eer
epara(4) = eed
epara(5) = erroa(1)
epara(6) = erroa(2)
epara(7) = erroa(4)
print *,Sinopsi dei dati fisici adoperati
print *,M [kg] =,egran,+-,eegran
print *,r [cm] =,er,+-,eer
print *,b [cm] =,eb,+-,eer
print *,d [cm] =,ed,+-,eed
print *,l [cm] =,el,+-,eel
call attesa
call gtutto (cav,para,inc)
ver = cav
valore = cav
video =N
cav = ver
call calco (ecav,cav,para,inc,epara,video)
cav = ver
error = 100 * abs ((recav - cav)/recav)

65
2.4. CAVEN CAPITOLO 2. IL LABORATORIO

ippm = nint ( ecav/cav * 1.0E+6 )


print *,Metodo delle oscillazioni smorzate completo
print *,Formule come in Guida alla Elaborazione dei dati
print *, oppure Guida alla Fisica del Laboratorio
print * ,costante di Cavendish =,valore
print * ,errore costante di Cavendish =,ecav
print * ,errore costante di Cavendish in ppm=,ippm
print * ,errore percentuale sul valore vero=,error,%
video =Y
cav = ver
call calco (ecav,cav,para,inc,epara,video)
call attesa
para ( 3 ) = eb
call gescur (cave,caves,para,inc)
valore = cave
video =N
cave = valore
call calcos (ecave,cave,para,inc,epara,video)
cave = valore
ippm = nint ( ecave/cave * 1.0E+6 )
error2 = 100 * abs ((recav - cave )/recav)
print *,Metodo escursione finale ( come da manuale Leybold )
print *, pigrec **2 b**2 d S
print *, G = ------------------------------
print *, M1 T**2 L
print *,
print *, b** 3
print *, beta = --------------------------------------
print *, (b**2 + 4 d**2 ) sqrt (b**2 + 4 d**2 )
print *,Costante di Cavendish senza correzione = ,caves
print *,Costante di Cavendish con correzione = ,valore
print *,Errore Costante con correzione = ,ecave
print *,Errore costante con correzione in ppm =,ippm
print * ,errore percentuale sul valore vero=,error2,%
video =Y
cave = valore
call calcos (ecave,cave,para,inc,epara,video)
call attesa
tquar = a (2) / 2.5

66
CAPITOLO 2. IL LABORATORIO 2.4. CAVEN

do 500 j= 1, npt
if (x( j ).gt.tquar) then
jvec = j -1
go to 501
end if
500 continue
501 continue
do 600 jj = 1 , nterm
lista ( jj ) = jj
600 continue
C LAVORO
print *,Metodo dell accelerazione
print *,Formule come in Guida alla Fisica del Laboratorio
call lfit (x,y,sig,jvec,a,lista,nterm,ovar,nterm,chisq,fun2c)
errora = sqrt ( ovar (1,1))
errorc = sqrt ( ovar (2,2))
print *,fit della parabola y = a + c * x**2
print *,tempo massimo =,tquar
print *,elementi selezionati =,jvec
print *,a =,a(1)
print *,c =,a(2)
print *,errore su a =,errora
print *,errore su c =,errorc
print *,Valore del chiquadro =,chisq
aa = 2 * a (2)
print *,accelerazione=>2*c[cm/sec**2]=,aa
call attesa
para (1) = egran
para (2) = el
para (3) = er
para (4) = ed
para (5) = aa
epara(1) = eegran
epara(2) = eel
epara(3) = eer
epara(4) = eed
epara(5) = errorc * 2.0
inc2 = 5
call gpara (cav,para,inc2)

67
2.4. CAVEN CAPITOLO 2. IL LABORATORIO

error = 100 * abs ((recav - cav)/recav)


ippm = nint ( ecav/cav * 1.0E+6 )
vcav = cav
video =N
cav = vcav
call capa2 (ecav,cav,para,inc2,epara,video)
cav = vcav
error = 100 * abs ((recav - vcav)/recav)
ippm = nint ( ecav/vcav * 1.0E+6 )
print *,Metodo della parabola
print *,formule come su Guida alla Fisica del laboratorio
print *, b**2 d a
print *, G = --------------
print *, 2 M L
print *,
print *,Costante di Cavendish =,vcav
print *,errore costante di Cavendish =,ecav
print *,errore costante di Cavendish in ppm=,ippm
print *,errore percentuale sul valore vero=,error,%
video =Y
cav = vcav
call capa2 (ecav,cav,para,inc2,epara,video)
stop
end
SUBROUTINE fosci(x,a,y,dyda,na)
implicit real (a-h,o-z)
parameter ( pigrec = 3.1415927)
dimension a (1:na)
dimension dyda(1:na)
y=a(5)+a(1)*(sin(2*pigrec*x/a(2)+a(3 )))* exp(-x/a(4))
dyda(1) = (sin(2*pigrec*x/a(2)+a(3 )))* exp(-x/a(4))
ccc = 2*pigrec*x/(a(2)**2.0)
bbb = (cos(2*pigrec*x/a(2)+a(3 )))* exp(-x/a(4))
aaa = - a(1)
dyda(2) = aaa * bbb * ccc
dyda(3) = a(1)*(cos(2*pigrec*x/a(2)+a(3 )))* exp(-x/a(4))
bbb = a(1)*(sin(2*pigrec*x/a(2)+a(3 )))* exp(-x/a(4))
aaa = x /(a(4)**2.0)
dyda(4) = aaa * bbb

68
CAPITOLO 2. IL LABORATORIO 2.4. CAVEN

dyda(5) = 1.0
return
END
subroutine gtutto (cav,para,inc)
implicit real (a-h,o-z)
dimension para (1:inc )
pigrec = 3.1415927
egran = para(1)
el = para(2)
er = para(3)
ed = para(4)
a1 = (ed * er**2)/(2.0* egran )
a2 = (2 * pigrec / para(6))**2 + ( 1/para(7))**2
diff = abs ( atan ( para(5) /el ))
aldif = diff/2.0
a3 = aldif
elle = sqrt ( (2* ed)**2 + er **2 )
a4 = 1.0/(1.0 - (er/elle)**3 )
cav = a1 * a2 * a3 * a4
return
end
subroutine calco (ecav,cav,para,inc,epara,video)
implicit real (a-h,o-z)
character * 1 video
parameter ( int = 10 )
dimension para (1:inc )
dimension epara (1:inc )
dimension work (1:int )
dimension square (1:int )
dimension inter (1:int )
if (int.lt.inc)stop cambiare int
vero = cav
do 100 j = 1 ,inc
work (j) = para (j)
100 continue
quadro = 0.0
do 200 j = 1 ,inc
do 190 i = 1 , inc
para (i) = work(i)

69
2.4. CAVEN CAPITOLO 2. IL LABORATORIO

190 continue
para (j) = para(j) + epara(j)
call gtutto (cavmod,para,inc)
delta = cavmod - vero
quadro = quadro + delta *delta
square ( j )= delta * delta
200 continue
sq2 = 0.0
do 205 j= 1,inc
sq2 = sq2 + square ( j)
205 continue
do 206 j= 1,inc
inter (j) = nint ( square ( j) * 1000./sq2)
206 continue
if (( video.eq.Y).or.( video.eq.y)) then
print *,Peso normalizzato a 1000 dellerrore delle variabili
print *,sullerrore del valore di G-metodo completo
print *,errore su M ( massa grande) =,inter(1)
print *,errore su L ( distanza indice) =,inter(2)
print *,errore su r ( distanza masse ) =,inter(3)
print *,errore su d ( manubrio/2 ) =,inter(4)
print *,errore su a(1)(ampiezza oscillazioni) =,inter(5)
print *,errore su a(2)(periodo oscillazioni) =,inter(6)
print *,errore su a(4)(smorzamento oscillazioni)=,inter(7)
end if
ecav = sqrt ( quadro)
do 210 i = 1 , inc
para (i) = work(i)
210 continue
return
end

subroutine gescur (cave,caves,para,inc)


implicit real (a-h,o-z)
dimension para (1:inc )
pigrec = 3.1415927
C egran = para(1)
C el = para(2)
C er = para(3)

70
CAPITOLO 2. IL LABORATORIO 2.4. CAVEN

C ed = para(4)
C a(1) = para(5)
C a(2) = para(6)
C a(4) = para(7)
egran = para(1)
el = para(2)
er = para(3)
ed = para(4)
aa1 = pigrec **2
aa2 = er **2
aa3 = ed
aa4 = para(5) * 0.01
dd1 = egran
dd2 = para(6) ** 2
dd3 = el / 100.
ages = aa1 * aa2 * aa3 *aa4 /( dd1 * dd2 * dd3 )
d1 = 1 + 4 * ( ed / er )**2
d2 = sqrt ( 1 + 4 * ( ed / er )**2 )
beta = 1 /( d1 * d2 )
piu = beta * ages
cave = ages + piu
caves = ages
return
end

subroutine calcos (ecave,cave,para,inc,epara,video)


implicit real (a-h,o-z)
character * 1 video
parameter ( int = 10 )
dimension para (1:inc )
dimension epara (1:inc )
dimension work (1:int )
dimension square (1:int )
dimension inter (1:int )
if (int.lt.inc)stop cambiare int
vero = cave
do 100 j = 1 ,inc
work (j) = para (j)

71
2.4. CAVEN CAPITOLO 2. IL LABORATORIO

100 continue
quadro = 0.0
do 200 j = 1 ,inc
do 190 i = 1 , inc
para (i) = work(i)
190 continue
para (j) = para(j) + epara(j)
call gescur (cmod,caves,para,inc)
delta = cmod - vero
quadro = quadro + delta *delta
square (j) = delta * delta
200 continue
sq2 = 0.0
do 205 j= 1,inc
sq2 = sq2 + square ( j)
205 continue
do 206 j= 1,inc
inter (j) = nint ( square ( j) * 1000./sq2)
206 continue
if (( video.eq.Y).or.( video.eq.y)) then
print *,Peso normalizzato a 1000 dellerrore delle variabili
print *,sullerrore del valore di G-escursione finale
print *,errore su M ( massa grande) =,inter(1)
print *,errore su L ( distanza indice) =,inter(2)
print *,errore su r ( distanza masse ) =,inter(3)
print *,errore su d ( manubrio/2 ) =,inter(4)
print *,errore su a(1)(ampiezza oscillazioni) =,inter(5)
print *,errore su a(2)(periodo oscillazioni) =,inter(6)
print *,errore su a(4)(smorzamento oscillazioni)=,inter(7)
end if
ecave = sqrt ( quadro)
do 210 i = 1 , inc
para (i) = work(i)
210 continue
return
end
SUBROUTINE fun2c(X,AFUNC,MA)
DIMENSION AFUNC(MA)
AFUNC(1)= 1.0

72
CAPITOLO 2. IL LABORATORIO 2.4. CAVEN

AFUNC(2)= X**2.0
END

subroutine gpara (cav,para,inc)


implicit real (a-h,o-z)
dimension para (1:inc )
egran = para(1)
el = para(2)
er = para(3)
ed = para(4)
aa = para(5)
cav = ( aa* ed * er**2 )/(2.0 * egran * el )
return
end

subroutine capa2 (ecav,cav,para,inc,epara,video)


C lavoro
implicit real (a-h,o-z)
character * 1 video
parameter ( int = 10 )
dimension para (1:inc )
dimension epara (1:inc )
dimension work (1:int )
dimension square (1:int )
dimension inter (1:int )
if (int.lt.inc)stop cambiare int
vero = cav
do 100 j = 1 ,inc
work (j) = para (j)
100 continue
quadro = 0.0
do 200 j = 1 ,inc
do 190 i = 1 , inc
para (i) = work(i)
190 continue
para (j) = para(j) + epara(j)
call gpara(cavmod,para,inc)
delta = cavmod - vero
quadro = quadro + delta *delta

73
2.5. GAUSS CAPITOLO 2. IL LABORATORIO

square ( j )= delta * delta


200 continue
sq2 = 0.0
do 205 j= 1,inc
sq2 = sq2 + square ( j)
205 continue
do 206 j= 1,inc
inter (j) = nint ( square ( j) * 1000./sq2)
206 continue
if (( video.eq.Y).or.( video.eq.y)) then
print *,Peso normalizzato a 1000 dellerrore delle variabili
print *,sullerrore del valore di G-metodo parabola
print *,errore su M ( massa grande) =,inter(1)
print *,errore su L ( distanza indice) =,inter(2)
print *,errore su r ( distanza masse ) =,inter(3)
print *,errore su d ( manubrio/2 ) =,inter(4)
print *,errore su a ( accelerazione ) =,inter(5)
end if
ecav = sqrt ( quadro)
do 210 i = 1 , inc
para (i) = work(i)
210 continue
return
end

2.5 GAUSS
Questo programma riguarda l esercitazione sul viscosimetro ma puo
essere usato per altri scopi. Si parte con una serie di dati inserita
nel file GAUSS.DAT che vengono lette dal programma e inserite nel
vettore DATI. La subroutine ISTOTUTTO provvede poi a calcolare il
massimo e il minimo e, dato in modo interattivo il numero di classi,
la distribuzione in frequenza. Si ottengono poi i seguenti parametri
statistici caratterizzanti la distribuzione sperimentale:
1. valor medio dell istogramma
1
1 NX
x = (xi )(yi ) (2.25)
N i=1

74
CAPITOLO 2. IL LABORATORIO 2.5. GAUSS

2. deviazione standard dell istogramma


v
1
1 NX
u
u
s2 = t yi (xi x)2 (2.26)
N 1 i=1

3. momento di terzo ordine e asimmetria


PN 1
i=1 yi (xi x)3
s3 = (2.27)
(N 1) s23

4. momento di quarto ordine e curtosi


PN 1
i=1yi (xi x)4
s4 = 3 (2.28)
(N 1) s24

5. 2 :

N 1
(yi fi )2
2 =
X
(2.29)
i=1 fi

Riportiamo il listato del programma GAUSS:

program gauss
C
C definizione delle variabili e dei vettori utilizzati dal programma
C
implicit real (a-h,o-z)
parameter ( max = 1000)
parameter ( pigrec = 3.141592653)
character * 2 risp
character * 1 pausa
dimension xreal (1:max)
dimension iyreal (1:max)
dimension dati (1:max)
open (unit=90,file=gauss.dat, status=old)
C
C input dei dati da tastiera
C
print *,Programma per il calcolo statistico

75
2.5. GAUSS CAPITOLO 2. IL LABORATORIO

print *,Analisi di dati con distribuzione Gaussiana


print *,Avete messo i dati nel file gaussiana.dat ?
print *, se no uscite !!!!!!!!!!!!!!!
print *,<CR> per continuare !
read 1000,pausa
ndati = 0
199 continue
read (90,*,end = 200)dato
ndati = ndati + 1
dati ( ndati ) = dato
go to 199
200 continue
250 continue
print *,Scrivere il numero di intervalli desiderato
read *,ndiv
print *,va bene questo numero di intervalli ? <CR>/NO
read 1000,risp
if ((risp.eq.NO).or.(risp.eq.no)) then
go to 200
end if
jvec = 0
999 format (A1)
1000 format (A2)
ndiv1 = ndiv + 1
call isto (dati,ndati,max,ndiv1,xreal,iyreal,delta)
call mom (ndiv1,xreal,iyreal,xmedio,s2,s3,s4,nsumy)
C calcolo del chi-quadro
chi2 = 0.
do 100 j= 1,ndiv
xmezzo = (xreal(j) + xreal (j+1))/ 2.0
yteo = 1./(sqrt (2.0 * pigrec) *s2 )
yteo = yteo * exp (-((( xmezzo - xmedio)/s2 )**2)/2.0 )
yteo = yteo * nsumy * delta
chi2 = chi2 + (( iyreal (j) - yteo)**2) / yteo
100 continue
print *,xmedio =,xmedio
print *,s2 =,s2
print *,s3 =,s3
print *,s4 =,s4

76
CAPITOLO 2. IL LABORATORIO 2.5. GAUSS

print *,nsumy =,nsumy


print *,chi2 =,chi2
print *,Vuoi cambiare il numero di intervalli ? Y/N
read 999,pausa
if ((pausa.eq.Y).or.(pausa.eq.y)) then
go to 250
end if
stop
end
subroutine isto (dati,ndati,max,ndiv1,xreal,iyreal,delta)
implicit real (a-h,o-z)
dimension dati (1:max)
dimension xreal (1:max)
dimension iyreal(1:max)
C azzeramento variabili
do 101 j= 1 ,ndiv1
xreal (j) = 0
iyreal (j) = 0
101 continue
call maxmin (dati,ndati,xmax,xmin )
xmax = xmax + xmax/1000
ndiv = ndiv1 - 1
delta = ( xmax - xmin )/ndiv
do 102 j = 1 , ndiv1
xreal (j) = xmin + ( j-1 ) * delta
102 continue
do 103 j = 1 , ndati
do 104 i= 1 , ndiv
xl = xreal ( i )
xu = xreal ( i + 1 )
if ( (dati (j).ge.xl).and.(dati(j).lt.xu) ) then
iyreal ( i) = iyreal(i) +1
end if
104 continue
103 continue
return
end
subroutine mom (k,x,ifreq,xmean,s2,s3,s4,n)
implicit real (a-h,o-z)

77
2.5. GAUSS CAPITOLO 2. IL LABORATORIO

dimension x (1:k)
dimension ifreq (1:k)
dimension y (1:1000)
C azzeramento variabili
xmean = 0.
s2 = 0.
s3 = 0.
s4 = 0.
n = 0
C calcolo della frequenza totale
do 100 i=1,k-1
n = n + ifreq (i)
100 continue
C calcolo dei punti centrali
do 101 j=1,k-1
y(j) = ( x(j+1) + x (j) )/2.0
101 continue
C calcolo del valor medio
do 102 j=1,k-1
xmean = xmean + y (j) * ifreq (j)
102 continue
xmean = xmean/ n
C calcolo della deviazione standard
do 103 j=1,k-1
s2 = s2 + ((y(j) - xmean )**2) * ifreq (j)
103 continue
s2 = sqrt (s2/(n-1))
C calcolo della asimmetria
do 104 j =1,k-1
s3 = s3 + ((y(j) - xmean )**3) * ifreq (j)
104 continue
s3 = s3 /((n-1)*( s2**3))
C calcolo della curtosi
do 105 j=1,k-1
s4 = s4 + ((y(j) - xmean )**4) * ifreq (j)
105 continue
s4 = ( s4 /((n-1)*( s2**4))) - 3.
return
end

78
CAPITOLO 2. IL LABORATORIO 2.6. TESTT

2.6 TESTT
Questo programma sostituisce le tabelle relative al test di Student. Si
inseriscono in maniera interattiva il numero di gradi di liberta n e la
probabilita considerata. Mediante la subroutine BETAI appartenente
al libro [REC 92] viene poi calcolato il valore critico, xp , associato con
il taglio inferiore corrispondente alla probabilita della distribuzione di
Student con n gradi di liberta. Riportiamo il listato del programma
TESTT:
program testt
implicit real (a-h,o-z)
logical condiz
character * 1 pausa
parameter ( tmax = 1000 ,ndiv = tmax * 100)
external betai
print *,Programma per il calcolo del valore critico nella
print *,distribuzione della variabile casuale t di Student
print *,con nu gradi di liberta , dato alfa
print *,<CR> per continuare !
read 1000,pausa
999 format (A1)
1000 format (A2)
50 continue
print *,inserire i gradi di liberta
read *, n
100 continue
print *,immettere alfa, livello di confidenza (0.01,0.05,0.1...)
read *, alfa
condiz = .false.
delta = tmax / ndiv
do 200 jj= 1, ndiv
t = jj * delta
prob= 1 - betai(0.5*n,0.5,n/(n+t**2))
q = ( 1 + prob ) / 2
qmeno = ( 1 - prob ) / 2
if (.not.condiz) then

79
2.7. TESTC2 CAPITOLO 2. IL LABORATORIO

if ( qmeno.lt. (alfa) ) then


tuno = ( jj-1) * delta
condiz =. true.
end if
endif
if ( qmeno.lt. (alfa/2.0)) then
tdue = ( jj-1) * delta
go to 950
end if
200 continue
stop aumentare tmax !!!
950 continue
print *,gradi di liberta =,n
print *,livello di significativita =,alfa
print *,t critico ad una banda =,tuno
print *,t critico a due bande =,tdue
print *,Vuoi cambiare le variabili ? Y/N
read 999,pausa
if ((pausa.eq.Y).or.(pausa.eq.y)) then
go to 50
end if
stop
end

2.7 TESTC2
Questo programma sostituisce le tabelle della variabile 2 e usa la sub-
routine GAMMQ estratta dal libro [REC 92]. Riportiamo il listato del
programma TESTC2:

program testc2
implicit real (a-h,o-z)
character pausa
parameter ( c2max = 200 ,ndiv = c2max * 100 )
external gammq
13 continue
print *,Abbiamo due opzioni ....................
print *,fissiamo chi2 e troviamo la probabilita (1)

80
CAPITOLO 2. IL LABORATORIO 2.7. TESTC2

print *,fissiamo alfa e troviamo chi2 (2)


read *,numero
if ( numero.eq.1 ) then
go to 11
elseif( numero.eq.2 ) then
go to 12
else
go to 13
end if
11 continue
print *,Parte per il calcolo di un integrale
print *,fra chi2 e infinito
print *,della della densita di probabilita CHI-QUADRATO
print *,con nu gradi di liberta
call attesa
50 continue
print *,inserire i gradi di liberta
read *, n
100 continue
print *,immettere il chi2 trovato (0.6,0.9,1.5 ,4...)
read *,chi2
prob = gammq ( 0.5 * n , 0.5 * chi2 )
print *,gradi di liberta =,n
print *,chi2-impostato =,chi2
print *,integrale fra chi2 e infinito =,prob
print *,
print *,Vuoi cambiare le variabili ? Y/N
read 999,pausa
999 format (a1)
if ((pausa.eq.Y).or.(pausa.eq.y)) then
go to 50
else
stop
end if
12 continue
print *,Parte per il calcolo del chi2 corrispondente
print *,ad un livello di significativita alfa
print *,della della densita di probabilita CHI-QUADRATO
print *,con nu gradi di liberta

81
2.7. TESTC2 CAPITOLO 2. IL LABORATORIO

call attesa
51 continue
print *,inserire i gradi di liberta
read *, n
print *,immettere il livello di significativa (0.01,0.05,0.1)
read *,alfa
delta = c2max / ndiv
if ( n .eq.1 ) then
delta = 0.00001
end if
do 995 jj = 1 , ndiv
chi2 = jj * delta
prob = gammq ( 0.5 * n , 0.5 * chi2 )
alfat = 1 - prob
if ( alfat.gt.alfa ) then
c2sin = chi2p
go to 52
end if
chi2p = chi2
995 continue
52 continue
delta = c2max / ndiv
do 996 jj = 1 , ndiv
chi2 = jj * delta
prob = gammq ( 0.5 * n , 0.5 * chi2 )
if ( prob.lt.alfa ) then
chi2d = chi2p
go to 54
end if
chi2p = chi2
996 continue
54 continue
print *,chi2 a destra =,chi2d
print *,chi2 a sinistra =,c2sin
print *,gradi di liberta =,n
print *,alfa =,alfa
print *,Vuoi cambiare le variabili ? Y/N
read 999,pausa
if ((pausa.eq.Y).or.(pausa.eq.y)) then

82
CAPITOLO 2. IL LABORATORIO 2.7. TESTC2

go to 51
else
stop
end if
end

83
2.7. TESTC2 CAPITOLO 2. IL LABORATORIO

84
Capitolo 3

Probabilita e statistica

Adesso cerchiamo di capire come sono scritte le varie subroutine che


abbiamo usato in maniera nascosta perche inserite nel link con le librerie
del libro [REC 92] che sono scritte in FORTRAN-77 standard.

3.1 Gamma
La funzione gamma e definita dall integrale
Z
(z) = tz1 et dt . (3.1)
0

Quando l argomento z e un intero, la funzione gamma diventa il fatto-


riale dell argomento meno uno:

n! = (n + 1) . (3.2)

Esistono vari metodi per calcolare la funzione gamma e sembra che


quello migliore sia quello derivato da Lanczos. Riportiamo adesso la
FUNCTION GAMMLN che dato l argomento xx ritorna ln ( (xx)):

FUNCTION gammln(xx)
REAL gammln,xx
INTEGER j
DOUBLE PRECISION ser,stp,tmp,x,y,cof(6)
SAVE cof,stp
DATA cof,stp/76.18009172947146d0,-86.50532032941677d0,
*24.01409824083091d0,-1.231739572450155d0,.1208650973866179d-2,

85
3.2. FATTORIALE CAPITOLO 3. PROBABILITA E STATISTICA

*-.5395239384953d-5,2.5066282746310005d0/
x=xx
y=x
tmp=x+5.5d0
tmp=(x+0.5d0)*log(tmp)-tmp
ser=1.000000000190015d0
do 11 j=1,6
y=y+1.d0
ser=ser+cof(j)/y
11 continue
gammln=tmp+log(stp*ser/x)
return
END

3.2 Fattoriale
Riportiamo la FUNCTION che calcola il fattoriale di n distinguendo
fra i vari valori e alla fine chiamando la funzione gamma:

FUNCTION factrl(n)
INTEGER n
REAL factrl
CU USES gammln
INTEGER j,ntop
REAL a(33),gammln
SAVE ntop,a
DATA ntop,a(1)/0,1./
if (n.lt.0) then
pause negative factorial in factrl
else if (n.le.ntop) then
factrl=a(n+1)
else if (n.le.32) then
do 11 j=ntop+1,n
a(j+1)=j*a(j)
11 continue
ntop=n
factrl=a(n+1)
else

86
CAPITOLO 3. PROBABILITA E STATISTICA 3.2. FATTORIALE

factrl=exp(gammln(n+1.))
endif
return
END

Un punto interessante e notare che che il fattoriale e giusto per


valori piccoli di n ma e approssimato se passiamo come vedremo adesso
al logaritmo del fattoriale. Per quanto riguarda il coefficiente binomiale
dobbiamo invece dobbiamo passare ai logaritmi per evitare gli overflow.
Ricordiamo che il coefficiente binomiale vale:
!
n n!
= 0kn , (3.3)
k k!(n k)!

e possiamo introdurre la FUNCTION BICO che calcola il suddetto


coefficiente:

FUNCTION bico(n,k)
INTEGER k,n
REAL bico
CU USES factln
REAL factln
bico=nint(exp(factln(n)-factln(k)-factln(n-k)))
return
END

la quale adopera il logaritmo del fattoriale:

FUNCTION factln(n)
INTEGER n
REAL factln
CU USES gammln
REAL a(100),gammln
SAVE a
DATA a/100*-1./
if (n.lt.0) pause negative factorial in factln
if (n.le.99) then
if (a(n+1).lt.0.) a(n+1)=gammln(n+1.)
factln=a(n+1)
else

87
3.3. FUNZIONE BETA CAPITOLO 3. PROBABILITA E STATISTICA

factln=gammln(n+1.)
endif
return
END

3.3 Funzione beta


Passando dagli interi al continuo arriviamo alla funzione beta che cos
definiamo
Z 1
B(z, w) = B(w, z) = tz1 (1 t)w1 dt , (3.4)
0

questa e collegata alla funzione gamma dalla relazione

(z)(w)
B(z, w) = , (3.5)
(z + w)

che e facilmente implementata tramite la FUNCTION beta

FUNCTION beta(z,w)
REAL beta,w,z
CU USES gammln
REAL gammln
beta=exp(gammln(z)+gammln(w)-gammln(z+w))
return
END

3.4 Gamma incompleta


La funzione gamma incompleta e definita come

(a, x) 1 Z x a1 t
P (a, x) t e dt (a > 0) . (3.6)
(a) (a) 0

Essa ha come limiti

P (a, 0) = 0 e P (a, ) = 1 . (3.7)

88
CAPITOLO 3. PROBABILITA E STATISTICA3.4. GAMMA INCOMPLETA

Il complemento di P (a,x) e anche chiamata in maniera confusa funzione


gamma incompleta
(a, x) 1 Z a1 t
Q(a, x) 1 P (a, x) t e dt (a > 0) ,
(a) (a) x
(3.8)
ed ha i seguenti valori limiti

Q(a, 0) = 1 e Q(a, ) = 0 . (3.9)

La notazione P(a,x),(a, x) e (a, x) sono standard; la notazione Q


(a,x) la useremo solo in questo contesto. A questo punto riportiamo le
FUNCTION che ritornano P(a,x) e
Q (a,x ) usando la extra lettera p e q dopo gamm:
FUNCTION gammp(a,x)
REAL a,gammp,x
CU USES gcf,gser
REAL gammcf,gamser,gln
if(x.lt.0..or.a.le.0.)pause bad arguments in gammp
if(x.lt.a+1.)then
call gser(gamser,a,x,gln)
gammp=gamser
else
call gcf(gammcf,a,x,gln)
gammp=1.-gammcf
endif
return
END

FUNCTION gammq(a,x)
REAL a,gammq,x
CU USES gcf,gser
REAL gammcf,gamser,gln
if(x.lt.0..or.a.le.0.)pause bad arguments in gammq
if(x.lt.a+1.)then
call gser(gamser,a,x,gln)
gammq=1.-gamser
else
call gcf(gammcf,a,x,gln)

89
3.4. GAMMA INCOMPLETACAPITOLO 3. PROBABILITA E STATISTICA

gammq=gammcf
endif
return
END

L argomento gln e dato tramite serie e procedura delle frazioni


continue:

SUBROUTINE gser(gamser,a,x,gln)
INTEGER ITMAX
REAL a,gamser,gln,x,EPS
PARAMETER (ITMAX=100,EPS=3.e-7)
CU USES gammln
INTEGER n
REAL ap,del,sum,gammln
gln=gammln(a)
if(x.le.0.)then
if(x.lt.0.)pause x < 0 in gser
gamser=0.
return
endif
ap=a
sum=1./a
del=sum
do 11 n=1,ITMAX
ap=ap+1.
del=del*x/ap
sum=sum+del
if(abs(del).lt.abs(sum)*EPS)goto 1
11 continue
pause a too large, ITMAX too small in gser
1 gamser=sum*exp(-x+a*log(x)-gln)
return
END

SUBROUTINE gcf(gammcf,a,x,gln)
INTEGER ITMAX
REAL a,gammcf,gln,x,EPS,FPMIN
PARAMETER (ITMAX=100,EPS=3.e-7,FPMIN=1.e-30)

90
CAPITOLO 3. PROBABILITA E STATISTICA 3.5. FUNZIONE ERRORI

CU USES gammln
INTEGER i
REAL an,b,c,d,del,h,gammln
gln=gammln(a)
b=x+1.-a
c=1./FPMIN
d=1./b
h=d
do 11 i=1,ITMAX
an=-i*(i-a)
b=b+2.
d=an*d+b
if(abs(d).lt.FPMIN)d=FPMIN
c=b+an/c
if(abs(c).lt.FPMIN)c=FPMIN
d=1./d
del=d*c
h=h*del
if(abs(del-1.).lt.EPS)goto 1
11 continue
pause a too large, ITMAX too small in gcf
1 gammcf=exp(-x+a*log(x)-gln)*h
return
END

3.5 Funzione errori


La funzione degli errori e la funzione degli errori complementari sono
casi speciali della funzione gamma incompleta e sono quindi ottenute
dalle procedure summenzionate. Sono cos definite
2 Z x t2
erf (x) = e dt , (3.10)
0
e
2 Z t2
erf c(x) 1 erf (x) = e dt . (3.11)
x
Esse sono legate alle funzioni gamma incomplete dalle relazioni:
1
erf (x) = P ( , x2 ) (x 0) , (3.12)
2
91
3.6. DISTRIBUZIONI CAPITOLO 3. PROBABILITA E STATISTICA

e
1
erf c(x) = Q( , x2 ) (x 0) . (3.13)
2
Quindi otteniamo facilmente le FUNCTION ERF e ERFC

FUNCTION erf(x)
REAL erf,x
CU USES gammp
REAL gammp
if(x.lt.0.)then
erf=-gammp(.5,x**2)
else
erf=gammp(.5,x**2)
endif
return
END

FUNCTION erfc(x)
REAL erfc,x
CU USES gammp,gammq
REAL gammp,gammq
if(x.lt.0.)then
erfc=1.+gammp(.5,x**2)
else
erfc=gammq(.5,x**2)
endif
return
END

3.6 Distribuzioni
Analizziamo ora alcune delle distribuzioni di probabilita piu note.

3.6.1 Distribuzione del chiquadro


P (2 |) e definita come la probabilita che il il chi-quadro osservato in
un modello corretto sia minore di un certo valore 2 . Il suo comple-
mento Q (2 |) e la probabilita che il chi-quadro osservato ecceda il
valore 2 tramite chance anche per un modello corretto. In ambedue

92
CAPITOLO 3. PROBABILITA E STATISTICA 3.6. DISTRIBUZIONI

i casi e un intero, il numero di gradi di liberta del sistema. Queste


funzioni sono cos collegate alle funzioni gamma incomplete:
 2  2 
P (2 |) = P , = gammp ( , (3.14)
2 2 2 2
 2  2
Q(2 |) = Q , = gammq ( , . (3.15)
2 2 2 2

3.6.2 Distribuzione Beta incompleta


La funzione beta incompleta e definita come
Bx (a, b) 1 Z x a1
Ix (a, b) t (1 t)b1 dt (a, b > 0) . (3.16)
B(a, b) B(a, b) 0
Questa funzione ha come valori limite:
I0 (a, b) = 0 I1 (a, b) = 1 , (3.17)
e vale la relazione di simmetria
Ix (a, b) = 1 I1x (b, a) . (3.18)
La funzione beta incompleta viene implementata attraverso la FUNC-
TION BETAI:
FUNCTION betai(a,b,x)
REAL betai,a,b,x
CU USES betacf,gammln
REAL bt,betacf,gammln
if(x.lt.0..or.x.gt.1.)pause bad argument x in betai
if(x.eq.0..or.x.eq.1.)then
bt=0.
else
bt=exp(gammln(a+b)-gammln(a)-gammln(b)+a*log(x)+b*log(1.-x))
endif
if(x.lt.(a+1.)/(a+b+2.))then
betai=bt*betacf(a,b,x)/a
return
else
betai=1.-bt*betacf(b,a,1.-x)/b
return
endif
END

93
3.6. DISTRIBUZIONI CAPITOLO 3. PROBABILITA E STATISTICA

la quale richiede una routine per valutare la frazione continua:

FUNCTION betacf(a,b,x)
INTEGER MAXIT
REAL betacf,a,b,x,EPS,FPMIN
PARAMETER (MAXIT=100,EPS=3.e-7,FPMIN=1.e-30)
INTEGER m,m2
REAL aa,c,d,del,h,qab,qam,qap
qab=a+b
qap=a+1.
qam=a-1.
c=1.
d=1.-qab*x/qap
if(abs(d).lt.FPMIN)d=FPMIN
d=1./d
h=d
do 11 m=1,MAXIT
m2=2*m
aa=m*(b-m)*x/((qam+m2)*(a+m2))
d=1.+aa*d
if(abs(d).lt.FPMIN)d=FPMIN
c=1.+aa/c
if(abs(c).lt.FPMIN)c=FPMIN
d=1./d
h=h*d*c
aa=-(a+m)*(qab+m)*x/((a+m2)*(qap+m2))
d=1.+aa*d
if(abs(d).lt.FPMIN)d=FPMIN
c=1.+aa/c
if(abs(c).lt.FPMIN)c=FPMIN
d=1./d
del=d*c
h=h*del
if(abs(del-1.).lt.EPS)goto 1
11 continue
pause a or b too big, or MAXIT too small in betacf
1 betacf=h
return
END

94
CAPITOLO 3. PROBABILITA E STATISTICA 3.7. NUMERI RANDOM

3.6.3 Distribuzione di Student


La distribuzione di Student, denotata con A(t|), e utile in parecchi
contesti di probabilita, ed in particolare quando si tratta di decidere se
due campioni hanno la stessa media. A(t|) e la probabilita, per gradi
di liberta, che una certa statistica t (misurando la differenza osservata
fra medie) sia minore del valore osservato nell ipotesi che le medie
siano uguali.Due medie sono significativamente differenti se ad esempio
A(t|) > 0.99. In altre parole, 1- A(t|) e il livello di significativita per
il quale l ipotesi che le medie siano uguali e scartata. La definizione
matematica della funzione e
1+
1 Z t
x 2 
A(t|) = 1/2 1 1+ 2 dx . (3.19)
B( 2 , 2 ) t
I valori limite sono

A(0|) = 0 A(|) = 1 . (3.20)

A(t|) e legata alla funzione beta incompleta Ix (a,b) dalla relazione:


 1
A(t|) = 1 I +t
, , (3.21)
2
2 2
e quindi adottiamo la funzione betai che abbiamo prima definito.

3.7 Numeri random


Un generatore uniforme e un algoritmo capace di generare dei numeri
senza una legge apparente fra 0 ed 1 mentre se vogliamo ottenere nu-
meri estratti ad esempio da una distribuzione gaussiana caratterizzata
da una certa media e distribuzione standard dobbiamo partire da un
generatore uniforme e poi modificarlo opportunamente.

3.7.1 Generatori di sistema


Quasi tutti i linguaggi di programmazione contengono una subrouti-
ne che con l indimenticabile nome RAN produce una serie di numeri
random:
x = ran (iseed) , (3.22)

95
3.7. NUMERI RANDOM CAPITOLO 3. PROBABILITA E STATISTICA

All inizio si fissa come primo passo un iseed molto grande e poi si
procede alle chiamate seguenti senza piu modificare iseed. Cambiando
iseed si cambia la sequenza mentre chiamate successive con lo stesso
iseed producono sequenze uguali.
Bisogna pero fare attenzione a questi generatori di sistema perche
quasi sempre sono dei generatori lineari congruenti che generano delle
sequenze di interi I1 , I2 , I3 , ognuno fra 0 ed m-1 ( un numero grande )
attraverso la relazione ricorsiva
Ij+1 = aIj + c (mod m) , (3.23)
dove m e chiamato modulo, a moltiplicatore e c incremento. Questa ri-
correnza si ripetera eventualmente con un periodo che non e piu grande
di m. Se m, a, c sono scelti in maniera appropriata allora il periodo
sara massimo ovverosia di lunghezza m. In questo caso tutti gli interi
fra 0 ed m-1 saranno scelti. La sequenza parte esattamente da questo
punto. Il numero reale di ritorno compreso fra 0 ed 1 e generalmente
Ij+1 /m , cosicche e generalmente minore di 1 ( eccetto che una volta
in m chiamate ). Il metodo lineare congruente ha il vantaggio di essere
molto veloce richiedendo solamente poche righe per chiamata e quindi
e di uso universale. Ha lo svantaggio di non essere libero da correla-
zioni sequenziali nelle chiamate successive. Se k numeri random sono
chiamati a plottare dei punti in uno spazio k-dimensionale ( con ogni
coordinata compresa fra 0 ed 1 ), allora i punti non tendono a coprire
uniformemente lo spazio ma piuttosto a distribuirsi su (k-1) piani. Ci
saranno almeno circa m1/k piani e se le costanti m, a e c non sono scelte
esattamente saranno meno di quelli. Il numero m e usualmente vicino al
piu largo intero rappresentabile 232 . Cosicche ad esempio il numero
di piani sui quali triple di punti giacciono in uno spazio tridimensionale
e usualmente non piu grande della radice cubica di 232 , circa 1600.

3.7.2 Generatore Random - portatile


Tutto sommato possiamo adoperare il semplice algoritmo moltiplicativo
Ij+1 = aIj (mod m) , (3.24)
se il moltiplicatore a e il modulo m sono scelti con attenzione. I signori
Park e Miller propongono
a = 75 = 16807 m = 231 1 . (3.25)

96
CAPITOLO 3. PROBABILITA E STATISTICA 3.7. NUMERI RANDOM

Non e possibile implementare direttamente questo algoritmo poiche


il prodotto di a per m eccede il massimo intero possibile e quindi
dobbiamo passare attraverso una fattorizzazione approssimata di m:

m = aq + r , q = [m/a] , r = m mod a , (3.26)

con le parentesi quadrate indicante la parte intera. Se r e piccolo ed in


particolare r < q, e 0 < z < m-1 puo essere dimostrato che sia a ( z
mod q ) e r [ z/ q] stanno nel range 0,..., m-1 e che

a(z mod q) r[z/q] se e 0;



az mod m = (3.27)
a(z mod q) r[z/q] + m altrimenti.
L applicazione di questo algoritmo alle costanti summenzionate usa
i valori q =127773 e r=2836. Questo algoritmo viene implementato
attraverso la FUNCTION RAN0
FUNCTION ran0(idum)
INTEGER idum,IA,IM,IQ,IR,MASK
REAL ran0,AM
PARAMETER (IA=16807,IM=2147483647,AM=1./IM,IQ=127773,IR=2836,
*MASK=123459876)
INTEGER k
idum=ieor(idum,MASK)
k=idum/IQ
idum=IA*(idum-k*IQ)-IR*k
if (idum.lt.0) idum=idum+IM
ran0=AM*idum
idum=ieor(idum,MASK)
return
END
Il periodo di ran0 e 231 -1 2.0109 . Una peculiarita e che il valore 0
non e mai raggiunto al primo tentativo.

3.7.3 Generatore di interi


Il problema consiste nel generare una distribuzione di numeri interi con
un processo random fra un numero IMIN e IMAX, frontiere comprese.
Il problema e di facile soluzione e consiste nel moltiplicare il numero
reale random compreso fra 0 ed 1 per = IMAX - IMIN +1, dove

97
3.7. NUMERI RANDOM CAPITOLO 3. PROBABILITA E STATISTICA

l addizione di uno significa che vogliamo anche gli interi sulla frontiera.
L implementazione avviene tramite la FUNCTION G05DYFZAN che
prende il nome dal tentativo di simulare una routine delle NAG.

function g05dyfzan (ilower,iupper,idum)


integer ilower ,iupper,iscelto,idum,g05dyfzan
external ran1
real ran1
delta = iupper - ilower + 1.0
iscelto = int ( ran0 (idum) * delta )
g05dyfzan = ilower + iscelto
if (g05dyfzan .lt. ilower ) stop errore g05dyfzan piccolo
if (g05dyfzan .gt. iupper ) stop errore g05dyfzan grande
return
end

3.7.4 Distribuzione esponenziale


Nella sezione precedente, abbiamo imparato a generare dei numeri ran-
dom con una distribuzione di probabilita uniforme, cosicche la proba-
bilita di generare un numero compreso fra x e x + dx, denotata con
p(x)dx, e data da

dx, e 0 < x<1;



p(x)dx = (3.28)
0, altrimenti.

La distribuzione e ovviamente normalizzata che significa:


Z
p(x)dx = 1 . (3.29)

Supponiamo adesso di generare una variabile uniforme x. La distribu-


zione di probabilita di y, denotata p(y)dy, e determinata dalla legge
fondamentale per le trasformazioni di probabilita, che e semplicemente

|p(y)dy| = |p(x)dx| , (3.30)

oppure
dx
p(y) = p(x)| | . (3.31)
dy

98
CAPITOLO 3. PROBABILITA E STATISTICA 3.7. NUMERI RANDOM

Assumiamo ora che y (x) - ln (x), e che p( x) e dato per una


distribuzione uniforme. Avremo allora
dx
p(y)dy = | |dy = ey dy , (3.32)
dy
che e distribuita esponenzialmente. Questa distribuzione occorre fre-
quentemente nei problemi reali, ad esempio come tempo di attesa fra
eventi nei fenomeni governati dalla distribuzione di Poisson. Potete an-
che notare che la quantita y ha la distribuzione di probabilita ey . La
implementazione pratica avviene attraverso la FUNCTION EXPDEV.

FUNCTION expdev(idum)
INTEGER idum
REAL expdev
CU USES ran1
REAL dum,ran1
1 dum=ran1(idum)
if(dum.eq.0.)goto 1
expdev=-log(dum)
return
END

3.7.5 Distribuzione Gaussiana


I metodi di trasformazione possono essere generalizzati a piu di una
dimensione. Se x1 , x2 , x3 ,.... sono delle variabili random con una pro-
babilita di distribuzione congiunta p ( x1 , x2 , x3 ,..... )dx1 , dx2 ,dx3 ...dxn
e y1 ,y2 ,.....yn sono funzioni delle x allora la probabilita congiunta delle
y vale:

(x1 , x2 , ....xn )
p(y1 , y2 , ....yn )dy1 dy2 ...dyn = p(x1 , x2 , ...xn )| |dy1 , dy2 , .....dyn ,
(y1 , y2 , ....yn )
(3.33)
dove |(......)/(....)| e il determinante Jacobiano delle x rispetto alle
y. Un esempio importante della formula suddetta e il metodo di Box-
Muller per generare una distribuzione Gaussiana:
1 y2
p(y)dy = e 2 dy . (3.34)
2

99
3.7. NUMERI RANDOM CAPITOLO 3. PROBABILITA E STATISTICA

Consideriamo adesso la trasformazione fra due distribuzioni uniformi


su (0,1),x1 ,x2 e le due quantita y1 ,y2 :
q
y1 = 2ln x1 cos(2x2 ) , (3.35)
q
y2 = 2ln x1 sin(2x2 ) . (3.36)
Oppure possiamo scrivere:
1 2
x1 = exp[ (y + y22 )] , (3.37)
2 1
1 y2
x2 = exp arctan . (3.38)
2 y1
Adesso il Jacobiano puo essere facilmente calcolato come:
(x1 , x2 ) h 1 2
i h 1 2
i
= ey1 /2 ey2 /2 . (3.39)
(y1 , y2 ) 2 2
Abbiamo il prodotto delle funzioni y1 e y2 e quindi y e distribuita secon-
do una distribuzione normale. Un ulteriore trucco consiste nel prendere
v1 e v2 come ordinata ed ascissa di un punto random dentro il cerchio
unitario intorno all origine. La somma dei loro quadrati R2 v12 +
v22 e un generatore uniforme che puo essere usato per x1 mentre l an-
golo che (v1 , v2 ) definisce rispetto all asse v1 puo servire come angolo
random 2x 2 . Il vantaggio
e che seno e coseno possono essere scritti
2 2
come v1 / R e v2 / R e quindi vengono eliminate le chiamate trigo-
nometriche. L implementazione pratica di questo algoritmo avviene
attraverso la FUNCTION GASDEV.
FUNCTION gasdev(idum)
INTEGER idum
REAL gasdev
CU USES ran1
INTEGER iset
REAL fac,gset,rsq,v1,v2,ran1
SAVE iset,gset
DATA iset/0/
if (iset.eq.0) then
1 v1=2.*ran1(idum)-1.
v2=2.*ran1(idum)-1.

100
CAPITOLO 3. PROBABILITA E STATISTICA 3.8. MOMENTI

rsq=v1**2+v2**2
if(rsq.ge.1..or.rsq.eq.0.)goto 1
fac=sqrt(-2.*log(rsq)/rsq)
gset=v1*fac
gasdev=v2*fac
iset=1
else
gasdev=gset
iset=0
endif
return
END

3.8 Momenti
Se gli elementi di un campione hanno la tendenza a raggrupparsi attorno
ad un valore particolare puo essere utile rappresentare l insieme da
pochi numeri che sono i momenti; il piu importante e il valor medio,
N
1 X
x= xj , (3.40)
N j=1

che stima il valore centrale. Un altro importante valore e la varianza


empirica
N
1 X
s2 = (xj x)2 , (3.41)
N 1 j=1
collegata ovviamente alla deviazione standard empirica

s = s2 . (3.42)

In alcuni casi, tipo distribuzione di Lorentz, la deviazione standard non


esiste perche tende ad infinito; bisogna allora ricorrere ad uno stimatore
piu robusto che e la deviazione assoluta
N
1 X
ADEV (x1 .......xN ) = |xj x| . (3.43)
N j=1

Questa definizione e stata poco adoperata dagli statistici per il fatto


che essendo un valore assoluto i teoremi sono difficilmente provabili.

101
3.8. MOMENTI CAPITOLO 3. PROBABILITA E STATISTICA

Abbiamo poi i momenti di ordine superiore che sono in realta poco


usati; sono in genere numeri adimensionali mentre ricordiamo che il va-
lor medio e deviazione standard empirica sono dimensionali. Abbiamo
quindi che la asimmetria e cos definita
N h
1 X x j x i3
skew(x1 ....xN ) = , (3.44)
N j=1 s

dove s e la deviazione standard empirica. Un valore positivo della


asimmetria significa che abbiamo una coda che si estende verso i va-
lori positivi e negativo viceversa. Un altro parametro importante e la
curtosi
N h
n1 X x j x i4 o
Kurt(x1 ....xN ) = 3 . (3.45)
N j=1 s
Ricordiamo che questo parametro nel caso di una distribuzione Gaus-
siana vale 0. Una maniera per calcolare la varianza che minimizza gli
errori di arrotondamento e l algoritmo a due passi: prima il calcolo di
x e poi quello di s2
N N
1 nX 1 hX i2 o
s2 (x1 ....xN ) = (xj x)2 (xj x) . (3.46)
N 1 j=1 N j=1

La seconda somma e zero nel caso in cui x e esatto altrimenti corregge gli
errori di arrotondamento del primo termine. I vari momenti del campio-
ne che abbiamo teste definito sono implementati nella SUBROUTINE
MOMENT

SUBROUTINE moment(data,n,ave,adev,sdev,var,skew,curt)
INTEGER n
REAL adev,ave,curt,sdev,skew,var,data(n)
INTEGER j
REAL p,s,ep
if(n.le.1)pause n must be at least 2 in moment
s=0.
do 11 j=1,n
s=s+data(j)
11 continue
ave=s/n
adev=0.

102
CAPITOLO 3. PROBABILITA E STATISTICA 3.9. TEST DI STUDENT

var=0.
skew=0.
curt=0.
ep=0.
do 12 j=1,n
s=data(j)-ave
ep=ep+s
adev=adev+abs(s)
p=s*s
var=var+p
p=p*s
skew=skew+p
p=p*s
curt=curt+p
12 continue
adev=adev/n
var=(var-ep**2/n)/(n-1)
sdev=sqrt(var)
if(var.ne.0.)then
skew=skew/(n*sdev**3)
curt=curt/(n*var**2)-3.
else
pause no skew or kurtosis when zero variance in moment
endif
return
END

3.9 Test di Student


Sovente ci troviamo di fronte due set di dati e vogliamo capire se ap-
partengono o no alla stessa popolazione. Quando si pensa che due di-
stribuzioni abbiano la stessa varianza empirica ma possibilmente medie
diverse la variabile t di Student e calcolata in questa maniera
sP
xA )2 + iB (xi xB )2  1
P
iA (xi 1 
sD = + , (3.47)
NA + NB 2 NA NB
dove la sommatoria e estesa sui punti appartenenti ad un campione od
a un altro e NA e NB sono il numero dei punti nel primo e secondo

103
3.9. TEST DI STUDENT CAPITOLO 3. PROBABILITA E STATISTICA

campione rispettivamente. Come secondo passaggio valutiamo t come:


xA xB
t= . (3.48)
sD
Terzo valutiamo la significativita di questo valore della t di Student con
NA + NB - 2 gradi di liberta attraverso le due formule prima introdotte
e la SUBROUTINE BETAI (funzione beta incompleta ). La significa-
tivita e un numero compreso fra 0 ed 1 e rappresenta la probabilita che
|t| sia cos grande per caso, nell ipotesi che i campioni abbiano la stessa
media. Quindi un valore piccolo della significativita ( 0.05 oppure 0.01
) significa che la differenza osservata e molto significativa. Abbiamo
quindi la SUBROUTINE TTEST dove data1 (1:n1 ) e data2 (1:n2 )
sono i due vettori contenenti i dati dei due campioni.
SUBROUTINE ttest(data1,n1,data2,n2,t,prob)
INTEGER n1,n2
REAL prob,t,data1(n1),data2(n2)
CU USES avevar,betai
REAL ave1,ave2,df,var,var1,var2,betai
call avevar(data1,n1,ave1,var1)
call avevar(data2,n2,ave2,var2)
df=n1+n2-2
var=((n1-1)*var1+(n2-1)*var2)/df
t=(ave1-ave2)/sqrt(var*(1./n1+1./n2))
prob=betai(0.5*df,0.5,df/(df+t**2))
return
END
che fa uso della SUBROUTINE AVEVAR
SUBROUTINE avevar(data,n,ave,var)
INTEGER n
REAL ave,var,data(n)
INTEGER j
REAL s,ep
ave=0.0
do 11 j=1,n
ave=ave+data(j)
11 continue
ave=ave/n

104
CAPITOLO 3. PROBABILITA E STATISTICA 3.10. FIT CON RETTA

var=0.0
ep=0.0
do 12 j=1,n
s=data(j)-ave
ep=ep+s
var=var+s*s
12 continue
var=(var-ep**2/n)/(n-1)
return
END

3.10 Fit con retta


Supponiamo di avere una serie N di punti (xi ,yi ) e di volerli fittare con
una retta
y = a + bx . (3.49)
La misura di quanto il modello aderisce alla realta e rappresentata dalla
funzione chi-quadro:
N 
yi a bxi 2
2 (a, b) =
X
. (3.50)
j=1 si

Annullando le derivate prime rispetto ad a e b troviamo la condizio-


ne di minimo del chi-quadro. Puo essere utile introdurre le sequenti
sommatorie:
N N N
X 1 X xi X yi
S Sx Sy (3.51)
i=1 s2i i=1 s2i i=1 s2i
N N
X x2i X xi yi
Sxx Sxy . (3.52)
i=1 s2i i=1 s2i
Ricordando che il determinante dei coefficienti vale:

SSxx (Sx )2 , (3.53)

troviamo facilmente dalla teoria dei minimi quadrati che


Sy Sxx Sx Sxy S Sxy Sx Sy
a= b= . (3.54)

105
3.10. FIT CON RETTA CAPITOLO 3. PROBABILITA E STATISTICA

Ci restano ancora gli errori su a e b e dalla teoria della propagazione


degli errori otteniamo:

s2a = Sxx / s2b = S/ . (3.55)

Una stima della bonta del fit e data dalla probabilita Q che il valore
del chi-quadro trovato sia casuale e

N 2 2
Q = gammq ( , ) . (3.56)
2 2
Ricordiamo che GAMMQ e la nostra FUNCTION per la funzione gam-
ma incompleta Q(a,x). Se q e piu grande di 0.1 il fit e accettabile. Se
e piu grande di 0.001 il fit puo essere accettabile se gli errori non sono
distribuiti in maniera normale e sono stati sottostimati. Se q e minore
di 0.001 allora il modello o la procedura di stima degli errori sono sba-
gliati. L implementazione pratica di queste formule avviene attraverso
la SUBROUTINE FIT dove in input abbiamo:
ndata = numero di punti del campione
x (1:ndata)= vettore delle x
y (1:ndata)= vettore delle y
sig (1:ndata)= vettore degli errori sulle y
mwt = 0 allora applichiamo le formule senza errori
In output abbiamo invece
a,b = parametri della retta
siga,sigb= errori sui parametri a e b
chi2= chi-quadro finale
q= parametro di bonta del fit. Se mwt = 0 allora q=1

SUBROUTINE fit(x,y,ndata,sig,mwt,a,b,siga,sigb,chi2,q)
INTEGER mwt,ndata
REAL a,b,chi2,q,siga,sigb,sig(ndata),x(ndata),y(ndata)
CU USES gammq
INTEGER i
REAL sigdat,ss,st2,sx,sxoss,sy,t,wt,gammq
sx=0.
sy=0.
st2=0.
b=0.
if(mwt.ne.0) then

106
CAPITOLO 3. PROBABILITA E STATISTICA 3.10. FIT CON RETTA

ss=0.
do 11 i=1,ndata
wt=1./(sig(i)**2)
ss=ss+wt
sx=sx+x(i)*wt
sy=sy+y(i)*wt
11 continue
else
do 12 i=1,ndata
sx=sx+x(i)
sy=sy+y(i)
12 continue
ss=float(ndata)
endif
sxoss=sx/ss
if(mwt.ne.0) then
do 13 i=1,ndata
t=(x(i)-sxoss)/sig(i)
st2=st2+t*t
b=b+t*y(i)/sig(i)
13 continue
else
do 14 i=1,ndata
t=x(i)-sxoss
st2=st2+t*t
b=b+t*y(i)
14 continue
endif
b=b/st2
a=(sy-sx*b)/ss
siga=sqrt((1.+sx*sx/(ss*st2))/ss)
sigb=sqrt(1./st2)
chi2=0.
if(mwt.eq.0) then
do 15 i=1,ndata
chi2=chi2+(y(i)-a-b*x(i))**2
15 continue
q=1.
sigdat=sqrt(chi2/(ndata-2))

107
3.10. FIT CON RETTA CAPITOLO 3. PROBABILITA E STATISTICA

siga=siga*sigdat
sigb=sigb*sigdat
else
do 16 i=1,ndata
chi2=chi2+((y(i)-a-b*x(i))/sig(i))**2
16 continue
q=gammq(0.5*(ndata-2),0.5*chi2)
endif
return
END

108
Capitolo 4

I frattali

In questi ultimi anni grazie all avvento dei calcolatori un capitolo che
sembrava dimenticato della matematica ha avuto una evoluzione im-
pressionante ed un numero molto alto di libri sui frattali ed affini e
stato scritto. Diciamo grosso modo che possiamo dividere in parti il
problema:

1. Enunciazione del processo; spesso un algoritmo iterativo.

2. Sviluppo di uno pseudo-codice che indica le operazioni da svolgere


indipendentemente dal linguaggio adoperato.

3. Traduzione pratica dello pseudo-codice in linguaggio di program-


mazione

4. Uso di uno o piu pacchetti grafici che permettono l uscita finale


su terminale grafico, laser, etc...

Passiamo ora in rassegna alcuni di questi algoritmi seguendo una


specie di ordine cronologico.

4.1 Henon mapping


All inizio degli anni 60 Michel Henon all Osservatorio di Nizza studian-
do le orbite delle stelle in una galassia si rese conto che lievi modifiche
nei parametri iniziali portavano ad orbite irregolari. Prese quindi piede
il concetto di comportamento caotico nelle orbite stellari o planetarie.

109
4.1. HENON MAPPING CAPITOLO 4. I FRATTALI

Le curve di Henon non sono le classiche ellissi Newtoniane che gli astro-
nomi usano da secoli. Nell universo vero l influenza di altri pianeti o
di altre stelle portano a comportamenti poco prevedibili. Il modello di
Henon che si sviluppa secondo il seguente mapping:

xn+1 = yn ax2n (4.1)

yn+1 = bxn , (4.2)


con a = 1.4 e b = 0.3 , (4.3)
dice che le orbite planetarie possono essere non periodiche ed estre-
mamente sensitive anche alla piu piccola influenza gravitazionale. Per
maggiori dettagli sull attrattore di Henon consultare il libro [Ol 92] . A
differenza dei modelli lineari che sembrano capaci di predirre il cammino
esatto dei corpi celesti per l eternita, gli attrattori strani offrono la pos-
sibilita di orbite stabili per molto tempo con un susseguente improvviso
cambio di traiettoria vedi figura 4.1 . Riportiamo la SUBROUTINE
HENON10 che implementa l attrattore di Henon.
SUBROUTINE HENON10 (xx,yy,max,kounter,n)
implicit REAL * 4 (A-H,O-Z)
dimension xx (1:max )
dimension yy (1:max )
common /quadro / xmin,ymin,delta
xmax=xmin + delta
ymax=ymin + delta
QA=1.4E+00
Qb=0.3E+00
J=0
k=0
18 continue
QZ=1.0-QA*(QX**2.0)+QY
QY=QB*QX
QX=QZ
k=k+1
IF ((QX.GT.xmin.AND.QX.LT.xmax).and.
& (QY.GT.ymin.AND.QY.LT.ymax))then
J=J+1
xx ( J ) = qx
yy ( J ) = qy

110
CAPITOLO 4. I FRATTALI 4.1. HENON MAPPING

Figura 4.1: Tipico plot di Henon

111
4.2. FEIGENBAUM MAPPING CAPITOLO 4. I FRATTALI

c fase di plot
end if
20 IF (K.LT.N) GO TO 18
kounter = j
return
END

4.2 Feigenbaum mapping


Questo mapping e collegato alla crescita della popolazione che assumia-
mo essere x0 all inizio. La relazione ricorsiva gia adottata da Verhulst
e:
xn+1 = 4xn (1 xn ) , (4.4)
dove e un parametro di controllo che varia tra 0 ed 1. Questo map-
ping al variare di incomincia con una soluzione, che poi diventano
due, che poi diventano quattro, etc... Questo comportamento prende il
nome di teoria delle biforcazioni, vedi figura 4.2. Il famoso matematico
Feigenbaum riesce poi anche a calcolare un numero che rappresenta la
transizione al caos. Per maggiori dettagli sul mapping e sul numero di
Feigenbaum consultare il libro [Ol 92] oppure il libro [Ba 88].
L implementazione pratica di questo algoritmo avviene attraverso
il programma FEIGEN.
program feigen
c questo programma produce dei files di dati per calcolare lo splitting
c di Feigenbaum........................................................
implicit REAL (A-H,R-Z)
implicit real*8 (Q)
character * 1 mode,risposta
parameter ( nn = 200 )
parameter ( max= 1000 )
real* 8 fe ( 1 :max )
real* 4 fi ( 1 :max )
real* 4 fy ( 1:nn,1 : max )
integer *2 ify ( 1:nn )
real* 4 fx ( 1:nn )
mode =M
call init9 ( mode )

112
CAPITOLO 4. I FRATTALI 4.2. FEIGENBAUM MAPPING

Figura 4.2: Biforcazioni di Feigenbaum

113
4.2. FEIGENBAUM MAPPING CAPITOLO 4. I FRATTALI

go to 402
400 continue
type *,Vuoi continuare Y/N ?
accept 1000,risposta
if ((risposta.eq.N).or.(risposta.eq.n)) then
go to 401
end if
1000 format (A1 )
402 continue
c qx0old ==> condizione iniziale ,ql0 ==> lambda iniziale
c qld ==> delta lamda ,npunti===>numero attrattori
c nn=divisioni in lamda
type *,inserire limite inferiore + limite superiore
accept *,ql0,qxmax
qld = qxmax - ql0
qx0old=0.5
npunti=600
delta = 1.0 / max
qxmax=ql0+qld
qymin=0.0
qymax=1.0
do 111 ii=1,nn
qx0=qx0old
ql= ql0+ii*qld/nn
k=0
j=0
n=3000
maxfe=N-npunti
18 continue
QX=4*QL*QX0*(1.0-QX0)
qx0=qx
k=k+1
if (k.gt.maxfe) then
j=j+1
fe(j)=qx
end if
20 IF (K.LT.N) GO TO 18
k=0
do 67 j=1,npunti

114
CAPITOLO 4. I FRATTALI 4.3. MANDELBROT-SET

if (fe(j).lt.1.0D-10) then
fe(j)=1.0Q-10
end if
67 continue
call m01apf(fe,1,npunti,k)
fi(1)=fe(1)
mm=1
do 4 k=2,npunti
diff = abs (fe (k) - fi ( mm) )
if (diff .gt . delta) then
mm=mm+1
fi(mm)=sngl ( fe(k) )
endif
4 continue
do 3 j=1,mm
fy ( ii,j ) = fi ( j )
3 continue

ify( ii ) = mm
fx ( ii ) = sngl ( ql )

111 continue
xmin = sngl ( ql0 )
xmax = sngl ( ql0 + qld )
ymin = -0.1
ymax = 1.1
call feigengraf ( fy, fx ,nn ,max,xmin,xmax,ymin,ymax,ify)
go to 400
401 continue
call donepl
stop
END

4.3 Mandelbrot-set
Sia zn = xn + i yn un numero complesso definito dalla relazione ricorsiva

zn+1 = zn2 + c , (4.5)

115
4.4. IMPLEMENTAZIONE DEI SET CAPITOLO 4. I FRATTALI

dove c =a + i b e un altro numero complesso. Se incominciamo


il processo da z0 = 0 e e ripetiamo piu volte la relazione ricorsiva
notiamo che esistono due possibilita. La prima e che il valore assoluto
di zn+1 esploda la crescere di n, la seconda e che rimanga finito a di-
spetto di quante volte iteriamo la relazione. Il risultato finale dipende
ovviamente dal valore di c usato. E quindi possibile dividere il set di
tutti i numeri complessi {c} in due gruppi in accordo al loro andamento
dopo un numero alto di iterazioni. L insieme di Mandelbrot e il gruppo
che contiene tutti i c tali che
lim | zn | = f inito . (4.6)
x

4.4 Implementazione dei set


In genere il set di Mandelbrot e derivati vengono rappresentati tramite
il colore perche in tale maniera si originano delle immagini affascinanti
e ogni volta simili ma diverse nei particolari. Per maggiori dettagli
sui vari set tipo Mandelbrot e Julia rimandiamo il lettore interessato
al libro di [PS88] . Per semplicita tratteremo solo la situazione sul
monitor di un computer. Supponiamo che il numero totale di pixels
disponibile sia ( Nx Ny ); dove Nx , ad esempio 640, sono i punti sulla
linea orizzontale e Ny , ad esempio 480,sono i punti sulla linea verticale
di un tipico schermo di P.C. Possiamo invece anche lavorare su di un
quadrato e allora il numero di pixels (quadratini) sara ( N N ) dove
N e il numero considerato fissabile a piacimento; in questa maniera si
eliminano eventuali errori di deformazione dell area. Identifichiamo
adesso lo schermo con il piano complesso e ogni pixel o quadratino e un
punto del piano. Come al solito useremo la linea orizzontale per la parte
reale e la direzione verticale per la parte immaginaria. Per inserire un
numero complesso c =a + ib sullo schermo dobbiamo selezionare un
origine in basso a sinistra, un considerato ed il numero di pixels. Per
fini pratici dobbiamo scegliere un valore nmax come il numero massimo
di iterazioni che vogliamo eseguire; questo sara l infinito del nostro
processo iterativo. Per generare il plot ogni numero complesso c e
soggetto ad un processo ricorsivo partendo da z0 = 0. Alla fine di ogni
iterazione il valore assoluto di zn e calcolato. Se | zn | > 2, il numero
complesso c non fa parte del set di Mandelbrot, il processo iterativo
termina e assegniamo un colore al pixel considerato secondo lo schema
seguente: sia Nesc il numero di iterazioni considerato ed Nc il numero

116
CAPITOLO 4. I FRATTALI 4.4. IMPLEMENTAZIONE DEI SET

Figura 4.3: Tipico set di Mandelbrot

di colori a disposizione, dove probabilmente Nc < Nmax ; assoceremo al


pixel il colore Ic secondo la seguente relazione

Ic = Nesc mod Nc , (4.7)

dove Ic e un numero nel range [0, Nc ] ed ogni intero 0,1,2,.... corrisponde


ad un particolare colore tipo nero, rosso,viola .... Se il valore di zn e
ancora minore di due il processo si ripete e se dopo Nmax iterazioni
| zn | e ancora minore di due abbiamo un elemento appartenente al set
di Mandelbrot. Questo ultimo pixel puo essere colorato in nero: una
tipica implementazione di questo set e riportata in figura 4.3 .
Riportiamo la subroutine UNO che implementa praticamente tra-
mite tre do innestati il numero Nesc ( nel nostro caso NDIM ) per ogni
pixel del piano.

subroutine uno ( matrix,traspo,itraspo)


implicit real* 4 (a-h,o-z)

117
4.4. IMPLEMENTAZIONE DEI SET CAPITOLO 4. I FRATTALI

integer * 2 ndim,i,j,iterations
integer * 4 im
complex * 8 z,imm,complex
parameter ( pixels = 600 )
parameter ( nvector = pixels * pixels)
dimension matrix (1:nvector)
dimension traspo (1:10)
dimension itraspo (1:10)
parameter(imm=(0,1))
c coordinate di partenza e valore del lato
xmin = traspo (1)
ymin = traspo (2)
delta = traspo (3)
npix = itraspo(1)
iterations = itraspo (2)
npix1 = npix-1
xmax = xmin + delta
ymax = ymin + delta
c griglia di lavoro + numero di pixels
im = 0
do i= 0,npix1
cy=ymin + i*delta/npix
do j=0,npix1
cx=xmin+j*delta/npix
complex = cx + imm*cy
c dimensione numero complesso
z=0
ndim = 0
do while (cabs(z) .le. 2.0 .AND. ndim .LT. iterations)
z=z*z+complex
ndim=ndim+1
end do
im = im +1
matrix (im) = ndim
end do
end do
return
end

118
CAPITOLO 4. I FRATTALI 4.5. SET DI JULIA E DERIVATI

Il colore viene invece calcolato dalla subroutine DUETUTTO.

subroutine duetutto( matrix,matrix8,traspo,itraspo)


implicit real * 4 (a-h,o-z)
parameter ( npixels=800 )
parameter ( nvector = npixels*npixels)
dimension matrix (1:nvector )
dimension matrix8 (1:nvector )
dimension traspo (1:10)
dimension itraspo (1:10)
a = traspo (1)
npix = itraspo(1)
ncol = itraspo(3)
npix2 = npix *npix
do j = 1 , npix2
ndim = matrix ( j)
ndim = ndim -1
if (ndim.lt.64) then
matrix8 (j) = ndim
elseif (ndim.ge.64 ) then
icolor = mod ( ndim,64 )
matrix8 (j) = icolor
end if
end do
return
end

4.5 Set di Julia e derivati


Gli insiemi di Julia si ottengono dalla stessa relazione ricorsiva del set di
Mandelbrot e si tratta di selezionare dei punti alla frontiera del mede-
simo; questi punti dell altro set danno origine a successioni periodiche
dalle forme strane e bizzarre. I pixels sullo schermo del computer rap-
presentano ora i punti nel piano complesso per tutti i possibili valori
di z0 ed ogni insieme e caratterizzato da un valore di c. Riportia-
mo nella figura 4.4 il set di Julia corrispondente a c = -0.74543 + i
0.11301. Un altra relazione ricorsiva cugina di quella di Mandelbrot,

119
4.6. LE TRASFORMAZIONI AFFINI CAPITOLO 4. I FRATTALI

Figura 4.4: Tipico plot di Julia

che possiamo chiamare M2 , e

zn+1 = zn3 + c , (4.8)

che possiamo chiamare M3 . Essa origina strutture leggermente diverse


dal suo parente di grado minore e riportiamo nella figura 4.5 un tipico
plot. Possiamo poi passare in maniera continua da M2 a M3 attraverso
la seguente relazione ricorsiva

zn = tz 3 + (1 t)z 2 + c . (4.9)

Dove il parametro t varia con continuita fra 0 ed 1.


Sembra che alcuni valori di t siano critici e potete partire con t
=0.12595. Riportiamo in figura 4.6 un tipico plot di di questo set
regolabile.

4.6 Le trasformazioni affini


Il metodo IFS ( Iterated Function System ) permette di produrre im-
magini di curve frattali, foglie, nuvole, etc...
Ricordiamo che una trasformazione affine wi e data da

120
CAPITOLO 4. I FRATTALI 4.6. LE TRASFORMAZIONI AFFINI

Figura 4.5: Tipico plot M**3

Figura 4.6: Tipico plot regolabile

121
4.6. LE TRASFORMAZIONI AFFINI CAPITOLO 4. I FRATTALI

Tabella 4.1: Tabella dei coefficienti

w a b c d e f p
1 0 0 0 0.16 0 0 0.01
2 0.85 0.04 0.04 0.85 0 1.6 0.85
3 0.20 0.26 0.23 0.22 0 1.6 0.07
4 0.15 0.28 0.26 0.24 0 0.44 0.07

wi = [ xy ] = [ a bc d ] [ xy ]+[ ef ] = [ ax+ by+ ecx+ dy+ f ] .


(4.10)
Inoltre ogni trasformazione e caratterizzata da una certa probabilita
di avvenire pi associata a wi . Ovviamente essendo probabilita dovremo
avere:

p1 + p2 + .....pn = 1 e pi > 0 per i = 1, 2, ...n . (4.11)

Riportiamo in tabella i valori dei coefficienti che permettono di ottenere


una figura caratteristica.
Per capire le componenti di queste strutture complicate possiamo
studiare il significato geometrico dei coefficienti a,b,c,d,e ed f. Per par-
tire osserviamo che e ed f sono semplici traslazioni nelle direzioni x ed
y. Adesso scriviamo a = r cos ( ), b = -s sen ( ), c = r
sen ( ) e d = s cos ( ). E facile realizzare che e l angolo del
quale ruotiamo l asse x e e l angolo del quale ruotiamo y, r e fattore
per il quale sono moltiplicate le distanze lungo x ed s e il fattore per il
quale moltiplicare le distanze lungo y. Prendendo = abbiamo una
riflessione attravesrso l asse x e prendendo s negativo si origina una
riflessione attraverso l asse y. Possiamo quindi riesprimere i parame-
tri a, b, c,d attraverso r, s, e ; continuando possiamo mettere h e
k al posto di e ed f. Per maggiori dettagli sulle trasformazioni affini
consultare il libro di [Ba 88] . Riportiamo nella figura 4.7 seguente una
tipica implementazione pratica. L implementazione pratica avviene
attraverso il programma FELCI.
program felci
implicit real *8 (a-h,o-z)

122
CAPITOLO 4. I FRATTALI 4.6. LE TRASFORMAZIONI AFFINI

Figura 4.7: La felce

123
4.6. LE TRASFORMAZIONI AFFINI CAPITOLO 4. I FRATTALI

logical * 1 prob1,prob2,prob3,prob4
real * 4 xx , yy
parameter ( nvec = 150 000 )
parameter ( minimum = 100 )
dimension xx (1 : nvec )
dimension yy (1: nvec )
integer g05dyf
call g05cbf ( 0 )
type *,numero di punti ?
accept *,npoints
x = 0.0
y = 0.0
do j = 1, npoints
intero = g05dyf ( 1, 100 )
prob1 = intero.eq.1
prob2 = (intero.gt.1 ).and.(intero.le.86 )
prob3 = (intero.gt.86).and.(intero.le.93 )
prob4 = (intero.gt.93).and.(intero.le.100)
if ( prob1 ) then
itipo = 1
call affine ( itipo,x,y,xnew,ynew )
elseif ( prob2 ) then
itipo = 2
call affine ( itipo,x,y,xnew,ynew )
elseif ( prob3 ) then
itipo = 3
call affine ( itipo,x,y,xnew,ynew )
elseif ( prob4 ) then
itipo = 4
call affine ( itipo,x,y,xnew,ynew )
end if
if ( j.gt. minimum ) then
jvec = jvec + 1
xx ( jvec ) = sngl ( xnew )
yy ( jvec ) = sngl ( ynew )
end if
x = xnew
y = ynew
end do

124
CAPITOLO 4. I FRATTALI 4.6. LE TRASFORMAZIONI AFFINI

call affinegraf ( xx, yy , jvec ,npoints,minimum,nvec)


stop
end
subroutine affine ( itipo,x,y,xnew,ynew )
implicit real *8 ( a-h,o-z)
if (itipo.eq.1) then
a = 0.
b = 0.
c = 0.
d = 0.16
e = 0.
f = 0.
elseif (itipo.eq.2) then
a = 0.85
b = 0.04
c = -0.04
d = 0.85
e = 0.0
f = 1.6
elseif (itipo.eq.3) then
a = 0.2
b = -0.26
c = 0.23
d = 0.22
e = 0.0
f = 1.6
elseif (itipo.eq.4) then
a = -0.15
b = 0.28
c = 0.26
d = 0.24
e = 0.00
f = 0.44
end if
xnew = a * x + b * y + e
ynew = c * x + d * y + f
return
end

125
4.7. IL SISTEMA L CAPITOLO 4. I FRATTALI

4.7 Il sistema L
Questo sistema e stato inventato dal botanico tedesco Lindenmayer (
vedi il libro di [PL 90]) per spiegare teoricamente le strutture ricorrenti
delle piante. Ai fini pratici possiamo sintetizzare l algoritmo mediante
il moto di una tartaruga. Lo stato della tartaruga e definito da una
tripletta ( x,y, ), dove le coordinate cartesiane ( x, y ) rappresentano
la posizione della tartaruga e l angolo indica la direzione di moto
della tartaruga. Dato l incremento d di ogni step ( possiamo porlo
uguale ad uno ) e l incremento di angolo la tartaruga risponde ai
seguenti comandi

F Si muove avanti di uno step d. Lo stato della tartaruga diventa


( x, y, ) dove x = x + d cos e y = y + d sin . Una linea
viene tracciata fra i punti (x,y) e (x,y).

f Si muove avanti di una lunghezza d senza tracciare una linea.

+ Si gira a sinistra di un angolo . Il prossimo stato della tartaru-


ga e (x,y, + ) e quindi gli angoli crescono in senso antiorario.

- Ruota a sinistra di un angolo . Il prossimo stato della tartaruga


e (x,y, - ).

[ Congela lo stato della tartaruga. Le informazioni correnti, po-


sizione e angolo sono memorizzate per poi essere riesumate piu
avanti.

] Scongela lo stato della tartaruga. Le informazioni vengono riesu-


mate e diventano quelle attuali della tartaruga. Non viene tirata
nessuna linea e quasi sempre la tartaruga cambia posizione.

Data una stringa iniziale w, lo stato iniziale della tartaruga con (


x0 , , y0 ,0 ) e fissati i parametri d e , tramite una o piu regole di
produzione otteniamo la posizione successiva e cos via. Il problema e
quindi di ideare una stringa iniziale e regole di trasformazione tali da
ottenere le curve volute. Riportiamo come esempio una pianta curvata
dal vento, vedi figura 4.8 .
n=4
= 22.5
w=F

126
CAPITOLO 4. I FRATTALI 4.7. IL SISTEMA L

Figura 4.8: Pianta e vento di tramontana

127
4.7. IL SISTEMA L CAPITOLO 4. I FRATTALI

F FF-[-F+F+F]+[+F-F-F]
A questo punto ricordiamo che sono attualmente disponibili una
quarantina di curve fra frattali e piante. Questa particolare stringa
viene implementata attraverso la SUBROUTINE MAKEPIANTA3.

subroutine makepianta3 (stringa,max,it,ifine)


implicit real * 4 (a-h,o-z)
parameter (new = 200 000 )
character * 1 stringa ,stringanew
dimension stringa (1:max)
dimension stringanew (1:new)
ifine = 1
stringa (1) = F
do jit =1,it
nuovo = 0
do j = 1 ,ifine
if (stringa (j).eq.F) then
nuovo = nuovo +1
stringanew (nuovo) =F
nuovo= nuovo +1
stringanew (nuovo) =F
nuovo= nuovo +1
stringanew (nuovo) =+
nuovo= nuovo +1
stringanew (nuovo) =[
nuovo= nuovo +1
stringanew (nuovo) =+
nuovo= nuovo +1
stringanew (nuovo) =F
nuovo = nuovo +1
stringanew (nuovo )=-
nuovo= nuovo +1
stringanew (nuovo )=F
nuovo = nuovo +1
stringanew (nuovo )=-
nuovo= nuovo +1
stringanew (nuovo )=F
nuovo= nuovo +1
stringanew (nuovo )=]

128
CAPITOLO 4. I FRATTALI 4.7. IL SISTEMA L

nuovo= nuovo +1
stringanew (nuovo )=-
nuovo = nuovo +1
stringanew (nuovo) =[
nuovo= nuovo +1
stringanew (nuovo) =-
nuovo= nuovo +1
stringanew (nuovo) =F
nuovo= nuovo +1
stringanew (nuovo) =+
nuovo= nuovo +1
stringanew (nuovo) =F
nuovo= nuovo +1
stringanew (nuovo) =+
nuovo= nuovo +1
stringanew (nuovo )=F
nuovo= nuovo +1
stringanew (nuovo )=]
else
nuovo = nuovo +1
stringanew (nuovo) = stringa(j)
end if
end do
do j= 1,nuovo
stringa(j) = stringanew (j)
end do
ifine = nuovo
end do
return
end
Invece la stringa finale risultante viene decodificata attraverso la SUB-
ROUTINE GX.
subroutine gx(stringa,max,ifine,agl,xmax,xmin,ymax,ymin,ae)
implicit real * 4 (a-h,o-z)
character * 1 stringa,car
dimension stringa (1:max)
dimension stackx ( 1:1000)
dimension stacky ( 1:1000)

129
4.7. IL SISTEMA L CAPITOLO 4. I FRATTALI

dimension stackae ( 1:1000)


xmax = - 10.**20
xmin = 10.**20
ymax = - 10.**20
ymin = 10.**20
x = 0.
y = 0.
numero = 0
do j =1,ifine
if (x.gt.xmax ) then
xmax = x
end if
if (x.lt.xmin ) then
xmin = x
end if
if (y.gt.ymax ) then
ymax = y
end if
if (y.lt.ymin ) then
ymin = y
end if
car = stringa (j)
cccccccccccc inizio sostituzioni
if (car.eq.F) then
xnew = x + cosd ( ae )
ynew = y + sind ( ae )
x = xnew
y = ynew
end if
if (car.eq.f) then
xnew = x + cosd ( ae )
ynew = y + sind ( ae )
x = xnew
y = ynew
end if
if (x.gt.xmax ) then
xmax = x
end if
if (x.lt.xmin ) then

130
CAPITOLO 4. I FRATTALI 4.7. IL SISTEMA L

xmin = x
end if
if (y.gt.ymax ) then
ymax = y
end if
if (y.lt.ymin ) then
ymin = y
end if
if (car.eq.+) then
ae = ae - agl
end if
if (car.eq.-) then
ae = ae + agl
end if
if (car.eq.[) then
numero = numero + 1
stackx ( numero ) = x
stacky ( numero ) = y
stackae (numero ) = ae
end if
if (car.eq.]) then
x = stackx ( numero )
y = stacky ( numero )
ae = stackae ( numero )
numero = numero - 1
end if
ccccccccccccccc fine sostituzioni ccccccccccccccccccccccccccc
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
end do
return
end

131
4.7. IL SISTEMA L CAPITOLO 4. I FRATTALI

132
Capitolo 5

Sistemi Monte Carlo

In questi ultimi anni abbiamo assistito ad un crescente numero di si-


mulazioni di sistemi fisici mediante modelli al calcolatore. Il campo e
enorme ed in continua evoluzione e ci limiteremo ad una scelta ran-
dom di alcune topiche; ah non dimentichiamoci che il nome deriva dal
famoso casino...

5.1 DLA
Il nome prende le iniziali da Diffusion Limited Aggregation ed e un ti-
pico esempio di crescita/aggregazione che simula il comportamento di
colonie di batteri, esperimenti fra fluidi con viscosita diverse e scariche
elettriche nei gas. La superficie considerata viene identificata con un
lattice consistente in N N pixels. All inizio il nostro aggregato consi-
ste in una sola particella al centro della griglia. La diffusione delle altre
particelle viene simulata da una particella che entra da uno dei quattro
lati a seconda del numero random R1 [1, 4]. La particella si muove poi
di moto random sul lattice: questo significa che ad ogni step ha quattro
possibili movimenti scelti con un processo random R2 [1, 4]. Le quattro
direzioni di movimento sono:

1. destra,

2. alto,

3. sinistra,

4. basso.

133
5.1. DLA CAPITOLO 5. SISTEMI MONTE CARLO

Ogni volta che viene raggiunta una locazione nuova viene controllato
se uno dei quattro vicini ( di nuovo destra, alto, sinistra e basso ) e
occupato. Se risulta occupato l aggregato aumenta di una unita e il
cammino random ricomincia con un altra particella su di un altro lato
del quadrato. Se invece il punto occupato non ha vicini appartenenti
all aggregato il cammino random continua; il processo si ferma quando
viene raggiunto un punto sulla frontiera e ricomincia ovviamente con un
altra particella su di un altro lato. Si possono poi introdurre ulteriori
regole che permettono di diminuire il tempo di calcolo; in particolare
possiamo ingrandire progressivamente il lato del quadrato interno dal
quale partiamo e idem dicasi per un cuscinetto detto killing zone piu
grande del quadrato delle partenze superato il quale il processo comincia
di nuovo senza aspettare di raggiungere le frontiere naturali del lattice.
Per maggiori dettagli sulla teoria della DLA consultare il libro [Vi 92].
Riportiamo nella figura 5.1 un tipico esempio di crescita su di un lattice
con 500 pixels.
Questo algoritmo viene implementato attraverso la SUBROUTINE
WO:

subroutine wo(griglia ,ndim ,l_dist,k_dist,m_dist,n_max,n_vero)


implicit real * 4 ( a-h,o-z)
logical * 1 griglia , occupato
external g05dyfzan
integer g05dyfzan
dimension griglia(ndim,ndim)
dimension ivicinox ( 1 : 4 )
dimension ivicinoy ( 1 : 4 )
dimension iarrivo ( 1 : 4 )
c zero the lattice and mark the center as occupied
do i=1,ndim
do j=1,ndim
griglia(j,i)=.false.
end do
end do
npts=1
mid=ndim/2
griglia(mid,mid)=.true.
c define initial launching and kill boundaries
lx_min=mid-l_dist

134
CAPITOLO 5. SISTEMI MONTE CARLO 5.1. DLA

Figura 5.1: Tipico esempio di DLA

135
5.1. DLA CAPITOLO 5. SISTEMI MONTE CARLO

lx_max=mid+l_dist
ly_min=mid-l_dist
ly_max=mid+l_dist
kx_min=lx_min-k_dist
kx_max=lx_max+k_dist
ky_min=ly_min-k_dist
ky_max=ly_max+k_dist
c set an artificial occupation boundary at the start
mx_min=mid-m_dist
mx_max=mid+m_dist
my_min=mid-m_dist
my_max=mid+m_dist
cc
cccc abbiamo fissato le zone di lancio
cc e quelle di killing

idum = 33333
kgen = 77777
kdir = 55555
nn = 1
ilato = 0
itotale= 0
ccc inizio zona di lancio
40 continue
ilato = g05dyfzan ( 1 , 4 ,idum )
itotale = itotale + 1
c ilato = ilato + 1
c if (ilato.gt.4) then
c ilato = 1
c end if
c
c lx_min,ly_max 2 lx_max,ly_max
c -------------------------
c | |
c | |
c | zona di |
c 1 | | 3
c | lancio |
c | |

136
CAPITOLO 5. SISTEMI MONTE CARLO 5.1. DLA

c -------------------------
c lx_min,ly_min 4 lx_max,ly_min
c
if ( ilato.eq. 1 ) then
ix = lx_min
iy = g05dyfzan ( ly_min,ly_max,kgen )
elseif ( ilato.eq. 2 ) then
ix = g05dyfzan ( lx_min,lx_max,kgen )
iy = ly_max
elseif ( ilato.eq. 3 ) then
ix = lx_max
iy = g05dyfzan ( ly_min,ly_max,kgen )

elseif ( ilato.eq. 4 ) then


ix = g05dyfzan ( lx_min,lx_max,kgen )
iy = ly_min

end if
c adesso impostiamo la direzione di moto
100 continue
idir = g05dyfzan ( 1 , 4 , kdir )
c
c
c 3
c |
c |
c |
c 4 ------ * ------ 2
c |
c |
c |
c 1
c
if (idir .eq . 1 ) then ! si muove giu in basso
ix = ix
iy = iy - 1
elseif ( idir.eq.2 ) then ! si muove a destra
ix = ix +1
iy = iy

137
5.1. DLA CAPITOLO 5. SISTEMI MONTE CARLO

elseif ( idir.eq.3 ) then ! si muove in alto


ix = ix
iy = iy + 1
elseif ( idir.eq.4 ) then ! si muove a sinistra
ix = ix -1
iy = iy
end if
c
cc adesso ci siamo mossi !!!!!
c

c
c adesso facciamo un controllo sulla killing zone
c se abbiamo raggiunto la frontiera ricominciamo
c dalla zona di lancio

if ((iy.eq.ky_min).or.(iy.eq.ky_max)) then ! limite alto


! e basso
go to 40
elseif ((ix.eq.kx_min).or.(ix.eq.kx_max))then ! limite destro
! e sinistro
go to 40
end if
c
cc costruzione dei quattro vicini !
c
c -------------
c
c
c
c
c
c

ivicinox (1) = ix
ivicinoy (1) = iy - 1
c primo vicino
ivicinox (2) = ix + 1

138
CAPITOLO 5. SISTEMI MONTE CARLO 5.1. DLA

ivicinoy (2) = iy
c secondo vicino
ivicinox (3) = ix
ivicinoy (3) = iy +1
c terzo vicino
ivicinox (4) = ix - 1
ivicinoy (4) = iy
c quarto vicino

c
cc adesso vediamo se uno dei quattro vicini
c e occupato
occupato =.false.
do jj = 1, 4
if ( griglia ( ivicinox ( jj), ivicinoy (jj)) ) then
if ( .not.griglia (ix,iy)) then
nn = nn + 1
if ( nn.eq.( n_max+1 ) ) then
nn = nn -1
type *,Abbiamo raggiunto n_max
go to 950
end if
griglia (ix,iy) = . true .
occupato = . true .
iarrivo (ilato )= iarrivo ( ilato ) +1
c
ccc ridefinizione dei massimi e dei minimi in x
c

if (ix.gt.mx_max) then
mx_max = ix
end if
if (ix.lt.mx_min) then
mx_min = ix
end if
c
ccc ridefinizione dei massimi e dei minimi in y
c
if (iy.gt.my_max) then

139
5.1. DLA CAPITOLO 5. SISTEMI MONTE CARLO

my_max = iy
end if
if (iy.lt.my_min) then
my_min = iy
end if
end if
end if

c
ccc ridefinizione eventuale della zona di lancio
c
if (( mx_min -lx_min) .eq. 1 ) then
go to 200
elseif (( lx_max - mx_max ) .eq. 1 ) then
go to 200
elseif (( ly_max - my_max ) .eq. 1 ) then
go to 200
elseif (( my_min -ly_min ) .eq. 1 ) then
go to 200
end if
go to 300
200 continue
c
ccccccc
c
lx_min = lx_min - l_dist
lx_max = lx_max + l_dist
ly_min = ly_min - l_dist
ly_max = ly_max + l_dist
idum = idum +1
kgen = kgen +1
ddir = kdir + 1
c
cccc ma potremmo avere raggiunto la frontiera
c
c
ccccccc
c
kx_min=lx_min-k_dist

140
CAPITOLO 5. SISTEMI MONTE CARLO 5.1. DLA

kx_max=lx_max+k_dist
ky_min=ly_min-k_dist
ky_max=ly_max+k_dist
cc
ccccccccc ma potremmo avere raggiunto le frontiere
cc
if (kx_min.le. 1 ) then
type *,Abbiamo raggiunto la frontiera
go to 950
elseif (ky_min.le. 1 ) then
type *,Abbiamo raggiunto la frontiera
go to 950
elseif (ky_max.ge. ndim ) then
type *,Abbiamo raggiunto la frontiera
go to 950
elseif (kx_max.ge. ndim ) then
type *,Abbiamo raggiunto la frontiera
go to 950
end if

300 continue

end do
if (.not.occupato ) then
go to 100
end if
go to 40
950 continue
call esci ( nn,n_vero)
isum = 0
do j = 1, 4
type *,numero di arrivi dal lato ,j, =,iarrivo (j)
isum = isum + iarrivo (j)
end do
fraz = isum * 1.0 / itotale
type *,frazione arrivata sui totali partiti =,fraz
return
end

141
5.2. AGGREGAZIONE BALLISTICA
CAPITOLO 5. SISTEMI MONTE CARLO

5.2 Aggregazione ballistica


Questo processo di aggregazione cerca di spiegare fenomeni in cui entra
in gioco la gravita, tipo deposizione di zinco su di un catodo, esperi-
menti di soluzione chimica, depositi di ossido di manganese su calcari,
neve che cade su di un vetro. Come al solito lavoriamo su di un lattice
composto da N N pixels e le particelle partono da un punto random
R1 [1,N] sul lato in alto. Inizialmente l aggregato consiste in una par-
ticella posta sul lato in basso in posizione centrale ( deposito a cono )
oppure in piu di una particella ( deposito ad alberi ). Ad ogni sposta-
mento delle particelle in caduta vengono controllati i quattro vicini. Se
un vicino e occupato l aggregato aumenta di una unita e il processo
riparte con un altra particella sul lato in alto. Se invece nessuno dei
quattro vicini e occupato il processo riparte con il moto random. Se
vengono raggiunti i lati-frontiera sinistro oppure destro oppure inferio-
re il processo si ferma e riparte dall alto. Anche qu per velocizzare
il tempo di esecuzione del programma le particelle partono sul lato su-
periore variabile. Riportiamo nelle figure 5.2 e 5.3 due tipici esempi di
aggregazione ballistica.
L implementazione pratica avviene attraverso la SUBROUTINE
BA.

subroutine ba (occ ,ndim ,l_dist,k_dist,m_dist,n_max,n_vero,nba)


implicit real * 4 ( a-h,o-z)
logical * 1 occ , occupato
external g05dyfzan
integer g05dyfzan
dimension occ(ndim,ndim)
dimension ivicinox ( 1 : 4 )
dimension ivicinoy ( 1 : 4 )
c zero the lattice and mark the center as occupied
do i=1,ndim
do j=1,ndim
occ(j,i)=.false.
end do
end do
idum = 33333
do i =1 , nba
ipunto = g05dyfzan ( 1 , ndim ,idum )

142
CAPITOLO 5. SISTEMI MONTE CARLO
5.2. AGGREGAZIONE BALLISTICA

Figura 5.2: Deposito ballistico con un punto iniziale

143
5.2. AGGREGAZIONE BALLISTICA
CAPITOLO 5. SISTEMI MONTE CARLO

Figura 5.3: Deposito ballistico con piu punti iniziali

144
CAPITOLO 5. SISTEMI MONTE CARLO
5.2. AGGREGAZIONE BALLISTICA

if (nba.eq.1) then
ipunto = ndim / 2
end if
occ (ipunto,1) =.true.
end do
c define initial launching and kill boundaries
lx_min = 1
lx_max = ndim
ly_max= 1 + l_dist
ly_min= 1
ky_min = 1
ky_max= ly_max+k_dist
kx_max = ndim
kx_min = 1
c set an artificial occupation boundary at the start
my_max= 1 + m_dist
cc
cccc abbiamo fissato le zone di lancio
cc e quelle di killing

idum = 33333
kgen = 77777
kdir = 55555
nn = 1
ccc inizio zona di lancio
40 continue
c
ccccccccc
c lx_min,ly_max ..... lx_max,ly_max
c -------------------------
c | |
c | |
c | zona di |
c | |
c | lancio |
c | |
c

ix = g05dyfzan ( lx_min,lx_max,kgen )

145
5.2. AGGREGAZIONE BALLISTICA
CAPITOLO 5. SISTEMI MONTE CARLO

iy = ly_max

c adesso impostiamo la direzione di moto


100 continue
idir = g05dyfzan ( 1 , 3 , kdir )
c
c 3 ------ * ------ 2
c |
c |
c |
c 1
c
if (idir .eq . 1 ) then ! si muove giu in basso
ix = ix
iy = iy - 1
elseif ( idir.eq.2 ) then ! si muove a destra
ix = ix +1
iy = iy
elseif ( idir.eq.3 ) then ! si muove a sinistra
ix = ix -1
iy = iy
end if

c
cc adesso ci siamo mossi !!!!!
c

c
c adesso facciamo un controllo sulla killing zone
c se abbiamo raggiunto la frontiera ricominciamo
c dalla zona di lancio

if (iy.eq.ky_min) then ! limite alto


! e basso
go to 40
elseif ((ix.eq.kx_min).or.(ix.eq.kx_max))then ! limite destro
! e sinistro
go to 40

146
CAPITOLO 5. SISTEMI MONTE CARLO
5.2. AGGREGAZIONE BALLISTICA

end if
c
cc costruzione dei tre vicini !
c
c -------------
c
c
c
c
c
c

ivicinox (1) = ix
ivicinoy (1) = iy - 1
c primo vicino
ivicinox (2) = ix + 1
ivicinoy (2) = iy
c secondo vicino
ivicinox (3) = ix - 1
ivicinoy (3) = iy
c terzo vicino

c
cc adesso vediamo se uno dei quattro vicini
c e occupato
occupato =.false.
do jj = 1, 3
if ( occ ( ivicinox ( jj), ivicinoy (jj)) ) then
if ( .not.occ (ix,iy)) then
nn = nn + 1
if ( nn.eq.( n_max+1 ) ) then
nn = nn -1
call esci ( nn,n_vero)
type *,Abbiamo raggiunto n_max
return
end if
occ (ix,iy) = . true .
occupato = . true .
c

147
5.3. PERCOLAZIONE CAPITOLO 5. SISTEMI MONTE CARLO

ccc ridefinizione del massimo in y


c
if (iy.gt.my_max) then
my_max = iy
ly_max = my_max + l_dist
end if
if (ly_max.ge. ndim ) then
call esci ( nn,n_vero)
type *,Abbiamo raggiunto la frontiera
return
end if
end if
end if
end do
if (.not.occupato ) then
go to 100
end if
go to 40
end

5.3 Percolazione
Anche qu grazie all avvento dei computers e stato aperto un nuovo
capitolo al confine fra fisica e matematica. Prendiamo in esame un
lattice quadrato con N N occupazioni disponibili e introduciamo una
probabilita di occupazione dei punti del lattice p varianti fra 0 ed 1.
Questo significa che ad ogni p avremo un numero M di punti occupati
sul lattice pari a:

M = N IN T (p N N ) . (5.1)

Possiamo generare queste M occupazioni con due processi random


(
Ix = R1 [1, N ]
, (5.2)
Iy = R2 [1, N ]

controllando ogni volta che il punto del lattice ( Ix , Iy ) non sia gia
occupato. Alla fine del processo avremo M punti occupati sul lattice (
N N ). Notiamo che quando P 0.59 e possibile trovare un cammino

148
CAPITOLO 5. SISTEMI MONTE CARLO 5.3. PERCOLAZIONE

di siti occupati che connette alto e basso e destra e sinistra. Diciamo a


questo punto che il cluster percola attraverso il sistema come l acqua
percola attraverso una caffettiera. Questa probabilita prende il nome
di probabilita critica pc e gioca un ruolo cruciale in tutta la teoria.
Riportiamo nella figura 5.4 un tipico esempio di occupazione random
di un cluster di 300 pixels con p= 0.1 .
Le applicazioni pratiche della percolazione possono essere gli in-
cendi nelle foreste, le transizioni di fase tipo ferro-magnetismo pa-
ramagnetismo, conduttivita, etc. ; per maggiori dettagli consultate
il libro [TF 92]. Praticamente possiamo implementare l algoritmo
mediante la SUBROUTINE FAI-PUNTI.

subroutine fai_punti (kubo,mmm,perc)


implicit real * 4 ( a-h ,o-z)
logical * 1 kubo
dimension kubo ( 0 : mmm , 0 : mmm )
external g05dyfzan
integer g05dyfzan
do ix = 0, mmm
do iy = 0, mmm
kubo ( ix, iy ) = .false.
end do
end do
itotal = ( mmm + 1 ) *( mmm + 1)
iselected = nint ( perc * itotal )
icambiati = 0
idum = 777777
do jj = 1 , iselected
50 continue
ix = g05dyfzan (0,mmm,idum)
iy = g05dyfzan (0,mmm,idum)
if ( kubo ( ix,iy )) then
icambiati = icambiati + 1
go to 50
end if
kubo (ix,iy) =.true.
end do
return
end

149
5.3. PERCOLAZIONE CAPITOLO 5. SISTEMI MONTE CARLO

Figura 5.4: Percolazione con p=0.1

150
CAPITOLO 5. SISTEMI MONTE CARLO 5.3. PERCOLAZIONE

Il problema di trovare il cluster di connessione puo essere cos risolto.


Prendiamo un punto occupato del lattice, eliminiamolo dal lattice e
mettiamolo in un vettore. Abbiamo adesso quattro vicini e controlliamo
quali sono quelli occupati: essi finiranno nel vettore. Calcoliamo adesso
i vicini occupati da tutti gli elementi del vettore e cos via. Questo e
un cluster e il processo si ferma quando non troviamo piu nessun vicino
occupato. Il cluster di connessione viene trovato quando quattro punti
di esso appartengono ai lati sinistro, destro alto e basso; vedi figura 5.5.
Questo algoritmo di ricerca del cluster viene implementato attra-
verso la SUBROUTINE FAICLUSTER.

subroutine fai_cluster ( kubo, mmm ,si ,cluster)


implicit real * 4 (a-h,o-z)
integer *4 ifine
logical *1 kubo,condizionea,condizioneb
logical *1 condizionex
logical *1 condizioney
logical *1 si
logical *1 cluster
parameter ( ipoints = 100 000 )
parameter (maxelements =20 000) ! dimensione vettori vari
dimension kubo ( 0:mmm,0:mmm )
dimension cluster ( 0:mmm,0:mmm )
dimension icx ( 1:maxelements )
dimension icy ( 1:maxelements )
dimension ielements ( 1:maxelements )
dimension inewx ( 1:maxelements )
dimension inewy ( 1:maxelements )
dimension inewxsur ( 1:maxelements )
dimension inewysur ( 1:maxelements )
dimension isx ( 1:ipoints )
dimension isy ( 1:ipoints )
ifine = 0
do jx = 0 , mmm
do jy = 0 , mmm
if ( kubo (jx ,jy) ) then
ifine = ifine + 1
isx (ifine) = jx
isy (ifine) = jy

151
5.3. PERCOLAZIONE CAPITOLO 5. SISTEMI MONTE CARLO

Figura 5.5: Cluster di connessione

152
CAPITOLO 5. SISTEMI MONTE CARLO 5.3. PERCOLAZIONE

end if
end do
end do
if ( ifine.gt.ipoints) then
stop aumentare ipoints !
end if
icluster = 0
1015 continue
icluster = icluster +1
do jj=1,ifine
ix = isx (jj)
iy = isy (jj)
if (kubo(ix,iy)) then
icx (1) = ix
icy (1) = iy
kubo(ix,iy ) =.false.
inewx (1 ) = ix
inewy (1 ) = iy
go to 102
end if
end do
icluster = icluster -1
go to 1016
102 continue
mmm1 = mmm + 1
number = 1
new = 1
103 continue
iadd = 0
cccccccccccccccc caricamento primi vettori di nuovi punti ccccccccccccc
do j=1,new
do jcasi = 1, 4
if ( jcasi.eq. 1 ) then
isux = 0
isuy = 1
elseif ( jcasi.eq. 2 ) then
isux = +1
isuy = 0
elseif ( jcasi.eq. 3 ) then

153
5.3. PERCOLAZIONE CAPITOLO 5. SISTEMI MONTE CARLO

isux = 0
isuy = -1
elseif ( jcasi.eq. 4 ) then
isux = -1
isuy = 0
end if
newx = inewx ( j ) + isux
newy = inewy ( j ) + isuy
if (( newx.eq.-1).or.(newx.eq.mmm1)) then
go to 1050
end if
if (( newy.eq.-1).or.(newy.eq.mmm1)) then
go to 1050
end if
if (( isux.eq.0).and.(isuy.eq.0 )) then
go to 1050
end if
c x boundaries problem
if (kubo(newx,newy)) then
kubo(newx,newy)=.false.
iadd = iadd +1
inewxsur ( iadd ) = newx
inewysur ( iadd ) = newy
end if
1050 continue
end do
end do
c determinzaione 4 vicini ccccccccccccccc
if ( iadd.eq.0 ) then
ielements ( icluster) = number
cc inseriamo il loop sul calcolo della percolazione
cc scanning su y
condizionea = .false.
condizioneb = .false.
do j= 1 , number
if (icy(j).eq. 0 ) then
condizionea = . true .
end if
if (icy(j).eq. mmm ) then

154
CAPITOLO 5. SISTEMI MONTE CARLO 5.3. PERCOLAZIONE

condizioneb = . true .
end if
end do
condizioney=.false.
if ((condizionea).and.(condizioneb)) then
condizioney =.true.
end if
cc scanning su x
condizionea = .false.
condizioneb = .false.
do j= 1 , number
if (icx(j).eq. 0 ) then
condizionea = . true .
end if
if (icx(j).eq. mmm ) then
condizioneb = . true .
end if
end do
condizionex =.false.
if ((condizionea).and.(condizioneb)) then
condizionex =.true.
if (condizionex.and.condizioney) then
si =.true.
do jjj = 1 , number
iixx = icx ( jjj )
jjyy = icy ( jjj )
cluster ( iixx , jjyy ) =.true.
end do
end if
end if
go to 1015
end if
do j = 1,iadd
number = number + 1
icx (number ) = inewxsur (j)
icy (number ) = inewysur (j)
end do
do j = 1,iadd
inewx ( j ) = inewxsur (j)

155
5.4. CATENE DI VORONOI CAPITOLO 5. SISTEMI MONTE CARLO

inewy ( j ) = inewysur (j)


end do
new = iadd
go to 103
ccccccccc end great loop cccccccccccccccccccccccccccccccccccccc
1016 continue
cccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
type *,clusters veri=,icluster
return
end

5.4 Catene di Voronoi


Questi diagrammi prendono il nome da un matematico russo che nel
1908 fece un lavoro ( ovviamente analitico ) sui poligoni irregolari che
riempiono il piano. Il problema e poi stato ripreso da svariati auto-
ri ognuno con in mente una applicazione di diverso tipo: struttura
dei cristalli, struttura della cellula, raffreddamento e conseguente fram-
mentazione delle rocce, struttura dell universo,etc. Il problema in due
dimensioni consiste nel trovare una volta che e dato un insieme di punti,
detti nuclei, una partizione dello spazio tale che ogni nucleo abbia un
suo dominio e le frontiere, ovverosia le zone equidistanti fra un nucleo
e l altro, siano marcate.
Per riassumere chiamiamo diagrammi di Voronoi il set dei punti tali
che le distanze fra i due nuclei piu vicini siano uguali. Elenchiamo una
serie possibile di disposizioni di nuclei nel piano classificabile in base
alla distribuzione di probalita di partenza oppure in base all algoritmo
generante:

1. generazione random su x ed y,

2. generazione gaussiana polare su r e ,

3. numeri pseudo-random o di Sobol,

4. autovalori di matrice complessa,

5. punti frattali.

156
CAPITOLO 5. SISTEMI MONTE CARLO 5.4. CATENE DI VORONOI

Figura 5.6: Diagramma di Voronoi con nuclei random su x e y

157
5.4. CATENE DI VORONOI CAPITOLO 5. SISTEMI MONTE CARLO

Figura 5.7: Diagramma di Voronoi con nuclei gaussiani

158
CAPITOLO 5. SISTEMI MONTE CARLO 5.4. CATENE DI VORONOI

Figura 5.8: La testa della margherita

159
5.4. CATENE DI VORONOI CAPITOLO 5. SISTEMI MONTE CARLO

Si tratta poi di trovare tramite uno scanning degli N N punti del


lattice quelli equidistanti dai due nuclei piu vicini per quanto riguarda i
lati e dai tre nuclei piu vicini per quanto riguarda i vertici. Riportiamo
nelle due figure 5.6 e 5.7 un tipico esempio di tessellazione quando i
nuclei sono distribuiti in maniera random su x y ed in maniera gaussia-
na . Le applicazioni pratiche sono svariate e come esempio riportiamo
la struttura logaritmica della testa dei fiori tipo margherita o girasole.
Per generare i nuclei usiamo la formula di Vogel:

= n 137.5 r = c n , (5.3)

dove

1. n e il numero di punti in senso crescente dal centro. Questo e


l inverso dell eta dell organismo vegetale in questione.

2. e l angolo di referenza in gradi del punto n in coordinate polari.

3. r e la distanza fra il centro ed il punto n.

Il risultante diagramma di Voronoi viene riportato nella figura 5.8


Per maggiori dettagli sui diagrammi di Voronoi consultare il libro [OBS 92] .
L implementazione pratica dello scanning avviene attraverso la SUB-
ROUTINE MATRICE.

subroutine
, matrice (vec,ipunti,side,matrix,nodes,mll,muu,mmm,traspo)
implicit real * 8 (a-h,o-z)
logical * 1 matrix,yes,nodes,lato1,lato2
parameter (nnnn=1000)
dimension matrix (0:mmm,0:mmm )
dimension nodes (0:mmm,0:mmm )
dimension traspo (1:20 )
dimension vec (1:ipunti,1:2)
dimension ads0 (1:nnnn)
dimension ads (1:nnnn)
dimension awork (1:nnnn)
dimension index (1:nnnn)
dimension indexwork (1:nnnn)
dimension nodesx (1:nnnn)
dimension nodesy (1:nnnn)

160
CAPITOLO 5. SISTEMI MONTE CARLO 5.4. CATENE DI VORONOI

delta = side/mmm
delta0 = side/mll
rad2 = dsqrt (2.0 D+00)
correz = 1.
adelta = delta * correz
adelta0 = delta0 * correz
deltamezzi = delta /2.0
delta0mezzi= delta0/2.0
do jm=0,mmm
do jn=0,mmm
matrix (jm,jn)=.false.
nodes (jm,jn)=.false.
end do
end do
numero = 0
do jy0 =0 , mll -1
do jx0 =0 , mll -1
xx = jx0 * delta0 + delta0mezzi
yy = jy0 * delta0 + delta0mezzi
do jj =1,ipunti
ax = xx - vec(jj,1)
ay = yy - vec(jj,2)
ads0 (jj) = dsqrt ( ax*ax + ay*ay )
end do
ifail =0
call m01caf ( ads0,1,ipunti,A,ifail) ! riordino del vettore in
! senso ascendente
adiff0 = dabs (ads0(2)- ads0 (1))
if (adiff0.le.( adelta0* rad2)) then
do jy =jy0*muu , jy0*muu + muu-1
do jx =jx0*muu , jx0*muu + muu-1
xx = jx * delta + deltamezzi
yy = jy * delta + deltamezzi
do jj =1,ipunti
ax =xx - vec(jj,1)
ay =yy - vec(jj,2)
ads (jj) = dsqrt ( ax*ax + ay*ay )
end do
ifail =0

161
5.4. CATENE DI VORONOI CAPITOLO 5. SISTEMI MONTE CARLO

call m01ajf (ads,awork,index,indexwork,ipunti,ipunti,ifail)


adiff = dabs (ads(2)- ads (1))
cccccccccccc beginning check on all the square vertex ccccccccccccccccc
if (adiff.le.(adelta*rad2)) then
x1 = vec(index(1),1)
y1 = vec(index(1),2)
x2 = vec(index(2),1)
y2 = vec(index(2),2)
xc = xx
yc = yy
yes=.false.
call retta90 (x1,y1,x2,y2,xc,yc,deltamezzi,yes)
if (yes) then
numero = numero +1
matrix (jx,jy)=.true.
cccccccccc beginning nodes cccccccccccccccccccccccccccccccccccccccc
lato1 =.false.
lato2 =.false.
x1 = vec(index(1),1)
y1 = vec(index(1),2)
x2 = vec(index(3),1)
y2 = vec(index(3),2)
xc = xx
yc = yy
yes=.false.
call retta90 (x1,y1,x2,y2,xc,yc,deltamezzi,yes)
if (yes) then
lato1=.true.
end if
x1 = vec(index(2),1)
y1 = vec(index(2),2)
x2 = vec(index(3),1)
y2 = vec(index(3),2)
xc = xx
yc = yy
yes=.false.
call retta90 (x1,y1,x2,y2,xc,yc,deltamezzi,yes)
if (yes) then
lato2=.true.

162
CAPITOLO 5. SISTEMI MONTE CARLO 5.4. CATENE DI VORONOI

end if
if ((lato1).and.(lato2)) then
nodes (jx,jy)=.true.
endif
ccccccccccccccccccccccccc end nodes ccccccccccccccccccccccccccc
end if
end if
end do
end do
end if
end do
end do
traspo (1) = adelta
traspo (2) = numero

return
end

Questa subroutine fa uso della SUBROUTINE RETTA90.


subroutine retta90 (x1,y1,x2,y2,xc,yc,deltamezzi,yes)
implicit real *8 (a-h,o-z)
logical * 1 yes,uno,due
yes=.false.
uno=.false.
due=.false.
deltay = y2 -y1
deltax = x2 -x1
am = deltay/deltax
100 continue
c determinazione primo coefficiente angolare
amprimo = -1.0/am
c determinazione secondo coefficiente angolare a 90 gradi
ymezzi = (y1+y2)/2.0
xmezzi = (x1+x2)/2.0

163
5.4. CATENE DI VORONOI CAPITOLO 5. SISTEMI MONTE CARLO

x = xc + deltamezzi
y = ymezzi + amprimo * ( x - xmezzi)
c determinazione prima retta
ylower = yc - deltamezzi
yupper = yc + deltamezzi
if ((y.gt.ylower).and.(y.le.yupper)) then
uno=.true.
end if
x = xc - deltamezzi
y = ymezzi + amprimo * ( x - xmezzi)
c determinazione prima retta
if ((y.gt.ylower).and.(y.le.yupper)) then
uno=.true.
end if
y = yc + deltamezzi
x = (y-ymezzi)/amprimo + xmezzi
xlower = xc - deltamezzi
xupper = xc + deltamezzi
if ((x.gt.xlower).and.(x.le.xupper)) then
due=.true.
end if
y = yc - deltamezzi
x = (y-ymezzi)/amprimo + xmezzi
if ((x.gt.xlower).and.(x.le.xupper)) then
due=.true.
end if
if ((uno).or.(due)) then
yes = .true.
end if
return
end

164
Appendice A

Funzioni intrinseche

Riportiamo il nome generico delle funzioni intrinseche attualmente in


uso sui compilatori di FORTRAN 77 insieme ad una breve spiegazione
del loro significato.
ABS (numero) Una funzione che ritorna il valore assoluto dell ar-
gomento. Il valore assoluto di un numero complesso, (X,Y), e il suo
valore reale (X**2 + Y**2)**(1/2).
ACOS (numero)Una funzione che ritorna l arcocoseno dell argo-
mento in radianti. Il valore assoluto dell argomento deve essere minore
o uguale a 1.
ACOSD ( numero reale)Una funzione che ritorna l arcocoseno
dell argomento in gradi. Il valore dell argomento deve essere compreso
fra 0 (escluso) e 1 (incluso).
AIMAG (numero complesso)Una funzione che ritorna la parte
immaginaria di un numero complesso. L argomento deve essere di tipo
COMPLEX*8. Il risultato e di tipo REAL*4.
AINT ( numero reale)Una funzione che ritorna l intero piu gran-
de il cui valore assoluto non supera il valore assoluto dell argomento e
ha lo stesso segno dell argomento.
AMAX0 (numero, numero,...)Una funzione che ritorna il mag-
giore dei valori specificato nella lista degli argomenti.
AMIN0 (numero, numero,...) Una funzione che ritorna il mi-
nore dei valori specificati nella lista degli argomenti.
ANINT ( numero reale) Una funzione che ritorna il valore dell in-
tero piu vicino al valore dell argomento.

165
APPENDICE A. FUNZIONI INTRINSECHE

ASIN ( numero reale) Una funzione che ritorna l arcoseno dell ar-
gomento in radianti. Il valore assoluto dell argomento deve essere
minore o uguale a 1.
ASIND ( numero reale) Una funzione che ritorna l arcoseno
dell argomento in gradi. Il valore dell argomento deve essere compreso
fra 0 (escluso) e 1 (incluso).
ATAN ( numero reale) Una funzione che ritorna l arcotangente
dell argomento in radianti. Il valore assoluto dell argomento deve
essere maggiore di 0.
ATAND ( numero reale) Una funzione che ritorna l arcotan-
gente dell argomento in gradi. Il valore assoluto dell argomento deve
essere maggiore di 0.
ATAN2 ( numero reale, numero reale) Una funzione che ri-
torna l arcotangente del quoziente dei due argomenti in radianti. Se
ambedue gli argomenti sono zero, il risultato e indefinito. Se il primo
argomento e positivo, il risultato e positivo. Se il primo argomento e ne-
gativo, il risultato e negativo. Se il primo argomento e zero, il risultato
e zero. Se il secondo argomento e zero, il valore assoluto del risultato
e pi/2. Il range del risultato e compreso tra -pi e pi.
ATAN2D ( numero reale, numero reale) Una funzione che
ritorna l arcotangente del quoziente dei due argomenti in gradi. Se
ambedue gli argomenti sono zero, il risultato e indefinito. Se il primo
argomento e positivo, il risultato e positivo. Se il primo argomento
e negativo, il risultato e negativo. Se il primo argomento e zero, il
risultato e zero. Se il secondo argomento e zero, il valore assoluto
del risultato e 90. Il range del risultato e compreso tra -180 e 180
gradi.
BTEST (intero, posizione) Una funzione che ritorna il valore
logico.true. se il bit con l intero specificato dalla posizione e settato a
1. I Il bit di ordine basso e posizionato a 0.
CHAR (intero) Una funzione che ritorna il carattere associato
con il valore ASCII specificato dall argomento. L argomento deve es-
sere BYTE, LOGICAL*1, LOGICAL*2, LOGICAL*4, INTEGER*2,
o INTEGER*4 come tipo di dato. Il risultato deve essere di tipo
CHARACTER. Il valore di input deve essere nel range da 0 a 255.

CMPLX (numero [,numero]) Una funzione che converte uno o


due argomenti nel tipo COMPLEX*8. Se viene specificato un argo-
mento, questo e convertito nella parte reale del valore del complesso e

166
APPENDICE A. FUNZIONI INTRINSECHE

la parte immaginaria diventa zero. Se sono specificati due argomenti, il


primo e convertito nella parte reale del valore del complesso e il secondo
nella parte immaginaria del valore del complesso. I due argomenti che
sono specificati devono essere dello stesso tipo.
CONJG (numero complesso) Una funzione che ritorna il com-
plesso coniugato dell argomento. Se l argomento e (X,Y), il suo
complesso coniugato e (X,-Y).
COS (numero) Una funzione che ritorna il coseno dell argomento.
L argomento deve essere in radianti.
COSD (numero) Una funzione che ritorna il coseno dell argo-
mento. L argomento deve essere in gradi.
COSH ( numero reale) Una funzione che ritorna il coseno iper-
bolico dell argomento.
DATE (data) Una subroutine che mette la data corrente nel suo
argomento. L argomento a 9-byte puo essere una stringa carattere,
una variable, vettore, o un elemento di vettore di ogni tipo. La data e
un valore ASCII formattato come segue: gg-mmm-aa.
DBLE (numero) Una funzione che converte l argomento in un
valore REAL*8.
DCMPLX (numero [,numero]) Una funzione che converte uno
o due argomenti nel tipo COMPLEX*16. Se viene specificato un argo-
mento, questo e convertito nella parte reale del valore del complesso e
la parte immaginaria diventa zero. Se sono specificati due argomenti,
il primo e convertito nella parte reale del valore del complesso e il se-
condo argomento nella parte immaginaria del valore del complesso. I
due argomenti che sono specificati devono essere dello stesso tipo.
DFLOAT (integer) Una funzione che converte l argomento in un
valore REAL*8.
DIM (numero, numero) Una funzione che ritorna il valore del
primo argomento meno il minimo (MIN) dei due argomenti.
DIMAG (immaginario) Una funzione che ritorna la parte im-
maginaria di un numero complesso. L argomento deve essere di tipo
COMPLEX*16. Il risultato e del tipo REAL* 8.
DPROD (numeroreal*4, numeroreal*4) Una funzione che ri-
torna il prodotto di due valori REAL*4 come un valore REAL*8.
DREAL (numero complesso) Una funzione che ritorna la par-
te reale di un numero complesso. L argomento deve essere di tipo
COMPLEX*16. Il risultato e di tipo REAL*8.

167
APPENDICE A. FUNZIONI INTRINSECHE

EXP (esponente) Una funzione che ritorna e**X, dove X e il


valore dell argomento.
FLOAT (integer) Una funzione che converte l argomento in un
valore REAL*4.
IABS (numero) Una funzione che ritorna il valore assoluto di un
argomento intero. Il valore assoluto di un numero complesso, (X,Y), e
il valore reale (X**2 + Y**2)**(1/2).
IAND (intero, intero) Una funzione che produce il LOGICAL
degli argomenti su una base del tipo bit per bit.
IBCLR (intero, posizione) Una funzione che ritorna il valore del
primo argomento con il bit specificato settato a 0. Il bit di ordine basso
e in posizione 0.
IBITS (intero, posizione di partenza, lunghezza ) Una fun-
zione che ritorna il valore del bit specificato dalla posizione di partenza
e dalla posizione finale. Il bit di ordine piu basso e in posizione 0.
IBSET (intero, posizione) Una funzione che ritorna il valore del
primo argomento con il bit specificato settato a 0. Il bit di ordine piu
basso e in posizione 0.
ICHAR (carattere) Una funzione che ritorna il valore ASCII
dell argomento. L argomento deve essere una espressione character
di lunghezza uno. Il risultato e un tipo di dato INTEGER*4.
IDATE ( mese, giorno, anno ) Una subroutine che ritorna i
tre valori rappresentanti la data corrente. Gli argomenti devono essere
definiti come interi o vettore di interi. Il mese e rappresentato con il
numero del mese (1 -12). Il giorno e rappresentato come il giorno del
mese. L anno e rappresentato dalle ultime due cifre dell anno.
IDIM (numero, numero) Una funzione che ritorna il valore del
primo argomento meno il minimo (MIN) dei due argomenti.
IDINT (numero) Una funzione che ritorna l intero piu grande il
cui valore assoluto non eccede il valore assoluto dell argomento e ha lo
stesso segno dell argomento. L argomento deve essere di tipo real * 8.

IDNINT ( numero reale) Una funzione che ritorna il valore


dell intero piu vicino al valore dell argomento. L argomento deve
essere di tipo real * 8.
IEOR (intero, intero) Una funzione che riporta un OR esclusivo
su argomenti di tipo bit per bit.
IFIX (real*4) Una funzione che converte un numero reale in un
intero

168
APPENDICE A. FUNZIONI INTRINSECHE

INDEX (stringa, sub-stringa ) Una funzione che cerca una strin-


ga per la sua prima comparsa di una sottostringa e ritorna la posizione
di partenza della sottostringa come un valore INTEGER*4.
INT (numero) Una funzione che ritorna il piu grande intero il
cui valore assoluto non eccede il valore assoluto dell argomento e ha
lo stesso segno dell argomento. La funzione ritorna un valore INTE-
GER*4 se il commando / I4 e in funzione; altrimenti ritorna un valore
INTEGER*2.
IOR (intero, intero) Una funzione che produce un OR logico
dell argomento sulla base di ragionamenti bit per bit.
IQINT (numero) Una funzione che ritorna l intero piu grande il
cui valore assoluto non eccede il valore assoluto dell argomento ed ha
lo stesso segno dell argomento. L argomento deve essere di tipo real
* 16.
ISIGN (valore, segno )Una funzione che assegna il segno del
secondo argomento al valore assoluto del primo.
LEN (carattere)Una funzione che ritorna il numero di caratteri
dell argomento. L argomento deve essere un espressione CHARAC-
TER. Il risultato e un valore INTEGER*4.
LGE (carattere, carattere )Una funzione che ritorna il valo-
re.true. se la prima stringa carattere e piu lunga o uguale alla seconda
stringa carattere. Gli argomenti devono essere del tipo CHARACTER
mentre il risultato e un valore LOGICAL*4.
LGT (carattere, carattere )Una funzione che ritorna il valo-
re.true. se la prima stringa carattere e maggiore della seconda stringa
carattere. Gli argomenti devono essere del tipo CHARACTER mentre
il risultato e un valore LOGICAL*4.
LLE (carattere, carattere )Una funzione che ritorna il valo-
re.true. se la prima stringa carattere e minore o uguale alla seconda
stringa carattere. Gli argomenti devono essere del tipo CHARACTER
mentre il risultato e un valore LOGICAL*4.
LLT (carattere, carattere )Una funzione che ritorna il valo-
re.true. se la prima stringa carattere e minore alla seconda stringa
carattere. Gli argomenti devono essere del tipo CHARACTER mentre
il risultato e un valore LOGICAL*4.
LOG (numero) Una funzione che ritorna il logaritmo naturale
(base e) dell argomento. L argomento deve essere maggiore di zero.

169
APPENDICE A. FUNZIONI INTRINSECHE

LOG10 (numero) Una funzione che ritorna il logaritmo comune


(base 10 ) dell argomento. L argomento deve essere maggiore di zero.

MAX (numero, numero,...) Una funzione che ritorna il maggiore


dei valori specificati nella lista degli argomenti.
MIN (numero, numero,...) Una funzione che ritorna il minore
dei valori specificati nella lista degli argomenti.
MOD (dividendo, divisore) Una funzione che divide il primo
argomento per il secondo e ritorna il resto.
NINT ( numero reale) Una funzione che ritorna il valore dell in-
tero piu vicino al valore dell argomento.
QEXT (numero)Una funzione che converte l argomento in un
valore REAL*16.
QFLOAT (intero) Una funzione che converte un valore intero in
un REAL*16.
RAN (seme ) Una funzione che ritorna un valore un numero
REAL*4 fra 0.0 (incluso) e 1.0 (escluso). L argomento deve essere
una variabile o elemento di vettore INTEGER*4. Per ottenere i risul-
tati migliori inizializzate con un valore grande e dispari per la prima
volta. Per generare sets differenti di valori random inizializzate il seme
ogni volta con un valore diverso.
REAL (numero) Una funzione che converte l argomento in un
valore real.
SIZEOF ( argomento ) La funzione ritorna il numero di bytes di
memoria usata dall argomento.
SECNDS ( numero reale) Una subroutine che ritorna il numero
di secondi da mezzanotte meno il valore dell argomento. L argomento
deve essere di tipo REAL*4. Il valore di ritorno e del tipo REAL*4. Il
tempo di ritorno e accurato a 1/100 di secondo.
SIGN (valore, segno ) Una funzione che assegna il segno del
secondo argomento al valore assoluto del primo.
SIN (numero) Una funzione che ritorna il seno dell argomento.
L argomento deve essere in radianti.
SIND (numero) Una funzione che ritorna il seno dell argomento.
L argomento deve essere in gradi.
SINH (numero) Una funzione che ritorna il seno iperbolico dell ar-
gomento che deve essere espresso in radianti.
SINHD (numero) Una funzione che ritorna il seno iperbolico
dell argomento che deve essere espresso in gradi.

170
APPENDICE A. FUNZIONI INTRINSECHE

SQRT (numero) Una funzione che ritorna la radice quadrata


dell argomento. Il risultato e il valore principale, con la parte reale
maggiore o uguale a zero. Se la parte reale e zero, il risultato e il valore
principale, con l immaginario maggiore o uguale a zero.
TAN ( numero reale) Una funzione che ritorna la tangente dell ar-
gomento. L argomento deve essere in radianti.
TAND ( numero reale) Una funzione che ritorna la tangente
dell argomento. L argomento deve essere in gradi.
TANH ( numero reale) Una funzione che ritorna la tangente iper-
bolica dell argomento. L argomento deve essere espresso in radianti.

TANHD ( numero reale) Una funzione che ritorna la tangente


iperbolica dell argomento. L argomento deve essere espresso in gradi.

TIME (tempo) Una subroutine che ritorna il tempo attuale in


formato ASCII 24-h. L argomento deve essere una variabile, vettori,
elemento di vettore o sottostringa di 8 bytes. Il tempo e formattato
come segue: hh:mm:ss.
ZEXT (intero) Una funzione che ritorna il valore dell argomento,
zero esteso.

171
APPENDICE A. FUNZIONI INTRINSECHE

172
Appendice B

Subroutine di interesse
comune

Riportiamo in questa appendice i listati delle subroutines adoperate piu


frequentemente nei programmi precedenti.

B.1 CLEANTOP
Questa subroutine pulisce lo schermo e porta il cursore a sinistra in alto
sui terminali.

subroutine cleantop
implicit real*4 (a-h,o-z)
c
c this program clears the screen , then changes the screen from
c dark to light
print *,char (27),[2J
c clear the screen
print *,char (27),[0;0H
c bring the cursor at the top left
c write (6,*)char(27),[?5h
c change the screen background to light
return
end

173
B.2. MAXMIN APPENDICE B. SUBROUTINE DI INTERESSE COMUNE

B.2 MAXMIN
Questa subroutine ritorna il massimo ( XXMAX) e il minimo ( XXMIN
) di un vettore XX di dimensioni IVEC.

subroutine maxmin (xx,ivec,xxmax,xxmin)


ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
c c
c this subroutine is producing a the max and the minimum of the c
c vector xx
c ivec :== vector dimension c
c c
ccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccccc
implicit real * 4 (a-h,o-z)
dimension xx(1:ivec)
xxmax = xx (1)
xxmin = xx (1)
do j = 1, ivec
if (xx(j).gt.xxmax) then
xxmax = xx(j)
end if
if (xx(j).lt.xxmin) then
xxmin = xx(j)
end if
end do
return
end

174
Appendice C

Sistema operativo UNIX

Si entra su una macchina UNIX tramite la comunicazione dilogin e Pas-


sword. Compiuta questa prima operazione comparira un prompt che
dipende dal sistema operativo usato. Se nel file .login inserite il coman-
do set prompt = % comparira il segno di percentuale ad accompa-
gnarvi nelle vostre avventure. Riportiamo adesso i comandi principali
che interessano a noi.

C.1 Alcuni comandi UNIX


% man nomecomando (C.1)
E molto importante per chi non ha tempo o voglia di leggersi i manuali
in quanto permette di vedere cosa corrisponde alla voce nomecomando.

% man k stringa (C.2)

Serve a cercare una particolare stringa inserita in un comando. La


schermata successiva visualizza il comando coinvolto e la posizione
contestuale della stringa.
% ls (C.3)
Questo comando riporta su schermo tutti i files.

% ls l (C.4)

Per vedere la loro grandezza ( numero di bytes ) e la data in cui furono


creati.

175
C.2. EDITOR APPENDICE C. SISTEMA OPERATIVO UNIX

% ls l a (C.5)
Serve a vedere i file nascosti (quelli che incominciano con punto tipo
.netscape , .csrhc, .login etc....).
% cat miof ile (C.6)
Permette un display del file indicato sul terminale adoperato.
% rm miof ile (C.7)
Cancella il file indicato; ricordiamo che in questo sistema operativo
esiste solo l ultima versione del file creato.
% mv vecchiof ile nuovof ile (C.8)
Cambia il nome del file indicato in quello nuovo.
% cp miof ile altrof ile (C.9)
Copia il file indicato in uno nuovo.
% exit (C.10)
Serve a chiudere la sessione interattiva.
< Ctrl/c > (C.11)
Serve ad interrompere il processo interattivo in corso e ritornare al
sistema operativo.

C.2 Editor
E il mezzo fondamentale per avere accesso ai files nuovi oppure a quelli
esistenti e ne abbiamo svariati. Ci limitiamo a quelli piu semplici che
sono stati anche testati
% joe miof ile (C.12)
Si puo accedere all help on line dell editor con il comando ( in editing
) < Ctrl + K + H >
% pico miof ile (C.13)
Questo e l editor che adotta la finestra del noto sistema di posta
elettronica che risponde al nome di PINE.

176
APPENDICE C. SISTEMA OPERATIVO
C.3. COMPILAZIONE+LINK/ESECUZIONE
UNIX

C.3 Compilazione+link/esecuzione
Per compilare ed eseguire un programma, ad esempio miofile.f, si danno
i seguenti due comandi:

% f 77 o miof ile.exe miof ile.f (C.14)

% ./miof ile.exe (C.15)

Che sono in ordine comando per la compilazione + link ed esecuzione.


Se invece vogliamo solamente controllare che il programma non
contenga eventuali errori di compilazione, diamo il comando

% f 77 g c miof ile.f . (C.16)

C.4 Shell Script


Spesso puo essere utile abbreviare una intera serie di comandi trami-
te un solo file dettoscript. Come esempio riportiamo uno script per
compilare ed eseguire un programma che chiameremocalcola.
calcola
#!/bin/sh
clear
echo Inserire nome del file
read nome
echo ho inserito
echo $nome
rm $nome.exe
echo la data e l ora sono:date
f77 -o $nome.exe $nome.for
./$nome.exe
Volendo adesso eseguire questo file di comandi dovremo prima cam-
biare le protezioni con il comandochmod u+x calcola e poi il coman-
do ./calcola. Cercate tramite il manuale di capire le varie operazioni
compiute da questa sequenza.

177
C.5. LE LIBRERIE APPENDICE C. SISTEMA OPERATIVO UNIX

C.5 Le librerie
Se volete crearvi una vostra libreria personale dovete prima trasformare
i file sorgente in file oggetto e poi collezionarli in un unica libreria.
Riportiamo uno script che genera una libreria chiamata mia lib.
f77 -c *.f
ar rcv libmia lib.a *.o
ranlib libmia lib.a
rm *.o
Controllate sulle pagine del manuale il significato delle varie opera-
zioni. Se avete il file della libreria potete linkare ad essa il programma
main con il seguente comando:
f77 main.f -L. -lmia lib

178
Appendice D

I caratteri ASCII

I sistemi collegati con i computers memorizzano i caratteri sotto serie


di bits, usualmente lunghi 7 bits oppure 8. Riportiamo di seguito la
sequenza dei 128 caratteri ASCII ( American Standard Code for In-
formation Interchange ) in notazione decimale. Ricordiamo che esiste
pure la rappresentazione ottale e quella esadecimale.

179
APPENDICE D. I CARATTERI ASCII

Tabella D.1: Tabella caratteri ASCII

NUL 0 DLE 16 SP 32 0 48 @ 64 P 80 96 p 112


SOH 1 DC1 17 ! 33 1 49 A 65 Q 81 a 97 q 113
ST X 2 DC2 18 34 2 50 B 66 R 82 b 98 r 114
ET X 3 DC3 19 # 35 3 51 C 67 S 83 c 99 s 115
EOT 4 DC4 20 $ 36 4 52 D 68 T 84 d 100 t 116
EN Q 5 N AK 21 % 37 5 53 E 69 U 85 e 101 u 117
ACK 6 SY N 22 & 38 6 54 F 70 V 86 f 102 v 118
BEL 7 ET B 23 0 39 7 55 G 71 W 87 g 103 w 119
BS 8 CAN 24 ( 40 8 56 H 72 X 88 h 104 x 120
HT 9 EM 25 ) 41 9 57 I 73 Y 89 i 105 y 121
LF 10 SU B 26 42 : 58 J 74 Z 90 j 106 z 122
VT 11 ESC 27 + 43 ; 59 K 75 [ 91 k 107 { 123
FF 12 FS 28 , 44 60 L 76 \ 92 l 108 | 124
CR 13 GS 29 45 = 61 M 77 ] 93 m 109 } 125
SO 14 RS 30 . 46 > 62 N 78 94 n 110 126
SI 15 US 31 47 ? 63 O 79 95 o 111 DEL 127

180
Bibliografia

[Ba 88] M.Barnsley,Fractals everywhere ,


prima edizione, Academic Press ,Inc. , Boston(1988).

[Do 83] R. Doretti,R. Farabone,Dal FORTRAN IV al FORTRAN 77


,
prima edizione, Gruppo Editoriale Jackson , Milano (1983).

[El 85] T.M.R. Ellis,Programmazione strutturata in FORTRAN 77 ,


prima edizione, Zanichelli , Bologna (1985).

[Ol 92] D. Oliver,Fractal Visions ,


prima edizione, SAMS PUBLISHING , Carmel (1992).

[OBS 92] Okabe,A. ,Boots,B.,Sugihara,K. ,


Spatial Tessellations Concepts and Applications of Voronoi Dia-
grams,
prima edizione, John Wiley & Sons , Chichester (1992).

[Or 86] A. Orsi Palamara ,Programmare in FORTRAN 77 ,


prima edizione, Levrotto e Bella , Torino (1986).

[PS88] H.O. Peitgen,S. Saupe,The Science of Fractal Image ,


prima edizione, Springer Verlag , Londra (1988).

[Pa 83] C. Page,FORTRAN 77 ,


prima edizione, Pitman Publishing LTD , Londra (1983).

[REC 92] Press W.H.,Teukolsky S.A., Vetterling W.T.,Flannery B.P.,


Numerical Recipes in Fortran,
seconda edizione, Cambridge University Press, Cambridge (1992).

181
BIBLIOGRAFIA BIBLIOGRAFIA

[PL 90] P. Prusinkiewicz, A. Lindenmayer, The Algorithmic Beauty


of Plants,
prima edizione, Springer Verlag, New York (1990).

[TF 92] Stauffer D., Aharony A., Introduction to Percolation Theory,


seconda edizione, Taylor & Francis , London (1992).

[Vi 92] T.vicsek, Fractal Growth Phenomena,


seconda edizione, Word scientific, Singapore (1992).

182
Indice analitico

A DIMENSION istruzione, 24
dimensione-vettori, 20
ACCEPT istruzione, 40
aggregazione-ballistica, 142 distribuzione
aggregazione-DLA, 133 esponenziale, 98
algoritmi-Montecarlo, 133 gaussiana, 99
argomenti-subroutine, 20 Student, 95
ASCII-caratteri, 179 DO istruzione, 31
assegnazioni, 27 DO-WHILE istruzione, 33
ASSIGN istruzione, 28 DOUBLE PRECISION variabi-
le, 7
B DOUBLE PRECISION istruzio-
ne, 5
BACKSPACE istruzione, 41

C E
CALL istruzione, 19 ELSE istruzione, 30
caratteri, 2 ELSEIF istruzione, 30
catene-Voronoi, 156 END DO istruzione, 32
CHARACTER variabile, 7, 8, 11 ENDFILE istruzione, 41
CHARACTER istruzione, 5 END istruzione, 5
CLOSE istruzione, 38 ENTRY istruzione, 21
colonne , 3 EQUIVALENCE istruzione, 25
commento, 4 espressioni, 9
COMMON istruzione, 24 Etichette, 5
COMPLEX variabile, 7 EXTERNAL istruzione, 25
COMPLEX istruzione, 5
concatenazione, 11 F
continuazione, 4 file, 36
CONTINUE istruzione, 33 fit
retta, 105
D format
DATA istruzione, 27 /, 44

183
INDICE ANALITICO INDICE ANALITICO

Aw, 44 ANINT, 165


BN, 44 ASIN, 166
BZ, 44 ASIND, 166
Dw.d , 43 ATAN, 166
Ew.d, 43 ATAN2, 166
Fw.d, 42 ATAN2D, 166
Gw.d , 43 ATAND, 166
IW, 42 BTEST, 166
KP, 44 CHAR, 166
Lw, 43 CMPLX, 167
nHc1..cn , 43 CONJG, 167
SP, 44 COS, 167
SS, 44 COSD, 167
stringa, 44 COSH, 167
Tln, 44 DATE, 167
Tn, 44 DBLE, 167
Trn, 44 DCMPLX, 167
FORMAT istruzione, 42 DFLOAT, 167
FORTRAN, 1 DIM, 167
FUNCTION istruzione, 16 DIMAG, 167
funzione DPROD, 167
beta incompleta, 93 DREAL, 167
coefficiente-binomiale, 87 EXP, 168
errori, 91 FLOAT, 168
fattoriale, 86 IABS, 168
gamma, 88 IAND, 168
gamma-incompleta, 88 IBCLR, 168
generatori-interi, 97 IBITS, 168
generatori-sistema, 95 IBSET, 168
numeri-random, 95 ICHAR, 168
p-chiquadro, 92 IDATE, 168
funzione intrinseca, 165 IDIM, 168
ABS, 165 IDINT, 168
ACOS, 165 IDNINT, 168
ACOSD, 165 IEOR, 168
AIMAG, 165 IFIX, 168
AINT, 165 INDEX, 169
AMAX0, 165 INT, 169
AMIN0, 165 IOR, 169

184
INDICE ANALITICO INDICE ANALITICO

IQINT, 169 IMPLICIT istruzione, 4


ISIGN, 169 INQUIRE istruzione, 39
LEN, 169 INTEGER istruzione, 5
LGE, 169 INTEGER variabile, 6
LGT, 169 INTRINSIC istruzione, 26
LLE, 169
LLT, 169
LOG, 169
L
locali, 4
LOG10, 170 LOGICAL variabile, 7
MAX, 170 LOGICAL istruzione, 5
MIN, 170
MOD, 170
NINT, 170
M
main, 14
QEXT, 170
mapping
QFLOAT, 170
Feigenbaum, 112
RAN, 170
Henon, 109
REAL, 170
Julia, 119
SECNDS, 170
regolabile, 120
SIGN, 170
memoria, 6
SIN, 170
momenti-campione, 101
SIND, 170
asimmetria, 102
SINH, 170
curtosi, 102
SINHD, 170
deviazione-assoluta, 101
SIZEOF, 170
deviazione-standard-empirica,
SQRT, 171
101
TAN, 171
valor-medio, 101
TAND, 171
varianza-empirica, 101
TANH, 171
TANHD, 171
TIME, 171 O
ZEXT, 171 OPEN istruzione, 37

G P
globali, 4 PARAMETER istruzione, 22
GO TO istruzione, 29 parole-chiave, 5
PAUSE istruzione, 34
I Percolazione, 148
IF istruzione, 30 PRINT istruzione, 40
IMPLICIT istruzione, 22 priorita-istruzioni, 15

185
INDICE ANALITICO INDICE ANALITICO

PROGRAM, 16 FAI-CLUSTER, 156


PROGRAMMA FAI-PUNTI, 151
CAVEN, 60 FEIGEN, 115
GAUSS, 74 FELCI, 125
PARABO, 50 FIT, 106
PENDO, 52 G05DYFZAN, 98
RETTA, 47 GAMMA, 85
testc2, 80 GAMMLN, 85
testt, 79 GAMMP, 89
GAMMQ, 89
R GASDEV, 100
READ istruzione, 39 GCF, 90
REAL istruzione, 5 GSER, 90
REAL variabile, 6 GX, 131
record, 35 HENON10, 112
relazioni, 12 MAKEPIANTA3, 129
relazioni-logiche, 13 MATRICE, 160
RETURN istruzione, 21 MAXMIN, 174
REWIND istruzione, 40 MOMENT, 102
RAN0, 97
S RETTA90, 163
SAVE istruzione, 26 SCRIVIDATI, 41
scheda, 3 TTTEST, 104
sottostringhe, 8 UNO, 118
STOP istruzione, 34 WO, 134
SUBROUTINE SUBROUTINE istruzione, 18
AVEVAR, 105
BA, 142 T
BETA, 88 test
BETACF, 94 medie, 103
BETAI, 93 tipi, 5
BICO, 87 TYPE istruzione, 40
CLEANTOP, 173
DUETUTTO, 119 U
ERF, 92 UNIX
ERFC, 92 cp, 176
EXPDEV, 99 exit, 176
FACTLN, 87 joe, 176
FACTRL, 86 ls, 175

186
INDICE ANALITICO INDICE ANALITICO

man, 175
mv, 176
rm, 176

V
vettori, 8

W
WRITE istruzione, 39

187