Una "particella" in moto nell'atmosfera, trascinata alla deriva dal vento medio, e spostata dalle fluttuazioni turbolente

Modelli a particelle: basi prima delle basi

Patrizia Favaron

Modelli a particelle?

Di quanti modelli di dispersione esistano, e di una possibile classificazione, avevo già scritto… Avevamo visto, così, più o meno a cosa servono i modelli di dispersione, e come li si potrebbe classificare.

E, forse, mi ero lasciata sfuggire una frase circa la grande efficacia e modernità dei “modelli a particelle”.

Sì, ma che cosa sono? Come funzionano? E perché sono così “efficaci”?

Ne vedremo, in un altro articolo.

In questo, invece, vedremo alcuni aspetti “propedeutici” (🫣 mi scusate la parolaccia?)

Ma prometto: saranno cose divertenti.

E per parte mia farò il possibile per farmi perdonare d’essere una matematica: userò parole, e non formule…

Un fatto, comunque, mi sembra piuttosto certo: gli famiglia di modelli porta con sé un linguaggio, un insieme di presupposti fisici o matematici (o tutti e due). Anche, una koiné di utenti affezionati, sviluppatori appassionati, investigatori acutissimi e geniali. Questo vale anche nel caso dei modelli a particelle, e nel loro caso il “linguaggio” ha molto il sapore dei processi casuali (qualcuno, qualcuna li chiama anche “processi stocastici“, ma che dire, le parole semplici mi piacciono di più – soprattutto a parità di significato).

Camminate (deterministiche… 😇) nel continuo

(Che belli, i giochi “Dai, facciamo finta che…” cui tanto tempo dedicavo da bambina… 😍 Mi piacevano proprio tanto, e, complici i miei due anni in più e la conseguente maggiore stazza, mi era facile reclutare il mio fratellino, che a dirla tutta non sembrava altrettanto interessato alla cosa. Probabilmente, però, nonostante i pochi anni passati sono ancora una bimba, perché i giochi facciamofintache restano ben presenti nella mia vita, e i processi casuali sono certamente tra questi.)

(Ecco.)

Facciamo finta di prendere un punto, vincolato ad una retta di lunghezza infinita.

Facciamo anche finta che il punto si possa spostare lungo questa retta senza incontrare attriti.

Ora, supponiamo che al tempo iniziale (che chiameremo “istante zero”) il nostro punto occupi la posizione iniziale di coordinata 0, che chiameremo “origine”.

E qui comincia il bello. O, più esattamente, il ballo: all’istante 0, il punto ubico un primo spostamento, che lo porta nel punto di coordinata x1. Poi, al tempo t1, subisce un nuovo spostamento che lo porta nella posizione x2. Al tempo t2 ne subirà un terzo, che lo porterà in x3. E via così, sin che la noia non ci suggerisca di smettere.

Come avvengono tutti questi spostamenti? In effetti non lo ho detto. In effetti potrebbero essere di ogni tipo.

Per esempio, ogni spostamento potrebbe avere entità +1, e nel caso le posizioni successive {x0=0, x1, x2, …, xn} sono facilissime da prevedere:

{0, 1, 2, …, n}

Oppure, gli spostamenti potrebbero essere tutti uguali a -1.

Od anche, lo spostamento all’istante i-esimo potrebbe essere uguale al doppio dello spostamento al passo precedente, con il primo spostamento uguale ad 1. Nel caso, per la cronaca la successione delle posizioni è

{0, 1, 3, 7, 13, …}

Successioni come queste sono puramente deterministiche: esiste una regola che, data una posizione, ci permette di prevedere esattamente la posizione successiva. E di più: questa regola, magari complicatissima, ammette come “dati di ingresso” soltanto la posizione al passaggio precedente, ed il numero del passaggio. Situazione, questa, piuttosto comune: tanto da meritarsi un nome, camminata (deterministica) nel continuo.

Il fatto che una successione di posizioni (di punti sulla retta) sia deterministica non ne fa qualcosa di poco interessante – e difatti alcune successioni sono a dir poco famosissime: per esempio, quella formata dai Numeri di Fibonacci,

{1, 1, 2, 3, 5, 8, …}

în cui ogni elemento si ottiene come somma dei due che lo precedono. Possiamo scriverla come una “camminata nel continuo”, nel senso che ho detto? Sì, anche se a livello estetico la definizione in termini di “somma dei due valori che precedono” è molto più bella da vedere – comunque, vediamola lo stesso:

F(n) = (1.61803…^n – 0.61803…^3) / 0.23606…

dove 0.23606… è la radice quadrata di 5, 1.61803 la “sezione aurea”, cara ai pittori del Rinascimento, e 0.61803… la sua “coniugata” (i numeri di Fibonacci, e la storia delle loro apparizioni spesso misteriose nella Natura, sono protagonisti di un bellissimo libro, Livio M, 2017, La sezione aurea. Storia di un numero e di un mistero che dura da tremila anni, Biblioteca Universale Rizzoli). Quanto allo strano accento “^”, l’ho usato (in mancanza di meglio su questi schermi) per indicare l’elevamento a potenza intera: x^n = x * x * x * … * x (n volte).

Insomma, già pescando tra le camminate deterministiche nel continuo si trova davvero di tutto, molto spesso interessante (ricordo, anche, e con affetto, il corso di Matematica combinatoria del geniale professor Michele Sce, intorno al 1986 a Matematica a Milano, in occasione del quale ci introdusse a numerosi altri “numeri magici” della Matematica, tra i quali i Numeri di Bernoulli cari ad Ada Lovelace, per dire solo un caso – ma sarebbero troppi, per parlarne qui.

Anche perché le successioni deterministiche non sono state, che io sappia, molto usate per rappresentare i fenomeni di diffusione, e quindi la dispersione.

Per arrivare a questi dobbiamo fare un passo piccolo piccolo, ma, come vedremo, dalle conseguenze (letteralmente!) esplosive.

La Camminata a Caso nel Continuo

Ecco: abbiamo introdotto le camminate deterministiche nel continuo, ed abbiamo veduto come le possiamo scrivere come

Valore “adesso” = Valore “prima” + Spostamento “adesso”

oppure

Valore “adesso” = Regola “per adesso”

Ora concentreremo l’attenzione sulla prima di queste due forme (che mi ricorda molto più da vicino il concetto di “camminata” come successione di passi). E già che ci siamo, introduciamo un poco di convenzioni per facilitare il racconto.

Intanto, con “x(t)” intendiamo la posizione del punto all’istante “t” rispetto al sistema di coordinate che immaginiamo di imporre sulla retta (lineare).

E adesso, l’ipotesi:

x(t + dt) = x(t) + S

dove con “dt” ho indicato un breve intervallo di tempo (non necessariamente infinitesimo!), e con “S” la novità: uno scostamento casuale, cioè, una variabile casuale di cui immaginiamo di conoscere la distribuzione statistica, di tipo “continuo” (con “spazio di prova” costituito dall’insieme dei numeri reali).

Questa formula descrive una camminata a caso nel continuo, ed è un caso particolare di processo casuale (o processo stocastico, per chi ama le parole difficili).

Va da sé che indicando distribuzioni diverse per “S” otteniamo altrettanti modelli di camminate a caso nel continuo.

Un possibile problema è che di distribuzioni statistiche che possiamo affibbiare ad “S” ce n’è, letteralmente, un’infinità: troppa grazia?

Per vedere qualcosa dobbiamo sceglierne una, e per cominciare prenderemo la più semplice di tutte: una distribuzione normale con media nulla e deviazione standard assegnata (e diversa da zero, sennò, che razza di processo casuale sarebbe?)

Prima di procedere, però, una domanda: ma che cos’è, in pratica, una variabile casuale?

Qui potrei tentare di dirlo usando la definizione che si trova in tutti i testi di teoria della probabilità, ma preferisco una via più intuitiva, anche se meno rigorosa: possiamo immaginare una variabile casuale come una specie di oracolo, dotato di un bottone. Ogni volta che premiamo il bottone l’oracolo ci restituisce un numero. Se ripetiamo l’esperimento molte volte, e facciamo un istogramma con i numeri via via restituiti dalla variabile casuale, otteniamo una figura che ben rappresenta la distribuzione statistica che soggiace alla variabile casuale.

A dirla tutta, il computer (o smartphone) con cui state leggendo questo articolo ci regala già un modello di questo oracolo, il “generatore di numeri casuali”.

Un modello concreto di variabile casuale: il “generatore di numeri casuali”

Di solito peniamo ai computer come ad oggetti concepiti in nome dell’Esattezza. Che quando fanno i conti non sbagliano mai.

Questo modo di vedere ha ispirato persino l’arte (mi viene in mente HAL 9000 in 2001, a space odyssey di Kubrick, che affermava (negando ogni evidenza) di essere del tutto immune agli errori.

Ma per quanto l’idea di oggetti artificiali che possano compensare con la loro precisione assoluta la nostra imperfezione sia molto attraente, le cose non stanno proprio così – per esempio, l’aritmetica “in virgola mobile” dei computer è approssimata, non esatta, argomento del (bellissimo) corso di Analisi Numerica che ai miei tempi era esame obbligatorio nel curriculum di Matematica Applicata.

E non solo i computer non sono macchine così esatte come le vogliamo immaginare: ci sono un’infinità di campi nei quali è proprio l’inesattezza la ragione di interesse. Tanto per fare un esempio, la Matematica Attuariale (quella, per intenderci, usata dalle assicurazioni: lì sono le probabilità, ad interessare).

In questi “casi d’uso”, molto spesso era necessario simulare variabili casuali, e per farlo furono inventati dispositivi davvero ingegnosi.

I primi “generatori di numeri casuali” si basavano su fenomeni fisici intrinsecamente casuali, come contatori Geiger che, interrogati, restituivano il conteggio degli ultimi decadimenti rilevati da una sorgente radioattiva (quanto a questa, non c’era ai tempi alcun problema a procurarsela: già le impurezze nella ceramica che avvolgeva i primi chip erano ottime, anche se involontarie, sorgenti alfa…). Vi lascio immaginare il costo e l’ingombro.

Poi qualcuno si ricordò che i computer non sono per loro natura proprio macchine fatte, e sfruttò la cosa a vantaggio della comunità, inventando metodi puramente numerici. Il più semplice, e sino a qualche tempo fa popolare, tra questi metodi era il “generatore lineare congruenziale”, che sfruttava due fatti:

  • I computer hanno una “lunghezza di parola” (il numero di celle di memoria usato per rappresentare un numero) finita.
  • E I numeri interi che sono in grado di rappresentare sono limitati in intervallo da quella lunghezza lì.

Per esempio: ai “miei tempi”, i computer più avanzati su cui mi era accaduto di mettere le mani (il MicroVAX II, ed il VAX 8250) avevano una lunghezza di parola di 32 bit, ed erano capaci di rappresentare numeri interi tra -2147483648 e +2147483647 quando la notazione “in complemento a due“. Il mio primo “personal computer”, un clone (italiano!) dell’Apple II, aveva una lunghezza di parola di 8 bit, con intervallo rappresentabile direttamente tra -128 e 127. Ed i computer che usavamo nell’Istituto di Ecologia del Dipartimento di Biologia di allora, degli Olivetti M20, avevano una lunghezza di parola di 16 bit, con intervallo -16384..+16387.

Cosa accade quando sommiamo due numeri positivi? Se questi sono abbastanza piccoli da stare in una singola parola, tutto bene: vengono sommati, e chiusa lì. Il risultato è esatto.

Ma che accade, se tentiamo di sommare due valori grandi? Per esempio, 100 e 101 su una macchina a 8 bit? Il risultato esatto sarebbe 201, ma per rappresentare questo valore servirebbero nove bit, che nella parola non ci stanno! In casi come questo, l’unità centrale di elaborazione (il “microprocessore”, diremmo oggi) non si scompone: tronca il risultato agli 8 bit più bassi, ed alza un bit di “overflow” nella sua parola di stato. Chi scrive il programma, che certamente sa questa cosa (🤭), legge il bit di overflow e, se lo trova alto, prende tutte le misure del caso. I pomeriggi in cui la mitica Signora Zauli, l’esercitatrice (splendida) del corso di Teoria e Applicazione delle Macchine Calcolatrici tentava di spiegarci come, usando in modo astuto il bit di overflow, si potesse emulare un’aritmetica intera a precisione arbitraria, e…

Ma torniamo ai nostri casi brutali. Quello che ho detto si può anche dire, in matematiche, affermando che i computer eseguono operazioni aritmetiche intere modulo N, dove N dipende dalla lunghezza di parola. E l’aritmetica modulare è un modo perfetto per generare numeri a caso. 😊

(In Matematica, si dice che un intero k è “congruo ad m modulo N” se m è il resto della divisione intera di k per N. Facciamo le cose facili, e consideriamo solo i numeri positivi. Prendiamo una parola di 8 bit, che rappresenta numeri positivi tra 0 e 255: nel caso, N=256 (ed in effetti tutti i possibili resti della divisione di un intero positivo per 256 sono i numeri 0, 1, 2, …, 255.

Ora, scegliamoci un numero intero che stia nella parola di 8 bit, per esempio 137, ed eleggiamolo a “fattore magico”, dopo averlo chiamato M. E adesso, consideriamo la regola

k-adesso = (k-prima * M) modulo N

dove il simbolo “*” rappresenta la moltiplicazione tra numeri interi. Prendiamo un valore di k iniziale, diciamo 13. Applichiamo la regola una volta. Per prima cosa facciamo la moltiplicazione:

13 * M = 13 * 137 = 1781

Poi dividiamo per 256 e teniamo il resto:

1781/256 = 6 con resto 245

Adesso prendiamo il valore che abbiamo ottenuto, ed applichiamogli la stessa regola: otteniamo 29.

Poi 133.

Poi… I primi otto valori della sequenza sono

{13, 245, 29, 133, 45, 21, 61, 165}

E qui possiamo già intuire, grazie ai nostri stessi occhi, un elemento interessante: i valori della sequenza sono piuttosto imprevedibili.

Certo, tutta questa prevedibilità dipende dalla nostra scelta del valore iniziale: se partissimo da 0, otterremmo invece

{0, 0, 0, 0, 0, 0, 0, 0}

Dipende anche dalla scelta astuta (o no) del “fattore magico” M: qui vediamo che razza di sequenza otteniamo con il valore iniziale 1, e con M = 2:

{1, 2, 4, 8, 16, 32, 64, 128}

Ma, appunto, M si può scegliere in maniera astuta. E le cose vanno ancora meglio con lunghezze di parola grandi, come 32, o 64 bit.

Scegliendo bene il fattore magico e il valore iniziale si ottengono non solo sequenze “imprevedibili”, ma, apparentemente, casuali.

E tutto questo, grazie al fatto che nell’aritmetica intera in un certo senso i computer sbagliano – ma con molto metodo! 😊

(Oggi. Già “ai miei tempi” potevano benissimo sbagliare-e-basta. Ricordate la storia della ceramica dei chip come sorgente involontaria di raggi alfa? E che questa proprietà indesiderata poteva anche essere usata per costruire generatori di numeri casuali? Esagerando un po’ con le impurità? Purtroppo lo stesso fenomeno aveva effetti anche sul contenuto delle memorie: magari in una cella scrivevi un 3, e poi, per quanto la probabilità fosse piuttosto bassa, qualche minuto, od ora, dopo ci trovavi 2: uno dei bit del numero aveva cambiato stato, a causa di una particella alfa che aveva impattato “esattamente lì”. E infatti, anni fa le memorie disponevano di un sistema di controllo “di parità”, che aveva proprio lo scopo di individuare cambiamenti avvenuti in un bit della memoria – quando il computer ne rilevava uno di solito di bloccava, e dovevi riavviarlo: meglio così, piuttosto che fare operazioni giuste-su-numeri-sbagliati, con chissà quali conseguenza. Altri tempi… Oggi, con la ceramica sostituita da plastica, e le tecniche di manifattura dei chip migliorate drasticamente, i problemi da decadimento alfa sono un ricordo del passato, e le memorie hanno perduto il controllo di parità. Il che vuol dire che, capitasse un cambio casuale di stato di un bit… 🤭)

(Altri tempi sì! Oggi ci poniamo il problema del grande sbilancio di genere nelle discipline STEM, dominate dai maschietti. Un tempo, almeno per quanto riguarda la matematica applicata, avevamo il problema contrario: le femmine erano molte più dei maschi. E le programmatrici erano comuni: molti dei trucchi che uso oggi mi sono stati insegnati da una di loro 😍.)

Ma torniamo ai numeri casuali generati con il metodo lineare congruenziale. Se ci pensiamo un attimo, vediamo che la loro sequenza può sembrare casuale solo se è “corta”: prima o poi deve ripetersi! Prendiamo il caso della parola a 8 bit: i numeri rappresentabili vanno da 0 a 255; lo 0, come abbiamo visto, possiamo escluderlo: da sempre luogo a sequenze identicamente nulle. Se partiamo da uno qualsiasi degli altri numeri, per forza di cose se la sequenza che vogliamo generare è “troppo lunga” (255 passi o più) uno dei numeri si ripeterà, e da lì in poi, visto che la procedura che usiamo è deterministica, otterremo gli stessi valori.

Quanti passi è lunga una sotto-sequenza senza ripetizioni? 255 passi? In realtà, non necessariamente: dipende dal fattore magico – e c’è una ricca letteratura che spiega come sceglierlo “bene”.

Con 32 bit, il periodo della sequenza può essere al più 4’294’967’295: più di quattro miliardi! Ma oggi, quanto tempo sarebbe necessario per fare il giro di tutti e 4 i miliardi di passi? Sul microcontrollore della mia unità Arduino Giga (molto più lenta del mio portatile), che opera alla frequenza di 400 MHz, basterebbero poco più di 10 secondi (le moltiplicazioni, nel caso, richiedono un solo ciclo di clock): praticamente niente.

Ma, passato il Neolitico, l’ingegneria dei generatori di numeri casuali si è molto evoluta, e permette di superare (usando però metodi più complicati del lineare congruenziale) il problema del periodo troppo corto.

Quanto ai nostri casi, abbiamo ancora un problema: i generatori di numeri casuali restituiscono valori distribuiti secondo la legge uniforme, di cui vediamo qui il grafico della “funzione densità di probabilità”:

Grafico della densità di probabilità uniforme con estremi minimo e massimo uguali a 0 e 1
Grafico della densità di probabilità uniforme con estremi minimo e massimo uguali a 0 e 1

I processi casuali più comuni nella Natura, però, usano altre distribuzioni statistiche – quella normale tanto per fare un esempio.

Ma I matematici (e le matematiche 😊) applicati non sono stati con le mani in mano: da lungo tempo esistono ormai generatori di numeri casuali capaci di riprodurre in modo accettabilmente buono distribuzioni continue e discrete dei tipi più vari. Una rassegna interessante, per la sua relativa “antichità”, si trova già nel secondo volume della mitica Bibbia di Knuth (“The Art of Computer Programming – Seminumerical Algorithms“).

Ma come vedremo nelle prossime puntate, entro certi limiti, e quanto a passeggiate a caso nel continuo, che la distribuzione soggiacente il generatore di numeri casuali che scegliamo di usare sia normale o no fa pochissima, di fatto nessuna, differenza…

Il viaggio, in realtà, comincia qui

In effetti, spiegare tutto e subito richiederebbe un trattato, e non credo proprio di essere io la persona più titolata a scriverlo.

Intanto, però, di riffa o di raffa, abbiamo avuto un primissimo contatto con quelli che scienziati e scienziate chiamano, un po’ pomposamente forse, “processi diffusivi”. Adesso, che abbiamo tra le mani i ferri del mestiere, possiamo lanciarci verso gli argomenti davvero divertenti, e cominceremo proprio nella prossima puntata, in cui vedremo alcune camminate a caso nel continuo a una dimensione, e faremo la prima conoscenza con gli sciami di particelle.

Insomma: abbiamo appena timbrato il biglietto. Il viaggio comincia adesso.