Codice C++
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <math.h>
#include <iomanip>
using namespace std;
inline int rnddir() {return (rand() % 2==0? -1: +1);}
int main(){
const int N_PARTICELLE = 100;
const int N_PASSI = 100;
int pos[N_PARTICELLE];
int i, j;
long int tot;
double media, media_q;
// azzerare le posizioni
for (i=0;i<N_PARTICELLE;i++) pos[i]=0;
// inizializzare il generatore di numeri casuali
srand(time(0));
// inizio della simulazione
for (j=0; j<N_PASSI; j++){
// un passo casuale per ogni particella
for (i=0;i<N_PARTICELLE;i++) pos[i]+=rnddir();
// calcolo della posizione media
tot=0;
for (i=0;i<N_PARTICELLE;i++) tot+=pos[i];
/* Nota: le righe finora contenute nel for(j) si possono anche
abbreviare con:
tot=0;
for (i=0;i<N_PARTICELLE;i++) tot+=(pos[i]+=rnddir());
sfruttando il fatto che anche le assegnazioni hanno un valore
di ritorno. Questo metodo dimezza i cicli da compiere e puo'
risultare in un programma di esecuzione piu' veloce...
*/ media = tot/(N_PARTICELLE*1.0);
// calcolo della media quadratica della posizione
tot=0;
for (i=0;i<N_PARTICELLE;i++) tot+=(pos[i])*(pos[i]);
media_q = tot/(N_PARTICELLE*1.0);
//output dei risultati
cout << "\t" << j << "\t" << std::setw(10) << media << std::setw(10)
<< sqrt(media_q) << endl;
}
}
Programma C++ (moto browniano)
In un fluido ha luogo il cosiddetto "moto browniano", consistente in piccoli spostamenti casuali delle molecole istante per istante.
Per studiare questo fenomeno (e altri analogamente stocastici) si introduce il concetto di "random walk", che ne è un buon modello:
All'istante t_0, la particella si trova in x_0 = 0.
All'istante t_1 essa compie uno spostamento in una direzione arbitraria - e completamente scorrelata da ciò che succede negli altri istanti - di una quantità fissa, ad esempio 1 (è solo una scelta di unità di misura).
Così via, ad ogni istante la posizione della particella varierà di +/- 1.
Se invece di una particella si fanno evolvere - indipendentemente - N particelle, ad ogni istante si dispone di un campione statistico (più ampio è, più accurata è la simulazione) di cui calcola:
- Distanza media dall'origine.
- Distanza quadratica media dall'origine.
Il primo valore, ci si aspetta, oscillerà indefinitamente attorno a zero, per la simmetria del problema; il secondo invece crescerà man mano che gli spostamenti casuali disperdono tra loro le particelle allontanandole dall'origine (in media).
La trattazione matematica del modello dice che la distanza quadratica media cresce proporzionalmente alla radice quadrata del numero di passi compiuti (e che il fattore di proporzionalità vale 1 se lo spostamento per passo è unitario).
Il programma realizza una tabella tipo:
N. passo <x> sqrt(<x^2>)
==============================================
0 -0.06 1
1 -0.14 1.48324
2 -0.06 1.7088
3 -0.08 1.89737
4 -0.18 2.23607
5 -0.1 2.40832
6 -0.04 2.48998
7 0.06 2.8775
8 0.08 3.06594
9 0.14 3.26803
10 0.12 3.49285
11 0.12 3.58887