vuoi
o PayPal
tutte le volte che vuoi
Il decadimento radioattivo segue una legge esponenziale: ovvero, se a t=0 sono presenti N nuclei radioattivi instabili che possono decadere in nuclei stabili, al tempo t ne sono rimasti N(t) = N * exp(-r*t) dove r e' l'inverso della vita media T, definita come il tempo necessario perche' un campione radioattivo si riduca di e volte.Tale legge pero' e' risultato di un processo stocastico: infatti, la probabilita'che un nucleo decada, oltre ad essere scorrelata dagli altri nuclei, e' scorrelata istante per istante.
#include <iostream>
#include <cstdlib>
#include <ctime>
#include <math.h>
using namespace std;
bool uno_su_N(int);
int main(){
srand(time(0));
// parametri della simulazione:
const unsigned long int NUM_PARTICELLE = 800;
const unsigned long int PASSI = 1000;
// (quando prima di avere finito i passi non ci
// sono piu' particelle ci si ferma...)
// questa e' l'inverso della probabilita' che nell'unita' di tempo
// (= in un passo) una particella decada...
const int PROB_INVERSA = 40;
bool part_attive[NUM_PARTICELLE];
unsigned long int i,j;
// questo contatore, inizialmente al massimo, tiene conto via
// via dei "decadimenti" che hanno luogo...
unsigned long quante_attive = NUM_PARTICELLE;
// si impostano inizialmente tutte le particelle su "ancora presente"
(true)
for (j=0;j<NUM_PARTICELLE;j++) part_attive[j]=true;
cout << "Passo" << "\t" << "N_sp" << "\t" << "N_th" << endl;
cout << "------------------------" << endl;
for (i=1;i<=PASSI;i++){
// particella per particella, se e' il caso (calcolato
probabilisticamente)
// la si fa decadere. Se e' gia' svanita, la si salta.
for (j=0;j<NUM_PARTICELLE;j++)
if (part_attive[j])
if (uno_su_N(PROB_INVERSA)){
part_attive[j]=false;
quante_attive--;
}
// stampa del numero di particelle attive
cout << i << "\t" << quante_attive << "\t" << (unsigned long int)
(NUM_PARTICELLE*exp(-(i*1.0/PROB_INVERSA))) << endl;
// si verifica se le particelle sono decadute tutte...
if (quante_attive<=0) break;
}
}
bool uno_su_N(int N){
int numero=rand() % N;
return (numero == 0);
// un numero sara' zero (modulo N) in un caso su N...
}