E (costante matematica): differenze tra le versioni

Contenuto cancellato Contenuto aggiunto
→‎Definizioni: meno riferimento alla serie di e^x che qua e' fuori posto
→‎Approssimazione con il metodo stocastico: rimuovo sezione: gia' la sezione precedente non e' cosi' fondamentale, non si vede il senso di questa lunga discussione
Riga 136:
:
allora il [[valore atteso]] <math>V</math> è proprio la costante <math>e</math>.
 
=== Approssimazione con il metodo stocastico ===
Si può studiare un algoritmo che verifichi quanto detto. Il seguente programma, costruito ad-hoc per verificare se questa rappresentazione di <math>e</math> sia corretta (oltre che per definire la bontà del metodo), applica la relazione [1] usando per le somme parziani <math>n_i</math> valori pseudo-casuali generati dalla funzione stocast();
 
è importante notare come un l'uso di questa funzione sia sufficiente per questo scopo, nonostante essa contraddica l'ipotesi di completa randomicità delle variabili.<syntaxhighlight lang="c" line="1">
/*
Partendo dalla definizione data, si usa il seguente codice per approssimare numericamente la costante e,
inizializzando delle variabili di tipo double per calcolare la media delle somme parziali N
e usando per queste somme i valori pseudo-casuali calcolati nella funzione stocast() compresi tra 0 e 1,
trovando che la loro somma (considerando la loro media) non è mai più piccola di 2 e mai più grande di 3.
Ritroviamo quindi in questo tipo di distribuzione una gaussiana centrata sul valore della costante,
o la possibilità di stimare l'ampiezza della campana analizzando il risultato in funzione del numero N.
*/
 
#include <stdio.h>
#include <time.h>
#include <math.h>
#include <stdlib.h>
#define EXP 2.718281
 
int stocast();
 
double errore(double media);
 
int main(){
long long int i, n, somma=0;
double num, denom, media;
int *vett;
char file[] = "Dati_statistici.txt";
srand(time(NULL));
printf("\t***********************************************");
printf("\n\t* *");
printf("\n\t* Approssimazione stocastica costante e *");
printf("\n\t* *");
printf("\n\t***********************************************");
printf("\nInserisci il numero di somme parziali da calcolare: ");
scanf("%lld", &n);
// Trovo i valori pseudo-casuali
vett = malloc(n * sizeof(int));
if(vett == NULL){
printf("\nAllocazione memoria fallita!\n\n");
system("pause");
return -1;
}
 
for(i=0; i<=n; i++){
vett[i] = stocast();
}
 
// Faccio la media del numero di valori trovati
for(i=0; i<=n; i++){
somma = somma + vett[i];
}
num = (double)somma; // cambio tipo; da int a double
denom = (double)n; // per fare la media
media = num/denom;
 
printf("\nApprossimazione trovata: e = %lf\n", media);
printf("\nErrore relativo al valore vero: %0.4lf%%\n", errore(media));
 
FILE *pf;
pf = fopen(file, "a+");
if(pf == NULL){
printf("\nErrore nell'apertura del file!\n\n");
system("pause");
return -1;
}
 
fprintf(pf,"N = %lld", n);
fprintf(pf,"\ne = %lf", media);
fprintf(pf,"\nErrore = %0.4lf%%\n\n", errore(media));
fflush(pf);
fclose(pf);
printf("\nRisultato scritto sul file 'Dati_statistici.txt'\n\n");
 
free(vett);
vett = NULL;
system("pause");
return 0;
}
 
int stocast(){
long long int contatore=0;
double X, S=0;
 
while(S<1.0){
X = (double)(rand()) / ((double)RAND_MAX + 1.0);
S = S + X;
contatore++;
}
 
return contatore;
}
 
double errore(double media){
double E, Ea, Er, approx;
E = media - EXP;
Ea = fabs(E);
Er = Ea/media;
approx = Er*100;
return approx;
}
</syntaxhighlight>
 
Ripetendo il calcolo molte volte con questo programma, per avere un consistente insieme di dati da analizzare (dato che ad ogni esecuzione la stima di <math>e</math> sarà sempre diversa per la natura statistica del calcolo), si ottiene il seguente output sul file Dati_statistici.txt dove:
* <math>N</math> è il numero di somme parziali <math>n_i</math> di variabili pseudo-casuali considerate
 
* <math>e</math> è l'approssimazione della costante
 
* <math>Errore</math> è l'errore in percentuale tra il valore vero di <math>e</math> ed il valore approssimato calcolato<syntaxhighlight>
N = 100
e = 2.670000
Errore = 1.808%
 
N = 100
e = 2.620000
Errore = 3.751%
 
N = 100
e = 2.660000
Errore = 2.191%
 
N = 100
e = 2.760000
Errore = 1.512%
 
N = 100
e = 2.800000
Errore = 2.919%
 
N = 1000
e = 2.717000
Errore = 0.047%
 
N = 1000
e = 2.752000
Errore = 1.225%
 
N = 1000
e = 2.734000
Errore = 0.575%
 
N = 1000
e = 2.708000
Errore = 0.380%
 
N = 1000
e = 2.709000
Errore = 0.343%
 
N = 10000
e = 2.721100
Errore = 0.104%
 
N = 10000
e = 2.705600
Errore = 0.469%
 
N = 10000
e = 2.705500
Errore = 0.472%
 
N = 10000
e = 2.719100
Errore = 0.030%
 
N = 10000
e = 2.723700
Errore = 0.199%
 
N = 100000
e = 2.720890
Errore = 0.096%
 
N = 100000
e = 2.718640
Errore = 0.013%
 
N = 100000
e = 2.720960
Errore = 0.098%
 
N = 100000
e = 2.717720
Errore = 0.021%
 
N = 100000
e = 2.719690
Errore = 0.052%
 
N = 1000000
e = 2.717733
Errore = 0.020%
 
N = 1000000
e = 2.717702
Errore = 0.021%
 
N = 1000000
e = 2.719957
Errore = 0.062%
 
N = 1000000
e = 2.718747
Errore = 0.017%
 
N = 1000000
e = 2.719289
Errore = 0.037%
 
N = 10000000
e = 2.718545
Errore = 0.010%
 
N = 10000000
e = 2.718413
Errore = 0.005%
 
N = 10000000
e = 2.718024
Errore = 0.009%
 
N = 10000000
e = 2.718250
Errore = 0.001%
 
N = 10000000
e = 2.718919
Errore = 0.023%
 
N = 100000000
e = 2.718303
Errore = 0.001%
 
N = 100000000
e = 2.718233
Errore = 0.002%
 
N = 100000000
e = 2.718349
Errore = 0.003%
 
N = 100000000
e = 2.718280
Errore = 0.000%
 
N = 100000000
e = 2.718453
Errore = 0.006%
 
</syntaxhighlight>
 
Come si può notare, all'aumentare del valore di <math>N</math>(coincidenti alla somma dei valori <math>n_i</math> presenti nella relazione [1], ovvero del numero di somme parziali dei valori casuali <math>X_n</math>),
 
si arriva ad ottenere una stima della costante <math>e</math> con un'incertezza media in percentuale minore della precisione rappresentativa delle variabili (double) usate nel calcolo.
 
Tuttavia si dimostra anche che questo tipo di stima è poco efficiente, dato che bisogna raggiungere valori di <math>N</math> nell'ordine di grandezza di <math>10^8</math> somme parziali per ottenere solo le prime 4 cifre decimali significative di <math>e</math> esatte in media.
 
== Note ==