Professional Documents
Culture Documents
applicato
Lorenzo Zaninetti
zaninetti@ph.unito.it
Dipartimento di Fisica Generale
Edizione III
4 marzo 2015
ii
Introduzione
Questa guida cerca di combinare due esigenze molto sentite al secondo 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 esperienze 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 probabilit`a
e statistica scritte in FORTRAN-77 standard. In realt`a questa guida
pu`o essere anche utile agli studenti degli anni superiori e quindi dedichiamo 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 appendice B alcune subroutines di interesse comune, l appendice C introduce
alcuni cenni del sistema operativo UNIX, l appendice D riporta i caratteri 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 Alcuni libri . . . . . . . . . . .
1.2 Caratteri e linee . . . . . . . .
1.3 Lunghezza della linea . . . . .
1.4 Linea di commento . . . . . . .
1.5 Linea iniziale e di continuazione
1.6 Nomi simbolici . . . . . . . . .
1.7 Nomi locali e globali . . . . . .
1.8 Parole chiave . . . . . . . . . .
1.9 Etichette . . . . . . . . . . . .
1.10 Tipi di dati e costanti . . . . .
1.11 Unit`a di memoria . . . . . . .
1.12 Tipo INTEGER . . . . . . . .
1.13 Tipo REAL . . . . . . . . . . .
1.14 Tipo DOUBLE PRECISION .
1.15 Tipo COMPLEX . . . . . . . .
1.16 Tipo LOGICAL . . . . . . . . .
1.17 Tipo Character . . . . . . . . .
1.18 Vettori . . . . . . . . . . . . .
1.19 Sottostringa CHARACTER . .
1.20 Espressioni . . . . . . . . . . .
1.21 Espressioni aritmetiche . . . .
1.22 Espressioni costanti intere . . .
1.23 Espressioni CHARACTER . .
1.24 Espressioni di relazione . . . .
1.25 Espressioni logiche . . . . . . .
1.26 Struttura del programma . . .
v
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
1
2
2
3
3
3
5
5
5
6
6
6
6
7
7
8
8
8
8
9
9
10
11
11
12
13
14
INDICE
INDICE
1.27
1.28
1.29
1.30
1.31
1.32
1.33
1.34
1.35
1.36
1.37
1.38
1.39
1.40
1.41
1.42
1.43
1.44
1.45
1.46
1.47
1.48
1.49
1.50
1.51
1.52
1.53
1.54
1.55
1.56
1.57
1.58
1.59
1.60
1.61
1.62
1.63
1.64
1.65
Classi di istruzione . . . . . . . . .
Ordine delle istruzioni . . . . . . .
Sequenza di esecuzione . . . . . . .
Unit`a principale del programma .
Unit`a di programma FUNCTION
Funzioni di referenza . . . . . . . .
Funzioni istruzione . . . . . . . . .
Funzioni intrinseche . . . . . . . .
Sottoprogrammi SUBROUTINE .
Istruzione CALL . . . . . . . . . .
Argomenti della subroutine . . . .
Dimensione tramite PARAMETER
Dimensione tramite numeri . . . .
Dimensione tramite * . . . . . . .
Istruzione RETURN . . . . . . . .
Istruzione ENTRY . . . . . . . . .
Istruzioni di specificazione . . . . .
Istruzione IMPLICIT . . . . . . .
Istruzione PARAMETER . . . . .
Dichiarazioni dei vettori . . . . . .
Istruzioni tipologiche . . . . . . . .
Istruzione DIMENSION . . . . . .
Istruzione COMMON . . . . . . .
Istruzione EQUIVALENCE . . . .
Istruzione EXTERNAL . . . . . .
Istruzione INTRINSIC . . . . . . .
Istruzione SAVE . . . . . . . . . .
Istruzione DATA . . . . . . . . . .
Istruzioni di assegnazione . . . . .
Assegnazioni aritmetiche . . . . . .
Assegnazioni logiche . . . . . . . .
Assegnazioni CHARACTER . . . .
Istruzione ASSIGN . . . . . . . . .
Istruzioni di controllo . . . . . . .
Istruzione GO TO incondizionata .
Istruzione GO TO calcolata . . . .
Istruzione GO TO assegnata . . .
Blocco IF . . . . . . . . . . . . . .
Istruzione IF logica . . . . . . . .
vi
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
15
15
17
17
17
18
19
19
19
20
20
21
21
22
22
22
23
23
23
24
25
25
25
26
26
27
27
28
28
28
29
29
29
30
30
30
31
31
32
INDICE
1.66
1.67
1.68
1.69
1.70
1.71
1.72
1.73
1.74
1.75
1.76
1.77
1.78
1.79
1.80
1.81
1.82
1.83
1.84
1.85
1.86
1.87
INDICE
Istruzione IF aritmetica . . . .
Istruzione DO . . . . . . . . .
Istruzione DO-WHILE . . . . .
Istruzione CONTINUE . . . . .
Istruzione STOP . . . . . . . .
Istruzione PAUSE . . . . . . .
Istruzioni di INPUT/OUTPUT
Nozioni generali . . . . . . . .
Record . . . . . . . . . . . . .
File . . . . . . . . . . . . . . .
Accesso ai file . . . . . . . . . .
File interni . . . . . . . . . . .
Istruzione OPEN . . . . . . . .
Istruzione CLOSE . . . . . . . .
Istruzione INQUIRE . . . . . .
Istruzioni READ/WRITE . . .
Istruzione REWIND . . . . . .
Istruzione BACKSPACE . . . .
Istruzione ENDFILE . . . . . .
La specificazione FORMAT . .
Descrittori ripetibili . . . . . .
Descrittori non ripetibili . . . .
2 Il Laboratorio
2.1 RETTA .
2.2 PARABO
2.3 PENDO .
2.4 CAVEN .
2.5 GAUSS .
2.6 TESTT .
2.7 TESTC2 .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
3 Probabilit`
a e statistica
3.1 Gamma . . . . . . .
3.2 Fattoriale . . . . . .
3.3 Funzione beta . . . .
3.4 Gamma incompleta .
3.5 Funzione errori . . .
3.6 Distribuzioni . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
vii
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
32
32
33
34
35
35
35
36
36
37
37
38
38
39
40
40
41
42
42
43
43
45
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
47
47
50
52
60
74
79
80
.
.
.
.
.
.
85
85
86
88
88
91
92
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
INDICE
INDICE
3.6.1 Distribuzione del chiquadro . .
3.6.2 Distribuzione Beta incompleta .
3.6.3 Distribuzione di Student . . . .
3.7 Numeri random . . . . . . . . . . . . .
3.7.1 Generatori di sistema . . . . . .
3.7.2 Generatore Random - portatile
3.7.3 Generatore di interi . . . . . . .
3.7.4 Distribuzione esponenziale . . .
3.7.5 Distribuzione Gaussiana . . . .
3.8 Momenti . . . . . . . . . . . . . . . . .
3.9 Test di Student . . . . . . . . . . . . .
3.10 Fit con retta . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
92
93
95
95
95
96
97
98
99
101
103
105
4 I frattali
4.1 Henon mapping . . . . .
4.2 Feigenbaum mapping . .
4.3 Mandelbrot-set . . . . .
4.4 Implementazione dei set
4.5 Set di Julia e derivati . .
4.6 Le trasformazioni affini .
4.7 Il sistema L . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
109
. 109
. 112
. 115
. 116
. 120
. 120
. 128
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
A Funzioni intrinseche
135
135
144
150
158
167
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
177
. 177
. 178
. 179
. 179
INDICE
INDICE
181
ix
INDICE
INDICE
Capitolo 1
Il Fortran-77
Il linguaggio di programmazione FORTRAN, contrazione delle parole
FORmula
TRANslation, `e un linguaggio per la soluzione di problemi computazionali. A causa della sua somiglianza con il familiare linguaggio
aritmetico semplifica enormemente la preparazione dei problemi da sottoporre 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 American National Standards Institute (ANSI) nel 1966. Questa versione,
essendo la quarta dalla nascita del linguaggio, assunse il nome di FORTRAN IV. Il FORTRAN77 `e l ultima implementazione ufficiale del
FORTRAN-IV: commissionato all ANSI per migliorare il linguaggio
precedente e renderlo pi`
u 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 organizzati in una sequenza di istruzioni, chiamata normalmente codice
sorgente. Un codice sorgente scritto in FORTRAN pu`o essere eseguito
su qualunque computer possegga un compilatore, con poche o nessuna
modifica. Queste ultime dipendono dal fatto che diverse case costruttrici forniscono implementazioni al linguaggio legate alle possibilit`a 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
CAPITOLO 1. IL FORTRAN-77
Alcuni libri
1.2
Caratteri e linee
piu
meno
asterisco
spazio
eguale
/
(
barra (slash)
parentesi sinistra
parentesi destra
punto decimale
,
0
virgola
due punti
apostrof o
CAPITOLO 1. IL FORTRAN-77
<
>
$
simbolo corrente
1.3
1.4
Linea di commento
1.5
CAPITOLO 1. IL FORTRAN-77
1.6
Nomi simbolici
Si pu`o usare un nome simbolico per identificare entit`a FORTRAN come costanti, variabili, vettori, funzioni e subroutines, blocchi common
e unit`a di programma. Un nome simbolico `e formato da una a 6 lettere o numeri,con la condizione che il primo carattere sia una lettera.
In alcuni casi, come per esempio in UNIX, i nomi possono essere pi`
u
lunghi ma,di conseguenza, non sono trasportabili su tutti i sistemi. La
prima lettera determina il tipo di variabile ma questa regola pu`o 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
I nomi di tutte le unit`a di programma, punti di entrata e blocchi COMMON sono nomi globali, cio`e comuni a tutto il programma: per questo
motivo devono essere unici. Il nome di costanti, variabili, vettori e funzioni di istruzione sono locali, limitati all unit`a in uso, e quindi possono
essere adoperati per un altro scopo in un altra parte del programma.
Sovente, per`o, nome locale e globale devono essere differenti.
1.8
Parole chiave
Una parola chiave `e una sequenza di caratteri con un significato predefinito 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 per`o `e meglio
evitare i nomi delle istruzioni FORTRAN come nomi di variabili per
evitare errori di compilazione o di esecuzione.
5
1.9. ETICHETTE
1.9
CAPITOLO 1. IL FORTRAN-77
Etichette
1.10
Qualsiasi costante, variabile, vettore, espressione o funzione deve appartenere a uno di sei tipi di dati: INTEGER, REAL, DOUBLE PRECISION, COMPLEX, LOGICAL O CHARACTER. Il numero di tipi
pu`o 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.
1.11
Unit`
a di memoria
Ogni variabile o elemento di vettore di tipo INTEGER, REAL, DOUBLE PRECISION o LOGICAL occupa un unit`a di memoria numerica.
Qualsiasi variabile o elemento di vettore in DOUBLE PRECISION o
COMPLEX occupa due unit`a di memoria numerica. Ogni variabile
oppure elemento di vettore di tipo CHARACTER occupa un unit`a di
tipo CHARACTER. Il rapporto fra le due unit`a dipende dalla macchina
usata.
1.12
Tipo INTEGER
In una variabile INTEGER si memorizza un numero intero, che `e rappresentato esattamente nella macchina. Il range coperto dipende da
6
CAPITOLO 1. IL FORTRAN-77
da
da
32768 a 32768
2147483648 a 2147483648 .
In unit`a UNIX-FORTRAN una variabile integer*2 occupa 2 bytes mentre quella integer*4 ne occupa 4.
1.13
Tipo REAL
da 0.79E 38 a 1.78E + 38
real 8
+ 5E3 6.67E 18
1.14
+ 5D3 6.67D 18
1.15
CAPITOLO 1. IL FORTRAN-77
Tipo COMPLEX
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 memorizzazione e la manipolazione di testi. Ogni variabile CHARACTER pu`o
memorizzare una stringa completa di caratteri, ma la sua occupazione deve essere dichiarata all inizio del programma. In particolare in
UNIX-FORTRAN bisogna specificare il numero di caratteri e quindi di
bytes, per esempio
character 6
character 15
ERRORE 0
T ROP P I ELEM EN T I 0
1.18
Vettori
CAPITOLO 1. IL FORTRAN-77
1.19
Sottostringa CHARACTER
1.20
Espressioni
Essendo un linguaggio essenzialmente computazionale, un gran numero di istruzioni FORTRAN impiega espressioni. La valutazione di una
espressione d`a come risultato un singolo valore che pu`o essere usato
per definire una variabile, pu`o entrare in una decisione logica, pu`o essere scritto in un file, etc. La forma pi`
u semplice di una espressione
`e un valore scalare: una costante o una variabile singola. Espressioni
pi`
u complesse vengono spesso formate con operazioni che coinvolgono
uno o pi`
u operandi. Ci sono quattro tipi di espressioni disponibili in
FORTRAN 77: aritmetiche, CHARACTER, di relazione e logiche.
9
1.21
CAPITOLO 1. IL FORTRAN-77
Espressioni aritmetiche
sottrazione(negazione)
moltiplicazione
divisione
elevazione a potenza
1/(2.0 3)
1/8.0
0.125
1.22
2 ,
2 (3)
1/(2 3)
1/8
1.23
Espressioni CHARACTER
Una espressione CHARACTER produce un risultato di tipo CHARACTER 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 CHARACTER chiusa tra parentesi, il risultato di una funzione CHARACTER.
Esiste un unico operando CHARACTER denotato con // che permette
di concatenare due stringhe. Esempio:
A
ESEM P IO DI
P ROGRAM M A0
11
CAPITOLO 1. IL FORTRAN-77
0
SU BROU T IN E 0
A//B
ESEM P IO DI P ROGRAM M A0
A//C
ESEM P IO DI SU BROU T IN E 0
Invalide
La formula
1.24
Spiegazione
manca l apostrofo finale
la variabile CHARACTER deve
contenere almeno un carattere
Espressioni di relazione
.LT.
.LE.
minore di
minore di o uguale a
12
CAPITOLO 1. IL FORTRAN-77
.EQ.
.GT.
.GE.
maggiore di
maggiore di o uguale a
.N E.
non uguale a
1.25
Espressioni logiche
CAPITOLO 1. IL FORTRAN-77
L1
L2
.true. .true.
.true. .f alse.
.f alse. .true.
.f alse. .f alse.
.true.
.true.
.true.
.f alse.
.true.
.f alse.
.f alse.
.f alse.
6. operatori.EQV. e.NEQV.
1.26
14
CAPITOLO 1. IL FORTRAN-77
L1
L2
.true. .true.
.true. .f alse.
.f alse. .true.
.f alse. .f alse.
1.27
.f alse.
.true.
.true.
.f alse.
Classi di istruzione
1.28
Nella scrittura del codice sorgente devono essere rispettate alcune regole
di priorit`a con un certo ordine, vedi figura 1.2 .
PROGRAM NOME
Istruzioni di specificazione
........................
Istruzioni eseguibili
.......................
15
CAPITOLO 1. IL FORTRAN-77
+-------+--------------------------------------------------------+
|
|
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 priorit`a nelle istruzioni
STOP
END
CAPITOLO 1. IL FORTRAN-77
1.29
Sequenza di esecuzione
1.30
Unit`
a principale del programma
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
Unit`
a di programma FUNCTION
Una funzione ritorna un valore al punto, nell ambito di una espressione, in cui `e stata chiamata. Quest unit`a comincia con l istruzione FUNCTION e pu`o contenere qualsiasi altra istruzione eccetto che
PROGRAM, SUBROUTINE o blocco DATA. Abbiamo due possibilt`a
di definizione:
CAPITOLO 1. IL FORTRAN-77
inoltre bisogna essere estremamente prudenti nel modificare gli argomenti indicati nell istruzione COMMON. Come esempio riportiamo la
funzione MYSIN che calcola il seno del primo argomento con lo sviluppo in serie di Taylor e ritorna il numero dei termini dello sviluppo
necessari ad avere una precisione di 107 .
REAL P1
INTEGER P2
MYSIN = P1
DO 10 P2 = 1,100
RETURN
END
Bisogna fare attenzione a dichiarare la funzione chiamata nel programma principale; nel nostro caso dovremo mettere
REAL MYSIN
1.32
Funzioni di referenza
X = RAN (IGEN)
dove IGEN deve essere un intero grande meglio se dispari. Le funzioni intrinsiche non vanno dichiarate perch`e sono inserite nel compilatore.
Per maggiori dettagli vedere l appendice A sulle funzioni intrinsiche.
18
CAPITOLO 1. IL FORTRAN-77
1.33
Funzioni istruzione
Una istruzione di funzione pu`o essere usata per specificare una relazione
semplice ed `e usata in una sola unit`a. Ovviamente essa deve precedere
` definita tramite una via simile alle
qualsiasi istruzione di esecuzione. E
istruzioni di assegnazione:
LOGICAL DIGIT
CHARACTER CHAR
1.34
Funzioni intrinseche
Il FORTRAN contiene una quantit`a considerevole di funzioni incorporate, 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 necessit`a 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 rispetto all unit`a di programma che la chiama ed `e specificata in una unit`a
sottoprogramma. L istruzione SUBROUTINE seguita o meno dagli
argomenti `e l istruzione iniziale e in seguito si possono inserire tutte
le istruzioni eccetto che PROGRAM, FUNCTION o blocco DATA. La
forma pu`o essere:
SUBROUTINE snome
19
CAPITOLO 1. IL FORTRAN-77
1.36
Istruzione CALL
1.37
CAPITOLO 1. IL FORTRAN-77
1.38. DIMENSIONE TRAMITE PARAMETER
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 pi`
u a sinistra del parametro attuale. Particolare attenzione
va posta alle dimensioni dei vettori e possiamo avere tre tipi diversi di
configurazioni:
1.38
1.39
1.40
CAPITOLO 1. IL FORTRAN-77
Dimensione tramite *
DIMENSION A (1:*),B(0:*),C(-4:*)
Questo tipo di dichiarazione `e detto dichiarazione di vettore a dimensioni 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 COMMON abbiamo un associazione fra elementi corrispondenti; si abbia ad
esempio
COMMON C
e nell unit`a principale si abbiano le istruzioni seguenti:
COMMON S
1.41
Istruzione RETURN
RETURN
Pu`o anche essere chiamata all interno di un if /end if.
1.42
Istruzione ENTRY
CAPITOLO 1. IL FORTRAN-77
1.43
Istruzioni di specificazione
1.44
Istruzione IMPLICIT
Il tipo di dati delle variabili o vettori usati nel programma pu`o 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 pu`o
modificare questa situazione. Questo pu`o essere utile per poter utilizzare allo stesso tempo variabili in precisione semplice e in doppia nelle
stesse unit`a. Se usiamo il tipo CHARACTER deve essere specificata
anche la lunghezza con un *len. Esempi:
oppure
oppure
IMPLICIT CHARACTER * 80 ( B)
In questo ultimo esempio tutte le variabili saranno in semplice precisione eccetto che quelle inizianti con A ( precisione doppia ) e B (
variabile CHARACTER di lunghezza 80 ).
1.45
Istruzione PARAMETER
CAPITOLO 1. IL FORTRAN-77
modificarle: il compilatore segnalerebbe in questo caso qualcosa di anomalo. 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:
1.46
LOGICAL * 1 CUBO
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:
DIMENSION XX (*),YY(0:*)
24
CAPITOLO 1. IL FORTRAN-77
1.47
Istruzioni tipologiche
1.48
Istruzione DIMENSION
DIMENSION A1(D1),A2(D2).....
dove ogni An `e un vettore e Dn specifica la dimensione; a sua volta
Dn pu`o essere scomposto in limite superiore e inferiore.
1.49
Istruzione COMMON
CAPITOLO 1. IL FORTRAN-77
COMMON /ESAM/NUM,LIVELLO,ETA
In questo caso nel blocco COMMON /ESAM/ abbiamo 1 + 300 +
50 = 351 unit`a.
1.50
Istruzione EQUIVALENCE
EQUIVALENCE (nlista1),(nlista2)
Questo significa che la memorizzazione per tutti gli elementi della lista avviene con la stessa locazione di partenza. Gli elementi in
questione possono essere di tipo e lunghezza differente. Facciamo un
esempio:
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 comprensione e diventano veramente utili in sistemi composti da molte
subroutines tipo pacchetti grafici o matematici.
1.51
Istruzione EXTERNAL
CAPITOLO 1. IL FORTRAN-77
1.52
Istruzione INTRINSIC
INTRINSIC SINH,COSH
END
EXTERNAL FUNC
END
1.53
Istruzione SAVE
Il FORTRAN permette l allocazione in memoria sia dinamica che statica. Le variabili, i vettori e i blocchi COMMON dichiarati nell unit`a
MAIN, sono allocati staticamente e mantengono sempre la loro definizione. Le variabili, i vettori e i blocchi COMMON dichiarati solo in
sottoprogrammi vengono allocati dinamicamente al momento dell esecuzione del sottoprogramma. Quando questo esegue l istruzione RETURN o END, sono deallocati e perdono la loro definizione(e chiaramente il loro valore!). L istruzione SAVE permette di mantenere la definizione 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 sottunit`a. IN UNIX-FORTRAN questo avviene gi`a
anche senza l istruzione SAVE.
27
1.54
CAPITOLO 1. IL FORTRAN-77
Istruzione DATA
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)
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, usualmente 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
CAPITOLO 1. IL FORTRAN-77
1.57
Assegnazioni logiche
REAL*4 R(1:100)
LIMITE(J)=R(J).GE.RMIN.AND.R(J).LE.RMAX
1.58
Assegnazioni CHARACTER
1.59
Istruzione ASSIGN
ASSIGN S TO V
dove S `e un etichetta di un istruzione eseguibile o un istruzione
FORMAT presente nella stessa unit`a e V `e una variabile intera. La
variabile V pu`o essere poi adoperata nello stesso programma sia in
un istruzione GO TO sia come identificatore di FORMAT in un istruzione READ/ WRITE /PRINT. La variabile non pu`o ovviamente essere richiamata in altre espressioni aritmetiche a meno che non sia
riassegnata con un valore intero. Esempio:
29
CAPITOLO 1. IL FORTRAN-77
1.60
Istruzioni di controllo
Le istruzioni di controllo vengono utilizzate, in FORTRAN, per dirigere il flusso dell elaborazione: sono inclusi in questo tipo di istruzione
costrutti per il loop, diramazioni condizionate e incondizionate, strutture decisionali a scelta multipla e possibilit`a di pausa o interruzione
dell esecuzione di un programma. I trasferimenti di controllo in una
unit`a del programma si effettuano principalmente con l uso di istruzioni 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
GO TO S
dove S `e un etichetta di un istruzione eseguibile presente nella stessa
unit`a.
1.62
Istruzione GO TO calcolata
GO TO(s1,s2,....sn) espr
dove ogni sn `e un etichetta di un istruzione eseguibile presente nella
stessa unit`a ed espr `e un istruzione di tipo intero utilizzata per selezionare,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
30
GO TO(100,200,300,...100) MOD(KCONTA,5)+1
1.63
Istruzione GO TO assegnata
GO TO V
dove V `e la variabile intera cui `e stato assegnato l indirizzo di una
istruzione eseguibile etichettata.
1.64
Blocco IF
IF (LEXP1) THEN
BLOCCO1
BLOCCO2
ELSE
BLOCCO3
END IF
dove ogni LEXP `e un espressione logica e ogni blocco contiene istruzioni eseguibili (eccetto l END), compresi altri blocchi IF. Ogni blocco
di istruzioni che segue un IF / ELSEIF `e eseguito solo se la corrispondente 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 istruzioni ELSE ed ELSE IF possono essere omesse: l ultima in particolare
pu`o 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 unit`a.
31
1.65
CAPITOLO 1. IL FORTRAN-77
Istruzione IF logica
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:
1.66
Istruzione IF aritmetica
IF (ESPR)s1,s2,s3
dove ESPR `e un espressione INTEGER, REAL o DOUBLE PRECISION, 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
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:
32
CAPITOLO 1. IL FORTRAN-77
blocco istruzioni
55
continue
Il DO-LOOP consiste nel blocco di istruzioni eseguibili dall istruzione DO a quella con etichetta s inclusa. Il LOOP pu`o contenere
istruzioni CALL, funzioni di referenza e blocchi IF/ END IF come al` necessario per`o che ogni struttura, sia blocco IF che
tri blocchi DO. E
DO-LOOP, venga interamente contenuta nel range del DO-LOOP pi`
u
esterno. In alcune implementazioni, tipo UNIX-FORTRAN o MICROSOFT, `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 valore 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 verr`a eseguito.
4. se questo numero di istruzioni `e nullo, il controllo dell esecuzione 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 iterazioni `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 MICROSOFT e fornisce un metodo per il loop non necessariamente controllato
33
CAPITOLO 1. IL FORTRAN-77
[ DO s ] WHILE expr
dove s `e l istruzione etichettata eseguibile che definisce il range del loop: pu`o 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
Z=Z*Z+COMPLEX
NDIM=NDIM+1
END DO
IM = IM +1
END DO
END DO
1.69
Istruzione CONTINUE
L istruzione CONTINUE fornisce un punto di riferimento e, pratica` usato princimente, traferisce il controllo all istruzione seguente. E
palmente come fine del vecchio DO LOOP, ma pu`o comparire ovunque
nell unit`a di programma. Esempi:
GO TO 400
...........
34
CAPITOLO 1. IL FORTRAN-77
400 CONTINUE
DO 600 J=1,300
..................
600 CONTINUE
1.70
Istruzione STOP
STOP
oppure
STOP [disp]
dove [disp] rappresenta una variabile CHARACTER oppure un numero non pi`
u grande di 5 cifre. Questa variabile pu`o essere un messaggio
da visualizzare o un numero di riferimento per errori di esecuzione del
programma. Esempio:
1.71
Istruzione PAUSE
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
CAPITOLO 1. IL FORTRAN-77
che compiono operazioni ausiliarie. Tutte queste istruzioni fanno riferimento ad unit`a 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 unit`a logiche di
uscita o ingresso con il nome dei file.
1.73
Nozioni generali
In questo paragrafo verranno spiegati in generale i concetti che riguardano 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 chiamata RECORD. Un record pu`o essere un singolo carattere, una sequenza
di caratteri o di valori; pu`o 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 pu`o 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 pu`o
quindi essere illimitata. Il record di endfile `e l ultimo record di un file
e non ha lunghezza.
36
CAPITOLO 1. IL FORTRAN-77
1.75
1.75. FILE
File
1.76
Accesso ai file
CAPITOLO 1. IL FORTRAN-77
1.77
File interni
1.78
Istruzione OPEN
OPEN ( olista )
dove OLISTA `e una lista di argomenti ognuno separato da una
virgola:
UNIT= u Specifica il numero dell unit`a. 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 gi`a esistente, NEW se vogliamo 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
38
CAPITOLO 1. IL FORTRAN-77
$ ERR = 99 )
1.79
Istruzione CLOSE
Tutti i file e le unit`a sono chiuse automaticamente alla fine del programma. Una istruzione CLOSE esplicita pu`o servire per riassegnare
successivamente un file o una unit`a;
CLOSE ( lista )
dove lista `e una serie di argomenti scelti da:
UNIT = u specifica l unit`a
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 unit`a s.
Esempio:
1.80
CAPITOLO 1. IL FORTRAN-77
Istruzione INQUIRE
1.81
Istruzioni READ/WRITE
CAPITOLO 1. IL FORTRAN-77
Print fmt,list
L istruzione TYPE `e praticamente uguale al PRINT ma funziona solo per alcune implementazioni tipo UNIX-FORTRAN. Assume la
forma:
TYPE *,list
L istruzione ACCEPT trasferisce i dati dal terminale alla memoria interna; l accesso `e di tipo sequenziale. Anche questa istruzione
funziona solo in UNIX-FORTRAN. Riportiamo la forma pi`
u semplice:
ACCEPT *,list
Esempi:
WRITE (91,101)jx,jy,index(1),index(2)
WRITE (5,(A))TEXT
1.82
Istruzione REWIND
CAPITOLO 1. IL FORTRAN-77
Esempio:
REWIND ( UNIT = 3,ERR =120 )
1.83
Istruzione BACKSPACE
BACKSPACE u
dove u `e una variabile intera che specifica l unit`a logica interessata,
ad esempio un file su disco.
1.84
Istruzione ENDFILE
ENDFILE u
dove u `e una variabile intera che specifica l unit`a logica interessata.
Supponiamo adesso di volere aggiungere alcuni dati su un file gi`a esistente. 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 ENDFILE e finalmente chiudere il file. Come esempio pratico riportiamo
la SUBROUTINE SCRIVIDATI:
100
101
120
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
format (f10.4,f10.4,f10.4)
format (f10.4,i2)
INQUIRE(FILE=risultati.dat,EXIST=EXST )
IF (EXST) THEN
OPEN(iunit ,file=risultati.dat,type=old)
read
(iunit , 100,end=130 )zz, xx ,yy
42
CAPITOLO 1. IL FORTRAN-77
130
1.85
go to 120
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
La specificazione FORMAT
1.86
Descrittori ripetibili
CAPITOLO 1. IL FORTRAN-77
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]
CAPITOLO 1. IL FORTRAN-77
1.87
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)
45
21
22
22
22
22
CAPITOLO 1. IL FORTRAN-77
WRITE ( 5, 21 ) A, B, C
FORMAT(F3.0,1X,2(E12.4,1X))
WRITE ( 5, 22 ) A, B, C
FORMAT(F3.0,1X,E12.4,1X,D12.4)
A = 1.
B = 10.
C = 100.
D = 1000.
WRITE ( 5, 22 ) A, B, C, D
FORMAT(5G10.4)
WRITE ( 5, 22 ).TRUE.,.FALSE.
FORMAT(2L2)
WRITE ( 5, 22 ) BUONGIORNO
FORMAT(A6)
46
Capitolo 2
Il Laboratorio
Nei prossimi capitoli verranno illustrati alcuni programmi per l elaborazione dei dati ricavati dalle esperienze di laboratorio. Questi programmi sono stati sviluppati in ambiente MS-DOS usando il compilatore 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 statistici di interesse ed infine alla presentazione finale dei risultati da
istruzioni che appaiono di volta in volta sullo schermo video o grafico. 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 particolari. 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 semplicicit`a non contengono uscite grafiche.
2.1
RETTA
Questo programma illustra come, date due serie di datix ey e l errore 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:
x =
N
1 X
xi
N i=1
(2.1)
y =
N
1 X
yi
N i=1
(2.2)
2. deviazione standard:
sx =
v
u
u
t
N
1 X
(xi x)2
N 1 i=1
(2.3)
sy =
v
u
u
t
N
1 X
(yi y)2
N 1 i=1
(2.4)
(2.6)
error(a) =
v
u PN
2
u
i=1 (yi a bxi )
t
PN
2
(N 2)
i=1 (xi
x)
v
u PN
u
t i=1 (yi
a bxi )2 1
x2
[ + PN
]
(N 2)
N
)2
i=1 (xi x
(2.7)
(2.8)
PN
(xi
qP i=1
N
i=1 (xi
x)(yi y)
x)2
PN
i=1 (yi
(2.9)
y)2
6. Valore di 2
2
(a, b) =
N
X
i=1
48
(yi a bxi ) 2
)
i
(2.10)
CAPITOLO 2. IL LABORATORIO
2.1. RETTA
call attesa
print *,riportiamo anche il parametro q che indica la bonta
print *,del fit , vedi Numerical Recipes I/II
print *,N
==> numero di dati
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
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
2.2
PARABO
Questo programma viene utilizzato per l analisi dei dati dell esercitazione sulla bilancia di Cavendish (determinazione della costante di gravitazione mediante il metodo della parabola) oppure per l esercitazione
sulla rotaia ad aria (determinazione della accelerazione di gravit`a). 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
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 variabile 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 (tempo) per la prima serie di dati. Il programma valuta immediatamente
i coefficienti della curva parabolica y = a + b x + c x2 , mediante 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 sullintersezione 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
99
100
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
53
2.3. PENDO
150
151
199
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
continue
print *,Hai messo i dati nel file pendo2.dat
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
continue
54
CAPITOLO 2. IL LABORATORIO
200
299
300
333
2.3. PENDO
2.3. PENDO
334
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
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
100
190
2.4. CAVEN
200
205
206
207
210
2.4
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
continue
sq2 = 0.0
do 205 j= 1,inc
sq2 = sq2 + square ( j)
continue
do 206 j= 1,inc
inter (j) = nint ( square ( j) * (norma*1.0)/sq2)
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)
continue
end if
evalo = sqrt ( quadro)
do 210 i = 1 , inc
para (i) = work(i)
continue
return
end
CAVEN
CAPITOLO 2. IL LABORATORIO
2.4. CAVEN
+ Cost
(2.11)
(2.12)
M = (1.503 0.001) Kg
(2.13)
(2.14)
(2.15)
(2.16)
(2.17)
d r2
2M
dove =
(2.18)
2
T
(2.19)
C = |2 1 |
(2.20)
con
1 =
E1
l
(2.21)
2 =
E2
l
(2.22)
D=
1
(2.23)
r3
3
[(2d)2 + r2 ] 2
Viene inoltre calcolato l errore percentuale sul valore esatto della costante dato da
Errore = 100
|Gricavato Gvero |
Gvero
61
(2.24)
2.4. CAVEN
CAPITOLO 2. IL LABORATORIO
Viene calcolato poi l errore sulla costante G usando la legge di propagazione 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:
1000
100
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
format (A2)
format (a1)
print *,Programma per il calcolo statistico
print *,*************************************************
if ((prova.eq.N).or.(prova.eq.n)) then
print *,Avete messo i dati nel file caven.dat ?
print *, inserire
(Y/N )
!
CAPITOLO 2. IL LABORATORIO
150
199
200
2.4. CAVEN
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
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
continue
close ( unit = 90 )
a (1) = abs (
y (npt) - y (1))
a (2) = 500
63
2.4. CAVEN
CAPITOLO 2. IL LABORATORIO
210
CAPITOLO 2. IL LABORATORIO
2.4. CAVEN
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
CAPITOLO 2. IL LABORATORIO
500
501
do 500 j= 1, npt
if (x( j ).gt.tquar)
jvec = j -1
go to 501
end if
continue
continue
do 600 jj = 1 , nterm
lista ( jj ) = jj
continue
2.4. CAVEN
then
600
C LAVORO
print *,Metodo
dell accelerazione
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
100
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)
continue
quadro = 0.0
do 200 j = 1 ,inc
do 190 i = 1 , inc
para (i) = work(i)
69
2.4. CAVEN
190
200
205
206
210
C
C
C
CAPITOLO 2. IL LABORATORIO
continue
para (j)
= para(j) + epara(j)
call gtutto (cavmod,para,inc)
delta
= cavmod - vero
quadro
= quadro + delta *delta
square ( j )= delta * delta
continue
sq2 = 0.0
do 205 j= 1,inc
sq2 = sq2 + square ( j)
continue
do 206 j= 1,inc
inter (j) = nint ( square ( j) * 1000./sq2)
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
CAPITOLO 2. IL LABORATORIO
C
C
C
C
ed
a(1)
a(2)
a(4)
egran
el
er
ed
aa1
aa2
aa3
aa4
dd1
dd2
dd3
ages
d1
d2
beta
piu
cave
caves
return
end
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
2.4. CAVEN
para(4)
para(5)
para(6)
para(7)
para(1)
para(2)
para(3)
para(4)
pigrec **2
er
**2
ed
para(5) * 0.01
egran
para(6)
** 2
el
/ 100.
aa1 * aa2 * aa3 *aa4 /( dd1 * dd2 * dd3 )
1 + 4 * ( ed / er )**2
sqrt ( 1 + 4 * ( ed / er )**2 )
1 /( d1 * d2 )
beta * ages
ages + piu
ages
2.4. CAVEN
100
190
200
205
206
210
CAPITOLO 2. IL LABORATORIO
continue
quadro = 0.0
do 200 j = 1 ,inc
do 190 i = 1 , inc
para (i) = work(i)
continue
para (j) = para(j) + epara(j)
call gescur (cmod,caves,para,inc)
delta = cmod - vero
quadro
= quadro + delta *delta
square (j) = delta * delta
continue
sq2 = 0.0
do 205 j= 1,inc
sq2 = sq2 + square ( j)
continue
do 206 j= 1,inc
inter (j) = nint ( square ( j) * 1000./sq2)
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)
continue
return
end
SUBROUTINE fun2c(X,AFUNC,MA)
DIMENSION AFUNC(MA)
AFUNC(1)= 1.0
72
CAPITOLO 2. IL LABORATORIO
AFUNC(2)=
END
2.4. CAVEN
X**2.0
2.5. GAUSS
CAPITOLO 2. IL LABORATORIO
200
205
206
210
2.5
GAUSS
74
(2.25)
CAPITOLO 2. IL LABORATORIO
2.5. GAUSS
v
u
u
t
1
1 NX
yi (xi x)2
N 1 i=1
(2.26)
s3 =
yi (xi x)3
(N 1) s23
i=1
(2.27)
s4 =
yi (xi x)4
3
(N 1) s24
i=1
(2.28)
5. 2 :
2 =
N
1
X
i=1
(yi fi )2
fi
(2.29)
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
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
101
102
104
103
2.5. GAUSS
2.5. GAUSS
100
C
101
C
102
C
103
C
104
C
105
CAPITOLO 2. IL LABORATORIO
dimension x
(1:k)
dimension ifreq (1:k)
dimension y
(1:1000)
azzeramento variabili
xmean = 0.
s2
= 0.
s3
= 0.
s4
= 0.
n
= 0
calcolo della frequenza totale
do 100 i=1,k-1
n = n + ifreq (i)
continue
calcolo dei punti centrali
do 101 j=1,k-1
y(j) = ( x(j+1) + x (j) )/2.0
continue
calcolo del valor medio
do 102 j=1,k-1
xmean = xmean + y (j) * ifreq (j)
continue
xmean = xmean/ n
calcolo della deviazione standard
do 103 j=1,k-1
s2 = s2 + ((y(j) - xmean )**2) * ifreq (j)
continue
s2 = sqrt (s2/(n-1))
calcolo della asimmetria
do 104 j =1,k-1
s3 = s3 + ((y(j) - xmean )**3) * ifreq (j)
continue
s3 = s3 /((n-1)*( s2**3))
calcolo della curtosi
do 105 j=1,k-1
s4 = s4 + ((y(j) - xmean )**4) * ifreq (j)
continue
s4 = ( s4 /((n-1)*( s2**4))) - 3.
return
end
78
CAPITOLO 2. IL LABORATORIO
2.6
2.6. TESTT
TESTT
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
200
950
2.7
TESTC2
Questo programma sostituisce le tabelle della variabile 2 e usa la subroutine GAMMQ estratta dal libro [REC 92]. Riportiamo il listato del
programma TESTC2:
13
program
testc2
implicit real (a-h,o-z)
character
pausa
parameter ( c2max = 200 ,ndiv = c2max * 100 )
external gammq
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
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 *,
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
Probabilit`
a e statistica
Adesso cerchiamo di capire come sono scritte le varie subroutine che
abbiamo usato in maniera nascosta perch`e inserite nel link con le librerie
del libro [REC 92] che sono scritte in FORTRAN-77 standard.
3.1
Gamma
tz1 et dt .
(3.1)
Quando l argomento z `e un intero, la funzione gamma diventa il fattoriale dell argomento meno uno:
n! = (n + 1) .
(3.2)
3.2. FATTORIALE
11
3.2
` E STATISTICA
CAPITOLO 3. PROBABILITA
*-.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
continue
gammln=tmp+log(stp*ser/x)
return
END
Fattoriale
CU
11
FUNCTION factrl(n)
INTEGER n
REAL factrl
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)
continue
ntop=n
factrl=a(n+1)
else
86
` E STATISTICA
CAPITOLO 3. PROBABILITA
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!
=
k!(n k)!
k
0kn ,
(3.3)
CU
FUNCTION bico(n,k)
INTEGER k,n
REAL bico
USES factln
REAL factln
bico=nint(exp(factln(n)-factln(k)-factln(n-k)))
return
END
la quale adopera il logaritmo del fattoriale:
CU
FUNCTION factln(n)
INTEGER n
REAL factln
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
` E STATISTICA
CAPITOLO 3. PROBABILITA
factln=gammln(n+1.)
endif
return
END
3.3
Funzione beta
Passando dagli interi al continuo arriviamo alla funzione beta che cos`
definiamo
B(z, w) = B(w, z) =
Z 1
tz1 (1 t)w1 dt ,
(3.4)
(z)(w)
(z + w)
(3.5)
CU
3.4
FUNCTION beta(z,w)
REAL beta,w,z
USES gammln
REAL gammln
beta=exp(gammln(z)+gammln(w)-gammln(z+w))
return
END
Gamma incompleta
(a, x)
1 Z x a1 t
t e dt (a > 0) .
(a)
(a) 0
(3.6)
(3.7)
t e dt (a > 0) ,
Q(a, x) 1 P (a, x)
(a)
(a) x
(3.8)
ed ha i seguenti valori limiti
Q(a, 0) = 1 e Q(a, ) = 0 .
(3.9)
CU
CU
FUNCTION gammp(a,x)
REAL a,gammp,x
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
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
` E STATISTICA
3.4. GAMMA INCOMPLETACAPITOLO 3. PROBABILITA
gammq=gammcf
endif
return
END
L argomento gln `e dato tramite serie e procedura delle frazioni
continue:
CU
11
1
SUBROUTINE gser(gamser,a,x,gln)
INTEGER ITMAX
REAL a,gamser,gln,x,EPS
PARAMETER (ITMAX=100,EPS=3.e-7)
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
continue
pause a too large, ITMAX too small in gser
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
` E STATISTICA
CAPITOLO 3. PROBABILITA
CU
11
1
3.5
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
continue
pause a too large, ITMAX too small in gcf
gammcf=exp(-x+a*log(x)-gln)*h
return
END
Funzione errori
(3.10)
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) ,
2
91
(3.12)
3.6. DISTRIBUZIONI
` E STATISTICA
CAPITOLO 3. PROBABILITA
1
erf c(x) = Q( , x2 ) (x 0) .
2
Quindi otteniamo facilmente le FUNCTION ERF e ERFC
CU
CU
3.6
(3.13)
FUNCTION erf(x)
REAL erf,x
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
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
Distribuzioni
3.6.1
` E STATISTICA
CAPITOLO 3. PROBABILITA
3.6. DISTRIBUZIONI
3.6.2
2
=
2 2
2
=
2 2
2
gammp ( ,
2 2
2
gammq ( ,
.
2 2
(3.14)
(3.15)
Bx (a, b)
1 Z x a1
(3.17)
(3.18)
CU
FUNCTION betai(a,b,x)
REAL betai,a,b,x
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
` E STATISTICA
CAPITOLO 3. PROBABILITA
11
1
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
continue
pause a or b too big, or MAXIT too small in betacf
betacf=h
return
END
94
` E STATISTICA
CAPITOLO 3. PROBABILITA
3.6.3
Distribuzione di Student
B( 2 , 2 ) t
(3.19)
(3.20)
A(t|) = 1 I +t
2
1
,
2 2
(3.21)
3.7
Numeri random
3.7.1
Generatori di sistema
Quasi tutti i linguaggi di programmazione contengono una subroutine che con l indimenticabile nome RAN produce una serie di numeri
random:
x = ran (iseed) ,
(3.22)
95
` E STATISTICA
CAPITOLO 3. PROBABILITA
All inizio si fissa come primo passo un iseed molto grande e poi si
procede alle chiamate seguenti senza pi`
u modificare iseed. Cambiando
iseed si cambia la sequenza mentre chiamate successive con lo stesso
iseed producono sequenze uguali.
Bisogna per`o fare attenzione a questi generatori di sistema perch`e
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 ricorrenza si ripeter`a eventualmente con un periodo che non `e pi`
u grande
di m. Se m, a, c sono scelti in maniera appropriata allora il periodo
sar`a 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 , cosicch`e `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 correlazioni 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
pi`
u largo intero rappresentabile 232 . Cosicch`e ad esempio il numero
di piani sui quali triple di punti giacciono in uno spazio tridimensionale
`e usualmente non pi`
u grande della radice cubica di 232 , circa 1600.
3.7.2
(mod m) ,
(3.24)
(3.25)
` E STATISTICA
CAPITOLO 3. PROBABILITA
, q = [m/a] , r = m mod a ,
(3.26)
az mod m =
(3.27)
3.7.3
Generatore di interi
` E STATISTICA
CAPITOLO 3. PROBABILITA
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
if (g05dyfzan .gt. iupper ) stop errore g05dyfzan
return
end
3.7.4
Distribuzione esponenziale
Nella sezione precedente, abbiamo imparato a generare dei numeri random con una distribuzione di probabilit`a uniforme, cosicch`e la probabilit`a di generare un numero compreso fra x e x + dx, denotata con
p(x)dx, `e data da
p(x)dx =
(3.28)
p(x)dx = 1 .
(3.29)
Supponiamo adesso di generare una variabile uniforme x. La distribuzione di probabilit`a di y, denotata p(y)dy, `e determinata dalla legge
fondamentale per le trasformazioni di probabilit`a, che `e semplicemente
|p(y)dy| = |p(x)dx| ,
(3.30)
oppure
p(y) = p(x)|
98
dx
| .
dy
(3.31)
piccolo
grande
` E STATISTICA
CAPITOLO 3. PROBABILITA
dx
|dy = ey dy
dy
(3.32)
che `e distribuita esponenzialmente. Questa distribuzione occorre frequentemente nei problemi reali, ad esempio come tempo di attesa fra
eventi nei fenomeni governati dalla distribuzione di Poisson. Potete anche notare che la quantit`a y ha la distribuzione di probabilit`a ey . La
implementazione pratica avviene attraverso la FUNCTION EXPDEV.
CU
1
3.7.5
FUNCTION expdev(idum)
INTEGER idum
REAL expdev
USES ran1
REAL dum,ran1
dum=ran1(idum)
if(dum.eq.0.)goto 1
expdev=-log(dum)
return
END
Distribuzione Gaussiana
1 y2
p(y)dy = e 2 dy
2
99
(3.34)
` E STATISTICA
CAPITOLO 3. PROBABILITA
y2 =
2ln x1 cos(2x2 ) ,
(3.35)
2ln x1 sin(2x2 ) .
(3.36)
1 2
(y + y22 )] ,
2 1
y2
1
arctan
.
2
y1
Adesso il Jacobiano pu`o essere facilmente calcolato come:
x2 = exp
h 1
i h 1
i
(x1 , x2 )
2
2
=
ey1 /2
ey2 /2 .
(y1 , y2 )
2
2
(3.37)
(3.38)
(3.39)
Abbiamo il prodotto delle funzioni y1 e y2 e quindi y `e distribuita secondo 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 pu`o essere usato per x1 mentre l angolo che (v1 , v2 ) definisce rispetto all asse v1 pu`o servire come angolo
random 2x
`e ch`e seno e coseno possono essere scritti
2 . Il vantaggio
2
2
come v1 / R e v2 / R e quindi vengono eliminate le chiamate trigonometriche. L implementazione pratica di questo algoritmo avviene
attraverso la FUNCTION GASDEV.
CU
FUNCTION gasdev(idum)
INTEGER idum
REAL gasdev
USES ran1
INTEGER iset
REAL fac,gset,rsq,v1,v2,ran1
SAVE iset,gset
DATA iset/0/
if (iset.eq.0) then
v1=2.*ran1(idum)-1.
v2=2.*ran1(idum)-1.
100
` E STATISTICA
CAPITOLO 3. PROBABILITA
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
N
1 X
xj
N j=1
(3.40)
s = s2 .
(3.42)
(3.43)
` E STATISTICA
CAPITOLO 3. PROBABILITA
3.8. MOMENTI
N h
1 X
x j x i3
N j=1
s
(3.44)
N
N
i2 o
1 hX
1 nX
.
(xj x)2
(xj x)
N 1 j=1
N j=1
(3.46)
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 campione che abbiamo test`e definito sono implementati nella SUBROUTINE
MOMENT
11
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)
continue
ave=s/n
adev=0.
102
` E STATISTICA
CAPITOLO 3. PROBABILITA
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
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
12
3.9
Test di Student
Sovente ci troviamo di fronte due set di dati e vogliamo capire se appartengono o no alla stessa popolazione. Quando si pensa che due distribuzioni abbiano la stessa varianza empirica ma possibilmente medie
diverse la variabile t di Student `e calcolata in questa maniera
sP
sD =
iA (xi
xA )2 + iB (xi xB )2 1
1
+
,
NA + NB 2
NA NB
P
(3.47)
` E STATISTICA
CAPITOLO 3. PROBABILITA
xA xB
sD
(3.48)
CU
SUBROUTINE ttest(data1,n1,data2,n2,t,prob)
INTEGER n1,n2
REAL prob,t,data1(n1),data2(n2)
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
11
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)
continue
ave=ave/n
104
` E STATISTICA
CAPITOLO 3. PROBABILITA
12
3.10
var=0.0
ep=0.0
do 12 j=1,n
s=data(j)-ave
ep=ep+s
var=var+s*s
continue
var=(var-ep**2/n)/(n-1)
return
END
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 realt`a `e rappresentata dalla
funzione chi-quadro:
2 (a, b) =
N
X
yi
j=1
a bxi 2
si
(3.50)
Annullando le derivate prime rispetto ad a e b troviamo la condizione di minimo del chi-quadro. Pu`o essere utile introdurre le sequenti
sommatorie:
S
N
X
1
2
i=1 si
Sxx
Sx
i=1
N
X
x2i
i=1
N
X
xi
s2i
Sy
s2i
Sxy
N
X
yi
i=1
N
X
xi y i
i=1
s2i
(3.51)
s2i
(3.52)
(3.53)
Sy Sxx Sx Sxy
b=
S Sxy Sx Sy
105
(3.54)
` E STATISTICA
CAPITOLO 3. PROBABILITA
(3.55)
Una stima della bont`a del fit `e data dalla probabilit`a Q che il valore
del chi-quadro trovato sia casuale `e
Q = gammq (
N 2 2
, ) .
2
2
(3.56)
Ricordiamo che GAMMQ `e la nostra FUNCTION per la funzione gamma incompleta Q(a,x). Se q `e pi`
u grande di 0.1 il fit `e accettabile. Se
`e pi`
u grande di 0.001 il fit pu`o 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 sbagliati. 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 bont`a del fit. Se mwt = 0 allora q=1
CU
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)
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
` E STATISTICA
CAPITOLO 3. PROBABILITA
11
12
13
14
15
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
continue
else
do 12 i=1,ndata
sx=sx+x(i)
sy=sy+y(i)
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)
continue
else
do 14 i=1,ndata
t=x(i)-sxoss
st2=st2+t*t
b=b+t*y(i)
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
continue
q=1.
sigdat=sqrt(chi2/(ndata-2))
107
16
` E STATISTICA
CAPITOLO 3. PROBABILITA
siga=siga*sigdat
sigb=sigb*sigdat
else
do 16 i=1,ndata
chi2=chi2+((y(i)-a-b*x(i))/sig(i))**2
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 impressionante 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 programmazione
4. Uso di uno o pi`
u 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 studiando 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
CAPITOLO 4. I FRATTALI
Le curve di Henon non sono le classiche ellissi Newtoniane che gli astronomi 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)
(4.3)
dice che le orbite planetarie possono essere non periodiche ed estremamente sensitive anche alla pi`
u 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 eternit`a, gli attrattori strani offrono la possibilit`a 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
111
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 assumiamo essere x0 all inizio. La relazione ricorsiva gi`a adottata da Verhulst
`e:
xn+1 = 4xn (1 xn ) ,
(4.4)
dove `e un parametro di controllo che varia tra 0 ed 1. Questo mapping 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
113
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
(4.5)
CAPITOLO 4. I FRATTALI
4.4
(4.6)
CAPITOLO 4. I FRATTALI
(4.7)
CAPITOLO 4. I FRATTALI
118
CAPITOLO 4. I FRATTALI
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
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
119
CAPITOLO 4. I FRATTALI
return
end
4.5
Gli insiemi di Julia si ottengono dalla stessa relazione ricorsiva del set di
Mandelbrot e si tratta di selezionare dei punti alla frontiera del medesimo; questi punti dell altro set danno origine a successioni periodiche
dalle forme strane e bizzarre. I pixels sullo schermo del computer rappresentano ora i punti nel piano complesso per tutti i possibili valori
di z0 ed ogni insieme `e caratterizzato da un valore di c. Riportiamo 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,
che possiamo chiamare M2 , `e
zn+1 = zn3 + c ,
(4.8)
(4.9)
4.6
Le trasformazioni affini
Il metodo IFS ( Iterated Function System ) permette di produrre immagini di curve frattali, foglie, nuvole, etc...
Ricordiamo che una trasformazione affine wi `e data da
wi = [ xy ] = [ a bc d ] [ xy ]+[ ef ] = [ ax+ by+ ecx+ dy+ f ] .
(4.10)
120
CAPITOLO 4. I FRATTALI
121
CAPITOLO 4. I FRATTALI
122
CAPITOLO 4. I FRATTALI
123
CAPITOLO 4. I FRATTALI
p
0.01
0.85
0.07
0.07
i = 1, 2, ...n .
(4.11)
CAPITOLO 4. I FRATTALI
125
CAPITOLO 4. I FRATTALI
CAPITOLO 4. I FRATTALI
127
4.7. IL SISTEMA L
4.7
CAPITOLO 4. I FRATTALI
Il sistema L
CAPITOLO 4. I FRATTALI
4.7. IL SISTEMA L
129
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 )=]
130
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 SUBROUTINE 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)
131
4.7. IL SISTEMA L
CAPITOLO 4. I FRATTALI
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
133
4.7. IL SISTEMA L
CAPITOLO 4. I FRATTALI
134
Capitolo 5
Sistemi Monte Carlo
In questi ultimi anni abbiamo assistito ad un crescente numero di simulazioni di sistemi fisici mediante modelli al calcolatore. Il campo `e
enorme ed in continua evoluzione e ci limiteremo ad una scelta random di alcune topiche; ah non dimentichiamoci che il nome deriva dal
famoso casin`o...
5.1
DLA
Il nome prende le iniziali da Diffusion Limited Aggregation ed `e un tipico esempio di crescita/aggregazione che simula il comportamento di
colonie di batteri, esperimenti fra fluidi con viscosit`a diverse e scariche
elettriche nei gas. La superficie considerata viene identificata con un
lattice consistente in N N pixels. All inizio il nostro aggregato consiste 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.
135
5.1. DLA
137
5.1. DLA
5.1. DLA
------------------------lx_min,ly_min
4
lx_max,ly_min
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
139
5.1. DLA
5.1. DLA
adesso
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
c
c
c
c
c
c
c
c
-------------
ivicinox (1)
ivicinoy (1)
primo vicino
ivicinox (2)
140
=
=
ix
iy
- 1
ix
+ 1
(2)
iy
(3)
(3)
=
=
ix
iy
(4)
(4)
=
=
ix
iy
5.1. DLA
c
cc
c
c
ccc
c
- 1
if
if
c
ccc
c
+1
(ix.gt.mx_max) then
mx_max = ix
end if
(ix.lt.mx_min) then
mx_min = ix
end if
in x
(iy.gt.my_max) then
141
in y
5.1. DLA
if
c
ccc
c
iy
end if
(iy.lt.my_min) then
my_min = iy
end if
end if
end if
ridefinizione
if
((
go
elseif ((
go
elseif ((
go
elseif ((
go
mx_min -lx_min)
.eq. 1
to 200
lx_max - mx_max ) .eq. 1
to 200
ly_max - my_max ) .eq. 1
to 200
my_min -ly_min
) .eq. 1
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
c
c
ccccccc
c
kx_min=lx_min-k_dist
142
lancio
) then
) then
) then
) then
la frontiera
300
le frontiere
frontiera
frontiera
frontiera
frontiera
continue
end do
(.not.occupato ) then
go to 100
end if
go to 40
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
if
950
5.1. DLA
143
5.2
Aggregazione ballistica
145
146
then
= 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 )
147
ly_max
adesso
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
148
-------------
ivicinox
ivicinoy
c primo vicino
ivicinox
ivicinoy
c secondo vicino
ivicinox
ivicinoy
c terzo
vicino
c
cc
c
vicini
(1)
(1)
=
=
ix
iy
(2)
(2)
=
=
ix
iy
+ 1
(3)
(3)
=
=
ix
iy
- 1
- 1
c
149
5.3. PERCOLAZIONE
ccc
c
in y
(iy.gt.my_max) then
my_max =
ly_max =
iy
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
probabilit`a 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)
Ix = R1 [1, N ]
Iy = R2 [1, N ]
(5.2)
controllando ogni volta che il punto del lattice ( Ix , Iy ) non sia gi`a
occupato. Alla fine del processo avremo M punti occupati sul lattice (
N N ). Notiamo che quando P 0.59 `e possibile trovare un cammino
150
5.3. PERCOLAZIONE
50
5.3. PERCOLAZIONE
152
5.3. PERCOLAZIONE
5.3. PERCOLAZIONE
154
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
155
5.3. PERCOLAZIONE
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
156
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)
157
5.4
Catene di Voronoi
159
160
161
(5.3)
= n 137.5 r = c n ,
dove
1. n `e il numero di punti in senso crescente dal centro. Questo e
l inverso dell et`a 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 SUBROUTINE 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)
162
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
163
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
x = xc
+ deltamezzi
y = ymezzi + amprimo * ( x - xmezzi)
determinazione prima retta
ylower = yc - deltamezzi
yupper = yc + deltamezzi
if ((y.gt.ylower).and.(y.le.yupper))
uno=.true.
end if
x = xc
- deltamezzi
y = ymezzi + amprimo * ( x - xmezzi)
determinazione prima retta
if ((y.gt.ylower).and.(y.le.yupper))
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))
due=.true.
end if
y = yc - deltamezzi
x = (y-ymezzi)/amprimo + xmezzi
if ((x.gt.xlower).and.(x.le.xupper))
due=.true.
end if
if ((uno).or.(due)) then
yes = .true.
end if
return
end
166
then
then
then
then
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 argomento. 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 argomento 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 pi`
u grande 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 maggiore dei valori specificato nella lista degli argomenti.
AMIN0 (numero, numero,...) Una funzione che ritorna il minore dei valori specificati nella lista degli argomenti.
ANINT ( numero reale) Una funzione che ritorna il valore dell intero pi`
u vicino al valore dell argomento.
167
173
174
Appendice B
Subroutine di interesse
comune
Riportiamo in questa appendice i listati delle subroutines adoperate pi`
u
frequentemente nei programmi precedenti.
B.1
CLEANTOP
this program clears the screen , then changes the screen from
dark to light
print *,char (27),[2J
clear the screen
print *,char (27),[0;0H
bring the cursor at the top left
write (6,*)char(27),[?5h
change the screen background to light
return
end
175
B.2. MAXMIN
B.2
MAXMIN
176
Appendice C
Sistema operativo UNIX
Si entra su una macchina UNIX tramite la comunicazione dilogin e Password. Compiuta questa prima operazione comparir`a un prompt che
dipende dal sistema operativo usato. Se nel file .login inserite il comando set prompt = % comparir`a il segno di percentuale ad accompagnarvi nelle vostre avventure. Riportiamo adesso i comandi principali
che interessano a noi.
C.1
(C.1)
(C.2)
(C.4)
C.2. EDITOR
% 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)
(C.7)
(C.8)
(C.9)
(C.10)
(C.11)
C.2
Editor
C.3
Compilazione+link/esecuzione
(C.14)
% ./miof ile.exe
(C.15)
C.4
(C.16)
Shell Script
Spesso pu`o essere utile abbreviare una intera serie di comandi tramite 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 cambiare le protezioni con il comandochmod u+x calcola e poi il comando ./calcola. Cercate tramite il manuale di capire le varie operazioni
compiute da questa sequenza.
179
C.5. LE LIBRERIE
C.5
Le librerie
180
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 Information Interchange ) in notazione decimale. Ricordiamo che esiste
pure la rappresentazione ottale e quella esadecimale.
181
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
DLE
DC1
DC2
DC3
DC4
N AK
SY N
ET B
CAN
EM
SU B
ESC
FS
GS
RS
US
16 SP 32 0 48 @ 64 P
17 ! 33 1 49 A 65 Q
18
34 2 50 B 66 R
19 # 35 3 51 C 67 S
20 $ 36 4 52 D 68 T
21 % 37 5 53 E 69 U
22 & 38 6 54 F 70 V
23 0 39 7 55 G 71 W
24 ( 40 8 56 H 72 X
25 ) 41 9 57 I 73 Y
26 42 : 58 J 74 Z
27 + 43 ; 59 K 75 [
28 , 44 60 L 76 \
29 45 = 61 M 77 ]
30 . 46 > 62 N 78
31
47 ? 63 O 79
182
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
a
b
c
d
e
f
g
h
i
j
k
l
m
n
o
96
p
97
q
98
r
99
s
100
t
101
u
102
v
103
w
104
x
105
y
106
z
107
{
108
|
109
}
110
111 DEL
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
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 Diagrams,
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).
183
BIBLIOGRAFIA
BIBLIOGRAFIA
184
Indice analitico
A
BACKSPACE istruzione, 41
DIMENSION istruzione, 24
dimensione-vettori, 20
distribuzione
esponenziale, 98
gaussiana, 99
Student, 95
DO istruzione, 31
DO-WHILE istruzione, 33
DOUBLE PRECISION variabile,
7
DOUBLE PRECISION istruzione,
5
ACCEPT istruzione, 40
aggregazione-ballistica, 142
aggregazione-DLA, 133
algoritmi-Montecarlo, 133
argomenti-subroutine, 20
ASCII-caratteri, 179
assegnazioni, 27
ASSIGN istruzione, 28
B
CALL istruzione, 19
caratteri, 2
catene-Voronoi, 156
CHARACTER variabile, 7, 8, 11
CHARACTER istruzione, 5
CLOSE istruzione, 38
colonne , 3
commento, 4
COMMON istruzione, 24
COMPLEX variabile, 7
COMPLEX istruzione, 5
concatenazione, 11
continuazione, 4
CONTINUE istruzione, 33
D
DATA istruzione, 27
ELSE istruzione, 30
ELSEIF istruzione, 30
END DO istruzione, 32
ENDFILE istruzione, 41
END istruzione, 5
ENTRY istruzione, 21
EQUIVALENCE istruzione, 25
espressioni, 9
Etichette, 5
EXTERNAL istruzione, 25
F
file, 36
fit
retta, 105
format
/, 44
185
INDICE ANALITICO
INDICE ANALITICO
Aw, 44
BN, 44
BZ, 44
Dw.d , 43
Ew.d, 43
Fw.d, 42
Gw.d , 43
IW, 42
KP, 44
Lw, 43
nHc1..cn , 43
SP, 44
SS, 44
stringa, 44
Tln, 44
Tn, 44
Trn, 44
FORMAT istruzione, 42
FORTRAN, 1
FUNCTION istruzione, 16
funzione
beta incompleta, 93
coefficiente-binomiale, 87
errori, 91
fattoriale, 86
gamma, 88
gamma-incompleta, 88
generatori-interi, 97
generatori-sistema, 95
numeri-random, 95
p-chiquadro, 92
funzione intrinseca, 165
ABS, 165
ACOS, 165
ACOSD, 165
AIMAG, 165
AINT, 165
AMAX0, 165
AMIN0, 165
186
ANINT, 165
ASIN, 166
ASIND, 166
ATAN, 166
ATAN2, 166
ATAN2D, 166
ATAND, 166
BTEST, 166
CHAR, 166
CMPLX, 167
CONJG, 167
COS, 167
COSD, 167
COSH, 167
DATE, 167
DBLE, 167
DCMPLX, 167
DFLOAT, 167
DIM, 167
DIMAG, 167
DPROD, 167
DREAL, 167
EXP, 168
FLOAT, 168
IABS, 168
IAND, 168
IBCLR, 168
IBITS, 168
IBSET, 168
ICHAR, 168
IDATE, 168
IDIM, 168
IDINT, 168
IDNINT, 168
IEOR, 168
IFIX, 168
INDEX, 169
INT, 169
IOR, 169
INDICE ANALITICO
IQINT, 169
ISIGN, 169
LEN, 169
LGE, 169
LGT, 169
LLE, 169
LLT, 169
LOG, 169
LOG10, 170
MAX, 170
MIN, 170
MOD, 170
NINT, 170
QEXT, 170
QFLOAT, 170
RAN, 170
REAL, 170
SECNDS, 170
SIGN, 170
SIN, 170
SIND, 170
SINH, 170
SINHD, 170
SIZEOF, 170
SQRT, 171
TAN, 171
TAND, 171
TANH, 171
TANHD, 171
TIME, 171
ZEXT, 171
G
globali, 4
GO TO istruzione, 29
I
IF istruzione, 30
IMPLICIT istruzione, 22
INDICE ANALITICO
IMPLICIT istruzione, 4
INQUIRE istruzione, 39
INTEGER istruzione, 5
INTEGER variabile, 6
INTRINSIC istruzione, 26
L
locali, 4
LOGICAL variabile, 7
LOGICAL istruzione, 5
M
main, 14
mapping
Feigenbaum, 112
Henon, 109
Julia, 119
regolabile, 120
memoria, 6
momenti-campione, 101
asimmetria, 102
curtosi, 102
deviazione-assoluta, 101
deviazione-standard-empirica, 101
valor-medio, 101
varianza-empirica, 101
O
OPEN istruzione, 37
P
PARAMETER istruzione, 22
parole-chiave, 5
PAUSE istruzione, 34
Percolazione, 148
PRINT istruzione, 40
priorita-istruzioni, 15
PROGRAM, 16
187
INDICE ANALITICO
INDICE ANALITICO
FAI-PUNTI, 151
FEIGEN, 115
FELCI, 126
FIT, 106
G05DYFZAN, 98
GAMMA, 85
GAMMLN, 85
GAMMP, 89
GAMMQ, 89
GASDEV, 100
GCF, 90
GSER, 90
GX, 132
HENON10, 112
MAKEPIANTA3, 130
MATRICE, 160
MAXMIN, 174
MOMENT, 102
RAN0, 97
RETTA90, 163
SCRIVIDATI, 41
TTTEST, 104
UNO, 118
WO, 134
SUBROUTINE istruzione, 18
PROGRAMMA
CAVEN, 60
GAUSS, 74
PARABO, 50
PENDO, 52
RETTA, 47
testc2, 80
testt, 79
R
READ istruzione, 39
REAL istruzione, 5
REAL variabile, 6
record, 35
relazioni, 12
relazioni-logiche, 13
RETURN istruzione, 21
REWIND istruzione, 40
S
SAVE istruzione, 26
scheda, 3
sottostringhe, 8
STOP istruzione, 34
SUBROUTINE
AVEVAR, 105
BA, 142
BETA, 88
BETACF, 94
BETAI, 93
BICO, 87
CLEANTOP, 173
DUETUTTO, 119
ERF, 92
ERFC, 92
EXPDEV, 99
FACTLN, 87
FACTRL, 86
FAI-CLUSTER, 156
T
test
medie, 103
tipi, 5
TYPE istruzione, 40
U
UNIX
cp, 176
exit, 176
joe, 176
ls, 175
man, 175
188
INDICE ANALITICO
INDICE ANALITICO
mv, 176
rm, 176
V
vettori, 8
W
WRITE istruzione, 39
189