22
Università “Sapienza” Roma, a.a. 2008-2009 Appunti del corso di “Matematica Computazionale” prof.ssa Biancamaria della Vecchia La Simulazione Antonio Petrella 1159178 [email protected] 1

Appuntidelcorsodi “MatematicaComputazionale” prof.ssa …digilander.libero.it/b.dellavecchia/documents/simulazio... · 2009-10-15 · Capitolo 1 La Simulazione Lasimulazioneèunmodellocheconsentediprevedere,inmodoapprossimativo,

Embed Size (px)

Citation preview

Università “Sapienza” Roma, a.a. 2008-2009

Appunti del corso di “Matematica Computazionale”

prof.ssa Biancamaria della Vecchia

La Simulazione

Antonio Petrella 1159178 [email protected]

1

Indice

1 La Simulazione 31.1 Simulazione ad Agenti . . . . . . . . . . . . . . . . . . . . . . . . 3

1.1.1 Esempi . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4

2 Modello Preda-Predatore 62.1 Modello Lotka-Volterra . . . . . . . . . . . . . . . . . . . . . . . 6

2.1.1 Sistema con solo le prede . . . . . . . . . . . . . . . . . . 72.1.2 Sistema con solo i predatori . . . . . . . . . . . . . . . . . 72.1.3 Sistema di Lotka-Volterra . . . . . . . . . . . . . . . . . . 82.1.4 Soluzione mediante metodi numerici . . . . . . . . . . . . 9

2.1.4.1 Stima dei valori iniziali del sistema . . . . . . . . 102.1.4.2 Problemi del metodo di Eulero . . . . . . . . . . 11

2.2 Approccio ad Agenti . . . . . . . . . . . . . . . . . . . . . . . . . 112.2.1 Netlogo . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11

A Numeri nel Computer 17A.1 Rappresentazione in Virgola Mobile . . . . . . . . . . . . . . . . 18

A.1.1 Numeri in virgola mobile nel computer . . . . . . . . . . . 19A.2 Errori nella Macchina . . . . . . . . . . . . . . . . . . . . . . . . 21

2

Capitolo 1

La Simulazione

La simulazione è un modello che consente di prevedere, in modo approssimativo,l’evoluzione degli eventi. Si tratta di uno strumento che permette di stimare,ad esempio, l’evoluzione di una popolazione batterica oppure la diffusione diun’epidemia.

Esistono differenti approcci alla simulazione:

• approcci bottom-up: simulano a partire dagli attori del modello;

• approcci top-down: cercano di modellizzare la situazione da simulare nelcomplessivo, mediante l’utilizzo di mezzi matematici, quali, ad esempio,le equazioni differenziali;

• altri tipi di approcci, che possono essere sia ibridi, che una via di mezzotra i due visti sopra, un esempio è Game of Life.

Tali approcci non sono in competizione tra loro, ma vengono usati a secondadei casi.

1.1 Simulazione ad AgentiIl concetto è molto semplice: si definisce un insieme di agenti, si imposta unostato iniziale e si vede come si evolve il sistema nel tempo.

Il comportamento di un agente viene definito mediante delle regole, con uninsieme di regole molto semplice si possono ottenere simulazioni molto accurate.

Volendo formalizzare ogni singolo agente abbiamo le seguenti caratteristiche:

• è autonomo:

cioè è in grado di scegliere quale regola applicare ad ogni istante;

• è individuabile:

cioè distinguibile dagli altri agenti;

3

• ha una posizione;

• ha un obbiettivo;

• è flessibile:

deve essere in grado di adattarsi alle situazioni.

Con questo approccio alla simulazione non possiamo sapere come cambia l’esitodella stessa in relazione al cambiamento della situazione iniziale, di conseguenzaper trovare la soluzione migliore è necessario andare per tentativi, comunque irisultati sono spesso sorprendenti e imprevisti.

1.1.1 EsempiVediamo alcuni esempi di sistemi ad agenti.

Sistema Boid: Vogliamo simulare il comportamento di uno stormo di uccelli,quindi ogni volatile è un agente.

L’insieme di regole potrebbe essere ad esempio:

• ogni volatile cerca di dirigersi verso lo stormo (fig: 1.1a);

• ogni volatile cerca di evitare le zone troppo affollate (per evitare collissionicon gli altri uccelli) (fig: 1.1b);

• ogni volatile si muove nella stessa direzione di quello di fronte (fig: 1.1c);

(a) Ogni volatile cerca didirigersi verso lo stormo

(b) Ogni volatile cerca dievitare le zone affollate

(c) Ogni volatile si muovenella stessa direzione dellostormo

Figura 1.1: Le regole di un sistema Boid.

Utilizzando queste semplici regole e avviando la simulaizione, notiamo chegli agenti tendono a unirsi in gruppi, formando le classiche figure geometrichedegli stormi d’uccelli, tutto ciò senza definire un agente con il ruolo di capo oparticolari regole sulla forma del gruppo.

4

Traffico: Proviamo ora a simulare una strada, gli agenti in questione sono lesingole auto.

Le regole per ogni auto saranno:

• andare avanti;

• rallentare nel caso ci sia un ostacolo.

Avviando la simulazione notiamo che, anche con regole così semplici, è possibilegenerare del traffico.

Evaquazione: Supponiamo di costruire una stanza, vogliamo trovare unabuona disposizione per le uscite di sicurezza, di conseguenza vogliamo simularequante persone riescono ad uscire illese durante un’evaquazione.

In questo caso gli agenti sono le singole persone, un possibile insieme diregole è il seguente:

• vai verso l’uscita;

• fermati se c’è qualcuno davanti a te.

Possiamo supporre che una persona venga ferita se circondata da troppe persone.

(a)

(b)

Figura 1.2: Risultati nel caso dievaquazione senza ostacoli (a) ocon una colonna nel mezzo (b).

I risultati che la simulazione ha mostratosono i seguenti:

• con un’unica uscita di sicurezza il nu-mero di persone ferite è troppo elevato(fig: 1.2a);

• raddoppiando il numero d’uscite il nu-mero di persone che riescono ad usciredalla stanza illese è superiore al doppiorispetto al caso precedente;

• sorprendentemente, posizionando un pi-lastro di fronte all’uscita di sicurezza ilnumero di persone che riescono ad usci-re illese è ancora più elevato (fig: 1.2b),ciò è dovuto al fatto che le persone sonocostrette a procedere a velocità ridot-ta, a causa del’ostacolo, di conseguen-za fanno più attenzione e si riduce ilnumero di feriti.

5

Capitolo 2

Modello Preda-Predatore

Con questo modello si intende simulare un sistema molto semplice in cui inte-ragiscono tra loro due tipi di animali: le prede e i predatori (che mangiano leprede).

Esistono diversi scenari per questo modello:

• se non ci sono predatori, le prede si riproducono all’infinito;

• se non ci sono prede, i predatori muoiono di fame e si estinguono;

• se ci sono troppi predatori rispetto alle prede, quest’ultime si esginguono,perché vengono mangiate dai predatori;

• e così via.

Per simulare questo modello esistono diversi approcci:

• quello matematico (modello di Lotka-Volterra);

• quello ad agenti.

2.1 Modello Lotka-VolterraSi tratta di un sistema di equazioni differenziali proposto indipendentementedai matematici Alfred J. Lotka (nel 1925) e Vito Volterra (nel 1926).

La sua base è la seguente:

• abbiamo due specie: prede e predatori, che sono gli unici attori del sistema;

• i predatori muoiono, si riproducono e mangiano le prede;

• le prede si riproducono e muoiono solo se mangiate.

Indichiamo con P (t) la densità delle prede rispetto al tempo e con Q(t) quelladei predatori.

6

2.1.1 Sistema con solo le predeSappiamo che le prede si riproducono continuamente, l’unica cosa che può farlemorire sono i predatori.

Definiamo P (t) nel caso in cui non ci siano predatori:

dP (t)

dt= αP (t) (2.1)

dove α è un fattore positivo che indica la crescita delle prede.Notiamo che la 2.1 è un’equazione differenziale, questo perché ci interessa

studiare come aumenta, o diminuisce, la densità rispetto ai fattori della funzione,è proprio la derivata della densità che ci dà tale informazione1.

Figura 2.1: Grafico dell’equazione 2.2

Come funzione di densità sceglia-mo:

P (t) = P0 · eαt (2.2)

la cui derivata è:

dP (t)

dt= αP0 · eαt = αP (t)

di conseguenza la 2.2 è soluzionedell’equazione differenziale 2.1.

Osservazioni: Facendo un piccolostudio di funzione sulla 2.2, notiamoche è sempre crescente (fig: 2.1), ciòè coerente con l’assenza di predatori nel sistema, infatti ricordiamo che le predemuoiono solo se mangiate da predatori. P0 rappresenta il numero di prede altempo 0.

2.1.2 Sistema con solo i predatori

Figura 2.2: Grafico dell’equazione 2.4

L’equazione che determina Q(t) inquesto particolare caso è:

dQ(t)

dt= −βQ(t) (2.3)

dove −β è un fattore negativo cheindica il tasso di morte dei predatori.

Come nel caso della 2.1 si trat-ta di un’equazione differenziale, comefunzione scegliamo:

Q(t) = Q0 · e−βt (2.4)

1Presa una generica funzione f(x), se la derivata prima, df(x)d(x)

, è maggiore di 0, f(x) ècrescente, decrescente altrimenti.

7

la cui derivata risulta:

dQ(t)

dt= −βQ0 · e−βt = −βQ(t)

di conseguenza la 2.4 è soluzione della 2.3.

Osservazioni: L’andamento della 2.4 è decrescente (fig: 2.2), ciò è dovu-to al fatto che i predatori, senza le prede, non hanno nulla da mangiare, diconseguenza si estinguono. Q0 rappresenta il numero di predatori al tempo 0.

2.1.3 Sistema di Lotka-VolterraL’interazione tra prede e predatori è espressa dal sistema di Lotka-Volterra:

dP (t)dt = αP (t)− γP (t) ·Q(t)

dQ(t)dt = −βQ(t) + δP (t) ·Q(t)

(2.5)

dove:

• α e −β hanno lo stesso significato delle 2.1 e 2.3;

• −γ è un fattore negativo che indica come diminuiscono le prede in funzionedei predatori;

• δ è un fattore positivo che indica come crescono i predatori in funzionedelle prede.

La 2.5 è stata costruita partendo dalle 2.1 e 2.3, aggiungendo le parti checonsentono un’interazione tra le specie, è stato aggiunto infatti:

• un fattore negativo all’equazione delle prede, perché vengono mangiate daipredatori, quindi diminuiscono;

• un fattore positivo all’equazione dei predatori, perché mangiando le predesono in grado di riprodursi e quindi evitare l’estinzione.

L’andamento della 2.5 (fig: 2.3) è il seguente:

• il numero di prede cresce finché il numero di predatori è basso;

• il numero di predatori cresce col crescere delle prede (data l’abbondanzadi cibo);

• se i predatori sono troppi il numero di prede inizia a diminuire (vengonocacciate troppe prede);

• col diminuire delle prede anche i predatori diminuiscono (a causa dellascarsità di cibo);

8

Figura 2.3: Andamento del sistema di Lotka-Volterra

• nel momento in cui il numero di predatori è abbastanza basso il numerodi prede inizia a risalire;

• così via.

Nonostante sia semplice arrivare alla 2.5 non si conoscono soluzioni analitichead essa, quindi è necessario utilizzare metodi numerici per risolverla.

2.1.4 Soluzione mediante metodi numericiRicordiamo la definizione di derivata:

df(x)

dx= lim

∆x→0

f(x+ ∆x)− f(x)

∆x(2.6)

Vogliamo approssimare il valore di dP (t)dt , abbiamo:

• t0 = 0, t1 = ∆t, t2 = 2∆t, ecc...;

• poniamo Pk = P (tk) e Qk = Q(tk);

• per un tk generico, avremo:

αPk − γPk ·Qk =dPkdtk

=Pk+1 − Pk

∆t

9

• da cui:Pk+1 − Pk

∆t= αPk − γPk ·Qk

• quindi:Pk+1 = Pk + ∆t(αPk − γPk ·Qk)

Per approssimare dQ(t)dt si procede in modo del tutto analogo, ottenendo il

seguente sistema: Pk+1 = Pk + ∆t(αPk − γPk ·Qk)

Qk+1 = Qk + ∆t(−βQk + δPk ·Qk)

(2.7)

La 2.7 è una soluzione numerica per il sistema di Lotka-Volterra (2.5) utiliz-zando il metodo di Eulero.

Grazie al metodo di Eulero è possibile approssimare il comportamento diun’equazione differenziale conoscendo solo i valori iniziali (P0 e Q0) e ∆t. Uti-lizzare questo metodo equivale a calcolare la retta tangente alla funzione nelpunto tk.

2.1.4.1 Stima dei valori iniziali del sistema

Per quanto riguarda la soluzione numerica P0 e Q0 devono essere noti, t0 = 0,i valori di α, β, γ e δ vengono stimati tramite osservazioni in laboratorio e ∆tempiricamente.

Stima di α, β, γ e δ:

• per stimare β (α si stima in modo analogo), supponiamo di mettereun insieme di predatori in un ambiente controllato senza prede, questiinizieranno a morire;

• ricordando che Q(t) = Q0 · e−βt (2.4), nel momento in cui i predatoridiventano Q0

e , abbiamo t = 1β di conseguenza β = 1

t ;

• per quanto riguarda δ (analogamente γ), si introducono delle prede nel-l’ambiente dei predatori.

Si può procedere anche in modo inverso, una volta osservata la curva di unsistema si cercano i parametri che approssimano meglio tale curva.

Bisogna prestare una particolare attenzione per quanto riguarda la scelta di∆t, che deve essere piccolo, ma se è troppo piccolo il problema diventa trop-po lento da calcolare su un computer, se è troppo grande approssima male ilsistema.

10

2.1.4.2 Problemi del metodo di Eulero

Il metodo di Eulero approssima la funzione nell’intervallo [tk, tk+1) a una rettatangente alla curva nel punto tk, di conseguenza si commette un errore che siaccumula man mano che si va avanti, approssimando male il sistema.

Proviamo a risolvere la 2.5 calcolando la retta tangente a metà dell’intervallo[tk, tk+1):

Pk+1 = Pk + ∆t(α∼P − γ

∼P

∼Q)

Qk+1 = Qk + ∆t(−β∼Q+ δ

∼P

∼Q)

(2.8)

dove∼P e

∼Q sono così definite:

∼P = Pk + ∆t

2 (αPk − γPkQk)

∼Q = Qk + ∆t

2 (−βQk + δPkQk)

L’approccio della 2.8 è detto metodo di Runge-Kutta e offre un’approssima-zione migliore rispetto al metodo di Eulero.

2.2 Approccio ad AgentiIn una visione ad agenti del modello preda-predatore abbiamo uno spazio in cui“vivono” gli attori.

Definiamo le regole per le prede:

• possono muoversi liberamente;

• si moltiplicano;

• muoiono se mangiate o di vecchiaia.

Invece le regole per i predatori saranno:

• possono muoversi liberamente;

• mangiano le prede;

• si riproducono;

• muoiono di fame o di vecchiaia.

2.2.1 NetlogoUn ambiente molto potente per la programmazione di simulazioni ad agenti ènetlogo. Vediamo lo schizzo di un’implementazione del modello preda-predatorein questo linguaggio:

11

• Iniziamo col definire gli insiemi di prede (lepri) e predatori (linci), gliattori sono sottoinsiemi di “Turtle”, associando loro le proprietà: età perle prede, età e energia per i predatori (alg: 2.1);

• inizializziamo le prede (alg: 2.2);

• inizializziamo i predatori (alg: 2.3);

• definiamo le azioni da fare ad ogni passo, in modo da rispettare le regoledelle prede e dei predatori (alg: 2.4);

• definiamo le varie procedure ausiliari che definiscono:

– il movimento degli attori (alg: 2.5);

– la riproduzione delle prede (alg: 2.6);

– la riproduzione dei predatori (alg: 2.7);

– come i predatori mangiano (alg: 2.8).

Algorithm 2.1 Definizione delle prede e dei predatori

1. breed [lepri lepre]

2. breed [linci lince]

3. lepri-own [eta]

4. linci-own [eta energia]

12

Algorithm 2.2 Inizializzazione delle prede

1. set-default-shape lepri “rabbit”

2. create-lepri lepri-iniziali

3. [

4. set color white

5. set size 1.5

6. setxy random-xcor random-ycor

7. set eta 0

8. ]

Algorithm 2.3 Inizializzazione dei predatori

1. set-default-shape linci "cat"

2. create-linci linci-iniziali

3. [

4. set color brown

5. set size 1.5

6. setxy random-xcor random-ycor

7. set eta 0

8. set energia random (3 * energia-per-lepre-mangiata)

9. ]

13

Algorithm 2.4 Azioni da fare ad ogni passo

1. to go

2. if not any? turtles

3. [stop]

4. ask turtles

5. [fai-un-passo]

6. ask lepri

7. [

8. cerca-di-riprodurti-lep

9. set eta (eta + 1)

10. ]

11. ask linci

12. [

13. set energia (energia - 1)

14. cerca-di-mangiare

15. cerca-di-riprodurti-lin

16. set eta (eta + 1)

17. ]

18. ask lepri

19. [

20. if eta > max-eta-lepri

21. [die]

22. ]

23. ask linci

24. [

25. if eta > max-eta-linci

26. [die]

27. if energia < 1

28. [die]

29. ]

30. end

14

Algorithm 2.5 Procedura che definisce il movimento degli attori

1. to fai-un-passo

2. right random 50

3. left random 50

4. forward 1

5. end

Algorithm 2.6 Procedura che definisce come le prede si riproducono

1. to cerca-di-riprodurti-lep

2. if random-float 100 < lepri-rate

3. [

4. hatch-lepri 1

5. [

6. rt random-float 360

7. forward 1

8. set eta 0

9. ]

10. ]

11. end

15

Algorithm 2.7 Procedura che definisce come i predatori si riproducono

1. to cerca-di-riprodurti-lin

2. if energia > energia-per-riprodurre

3. [

4. rt random-float 360

5. hatch-linci 1

6. [

7. fd 1

8. set eta 0

9. set energia (energia / 2)

10. ]

11. set energia (energia / 2)

12. ]

13. end

Algorithm 2.8 Procedura che definisce come i predatori si nutrono

1. to cerca-di-mangiare

2. let prey one-of lepri-here

3. if prey != nobody

4. [

5. ask prey

6. [die]

7. set energia (energia + energia-per-lepre-mangiata)

8. ]

9. end

16

Appendice A

Numeri nel Computer

All’interno del computer qualunque informazione viene rappresentata tramitel’utilizzo di bit che possono avere come valore 0 o 1, i numeri non fanno eccezione.

Il modo più naturale per rappresentare i numeri è convertirli dal formatodecimale (quello a cui siamo abituati) al formato binario.

La conversione è molto semplice, dato un numero decimale x esso viene divisoper 2 finché è possibile, i resti delle varie divisioni, ordinati dall’ultimo ottenutoal primo, corrispondono alla codifica binaria del numero.

Supponiamo, ad esempio, di convertire 10 in binario (indichiamo con r ilresto della divisione):

• 102 = 5, r = 0;

• 52 = 2, r = 1;

• 22 = 1, r = 0;

• 12 = 0, r = 1.

Di conseguenza 10 espresso in binario sarà 1010.Altrettanto semplice è fare il passaggio inverso: se volessimo convertire il

numero x = xn−1xn−2...x2x1x0 composto da n cifre, sarà sufficente moltiplicareogni cifra xi per 2i e poi sommarle tra di loro, formalmente:

d =

n−1∑i=0

xi · 2i

dove:

• d è il mumero convertito in decimale;

• xi è l’i-esima cifra, con 0 ≤ i < n.

Se ad esempio volessimo convertire il numero 1010, da 4 cifre, in decimaleavremo:

0 · 20 + 1 · 21 + 0 · 22 + 1 · 23 = 0 · 1 + 1 · 2 + 0 · 4 + 1 · 8 = 10.

17

s︸︷︷︸ n︸ ︷︷ ︸1 31︸ ︷︷ ︸

32 bit

s︸︷︷︸ n︸ ︷︷ ︸1 63︸ ︷︷ ︸

64 bit

Figura A.1: Rappresentazione a 32 e a64bit, s è il segno, n è la codifica delnumero.

Osservazioni: All’interno del com-puter le parole sono composte da 32bit, quindi possiamo rappresentare almassimo 232 numeri, normalmente ilprimo bit è riservato per identifica-re il segno del numero (0 se positi-vo, 1 se negativo), quindi si posso-no rappresentare 231 numeri positivi ealtrettanti numeri negativi (fig: A.1).

Usando la rappresentazione conil segno il numero più grande chepossiamo ottenere è 231 − 1 =2.147.483.647, se abbiamo la necessitàdi rappresentare numeri più grandi sipossono usare 2 parole, in questo ca-so abbiamo 263 − 1 numeri possibili,sempre considerando un bit per il segno (fig: A.1).

La rappresentazione con 32 bit è detta singola precisione, mentre quella da64 bit è detta doppia precisione.

A.1 Rappresentazione in Virgola MobileEsiste un modo più compatto di rappresentare i numeri, rispetto a quanto vistofinora, ovvero scrivendo il numero in virgola mobile:

M ·Be (A.1)

dove:

• M è la mantissa;

• B è la base (sarà 10 se si tratta di un numero decimale, 2 se il numero èbinario, ecc);

• e è l’esponente.

Supponiamo di voler convertire un certo numero x = x1x2...xn, xn+1xn+2...xm,di base B e con m ≥ n, in virgola mobile:

• l’esponente sarà il numero di cifre della parte intera (quindi n);

• la base sarà B;

• la mantissa M sarà data da:

M =

m∑i=1

xi ·B−i

18

Supponiamo, ad esempio, di voler convertire il numero decimale 12345, 678 invirgola mobile:

• la parte intera è coposta da 5 cifre quindi l’esponente sarà 5;

• essendo decimale la sua base è 10;

• la mantissa è data da:

1 ·10−1 +2 ·10−2 +3 ·10−3 +4 ·10−4 +5 ·10−5 +6 ·10−6 +7 ·10−7 +8 ·10−8

0, 1 +0, 02 +0, 003 +0, 0004 +0, 00005 +0, 000006 +0, 0000007 +0, 00000008 =

0, 12345678

Questa rappresentazione è più compatta di quella classica, infatti se volessimorappresentare il numero 2.000.000.000.000.000 in virgola mobile avremo: 0, 2 ·1016.

A.1.1 Numeri in virgola mobile nel computer

s︸︷︷︸ q︸ ︷︷ ︸ p︸ ︷︷ ︸1 8 23︸ ︷︷ ︸

32 bit

s︸︷︷︸ q︸ ︷︷ ︸ p︸ ︷︷ ︸1 11 52︸ ︷︷ ︸

64 bit

Figura A.2: Numeri in virgola mobile persingola e doppia precisione, s é il segno, pè la mantissa e q è l’esponente.

All’interno della macchina la base peri numeri è 2, essendo rappresentati inbinario, e la parola viene suddivisa intre parti:

• un bit s per il segno;

• q bit per l’esponente;

• p bit per la mantissa.

Lo standard IEEE 754 definisce ilvaolre di q e p per i numeri in virgolamobileA.2:

• q = 8 bit e p = 23 bit per lasingola precisione;

• q = 11 bit e p = 52 bit per laprecisione doppia.

19

Osservazioni: Il bit s rappresenta il bit per il segno del numero rappresentatoin virgola mobile, il segno dell’esponente è rappresentato da un bit all’internodel campo q.

Vediamo quanti numeri possiamo rappresentare in questo modo e con qualeprecisione:

• precisione singola:

abbiamo q = 8 bit, considerando un bit per il segno, l’esponente massimoè 2(8−1) − 1 = 127, di conseguenza l’ordine del numero più grande chepossiamo rappresentare è dato da 2127, circa 1038 (un numero da 38 cifre).La massima precisione che possiamo dare alla mantissa è data da 2−p,quindi 2−23 ≈ 10−7;

• precisione doppia:

usando lo stesso ragionamento usato per la singola preisione, il massimoesponente è dato da 2q−1 − 1 = 211−1 − 1 = 1023, di conseguenza l’ordinedel numero più grande sarà 21023 ≈ 10308. La massima precisione dellamantissa sarà 2−p = 2−52 ≈ 10−16.

Si nota facilmente che in virgola mobile è possibile rappresentare numeri moltograndi rispetto alla rappresentazione classica.

La tabella A.1 mostra i casi in cui la mantissa ha il primo bit impostato a 1e i restanti a 0 (A), ha l’ultimo bit impostato a 1 e gli altri a 0 (B) e ha tutti ibit impostati a 1(C).

Combinando A e C, cioè fissando il primo bit a 1, abbiamo i seguentirisultati:

• se e = 0, possiamo rappresentare numeri da 12 a circa 1;

• se e = 1, i numeri vanno da 1 a circa 2;

• e = 2, da 2 a circa 4;

• e = 3, da 4 a circa 8;

• così via.

Combinando invece B e C, quindi fissando l’ultimo bit a 1, abbiamo:

• se e = 0, i numeri vanno da circa 0 a circa 1;

• se e = 1, da circa 0 a circa 2;

• se e = 2, da circa 0 a circa 4;

• se e = 3, da circa 0 a circa 8;

• così via.

20

e A : 2e · 2−1 = 2e−1 B : 2e · 2−p = 2−(p−e) C : 2e · (1− 2−p) = 2e · 2−(p−e)

0 2−1 = 12 2−p 1− 2−p

1 20 = 1 2−(p−1) 2− 2−(p−1)

2 21 = 2 2−(p−2) 4− 2−(p−2)

......

......

• A: rappresenta la situazione con una mantissa da p bit x1x2...xp in cuix1 = 1 e x2 = x3 = ... = xp = 0;

• B: rappresenta la situazione con una mantissa da p bit x1x2...xp in cuix1 = x2 = ... = xp−1 = 0 e xp = 1;

• C: rappresenta la situazione con una mantissa da p bit x1x2...xp in cuix1 = x2 = ... = xp = 1.

Tabella A.1: numeri nei casi in cui il primo, l’ultimo o tutti i bit della mantissa sonopari ad 1

Confrontando i due modi di combinare notiamo che usando A e C abbiamo unarappresentazione univoca dei numeri, cioè con esponenti diversi posso rappre-sentare solo numeri diversi, inoltre abbiamo che il primo bit è sempre pari a 1,di conseguenza si può omettere.

Usando A e C lo 0 viene rappresentato da un codice, dato che il numero piùpiccolo rappresentabile è 1

2 .

A.2 Errori nella MacchinaIl computer ha un limite ai numeri che può rappresentare, ciò comporta unerrore in alcuni calcoli.

Risolviamo la seguente addizione:

1, 0000000000000 +0, 0000000000100

è facile vedere che il risultato è 1, 0000000000100, ma se proviamo a fare lastessa operazione, usando un numero in virgola mobile in singola precisione1, ilrisultato sarebbe 1, perché i numeri vengono troncati alla settima cifra decimale.

Chiamiamo “zero macchina” (ε), un numero “piccolo” tale che:1 + ε > 1 se l′operazione e svolta da un umano

1 + ε = 1 se l′operazione e svolta da un computer

1secondo lo standard IEEE 754 la mantissa di un numero in singola precisione è di 2−23,circa 10−7.

21

In altre parole lo zero macchina è il numero più piccolo rappresentabile edipende dall’architettura dell’elaboratore.

In un algoritmo numerico l’errore commesso dovrebbe essere basso e nondovrebbe propagarsi durante l’esecuzione, in modo da dare dei risultati affidabili,in questo caso l’algoritmo si dice stabile.

Viceversa un algoritmo instabile produce dei risultati completamente inaffi-dabili, cioè potrebbero essere completamente discordanti dalla soluzione reale.

22