Distribuzione di Maxwell - return value 3221225620

di il
4 risposte

Distribuzione di Maxwell - return value 3221225620

Buongiorno a tutti, premetto che sono nuovo e che non sono riuscito a trovare una soluzione al mio problema (in verità un po' complicato) su altri siti, tranne che uno in cinese. Sto mettendo giù un programma per il calcolo della velocità probabile delle molecole di gas secondo la distribuzione di Maxwell, il quale prevede l'utilizzo di un paio di array monodimensionali di lunghezza 10^6 elementi. Risolti gli errori in fase di compilazione; in fase di collaudo il programma richiede come previsto temperatura e massa atomica del gas, ma restituisce return value 3221225620 come da titolo. Il debug con osservazione del vettore V dà come risultato "PROGRAM RECEIVED SIGNAL SIGFPE, arithmetic exception". Le formule mi sembrano giuste. Qualcuno ci capisce qualcosa? Grazie

#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<cmath>
#include<ctime>
using namespace std;
float cmaxwell(float *t, float *v, float *mm){ //calcolo della probabilità della singola molecola
const float kb= 1.38e-23; //costante di Boltsmann
const float pg= 3.141;
float c= *mm/(2*kb**t);
float A= (4/(sqrt(pg)))*pow((*mm/(2*kb**t)),(3/2));
float exp= -c*pow(*v,2);
float pv= pow((A*pow(*v,2)),exp); //pressione utilizzando come termini C ed A indicati in precedenza
return pv;
}
float maxspeed(float *mm, float *t){ //calcolo della velocità massima delle molecole.
const float kb= 1.38e-23; //necessario in quanto limite per la generazione random del modulo velocità delle singole.
float vmax= (3*kb**t)/ *mm;
vmax=sqrt(vmax);
return vmax;
}
int main()
{
float t,mm; //temperatura, massa molecolare
int css,msa; //velocità generata casualmente, massima velocità secondo la funzione precedente
cout<<"Questo programma effettua il calcolo"<<endl<<"della velocita' piu' probabile e massima di un gas."<<endl<<"**********************************************************"<<endl;
cout<<"Inserire temperatura in Kelvin: ";
cin>>t;
cout<<"Inserire massa molecolare in u.m.a.: ";
cin>>mm;
float v[100000]={0}; //campione su 1x10^6 molecole
srand(time(NULL));
for(int ct=0; ct<100000; ct++){ //carico vettore
css=rand();
msa=maxspeed(&mm, &t);
v[ct]= css%msa;
}
float pv[100000]={0}; //calcolo della probabilità finale
for(int ct=0; ct<100000; ct++){
pv[ct]= cmaxwell(&t, &v[ct], &mm);
cout<<pv[ct]<<" "; //output di tutti i valori
}
/*Si precisa che più avanti implementerò le istruzioni per una media
dei valori e la ricerca del valor massimo; al momento mi interessa che il
programma calcoli i valori richiesti*/
return 0;
}

4 Risposte

  • Re: Distribuzione di Maxwell - return value 3221225620

    1) non e' una buona idea allocare strutture grosse nello stack. Lo stack ha una dimensione massima , il tuo approccio potrebbe sforare lo spazio disponibile
    2) float ha come range 10^+/-38 e alcune costanti sono gia a 10^-23. Ti conviene fare le operazioni con i double (10^+/-308)
    3) RIANALIZZA CON ATTENZIONE questa parte del tuo codice:
    
    css = rand();
    msa = maxspeed(&mm, &t);
    v[ct] = css % msa;
    
    css e' un INTERO, maxspeed RITORNA un float, msa E' IN UNTERO: CHE SENSO HA questa coversione?
    l'operatore % (modulo) NON FUNZIONA con lo zero (genera eccezione)
  • Re: Distribuzione di Maxwell - return value 3221225620

    Questo vettore

    float v[100000]={0};

    non è da 1x10e6 elementi...

    Comunque spostalo FUORI dal main oppure allocali dinamicamente
  • Re: Distribuzione di Maxwell - return value 3221225620

    @oregon: e' scritto 'campione su...' e comunque usa sempre 100_000, quindi, forse, e' giusto.
    Ma vai a sapere...
  • Re: Distribuzione di Maxwell - return value 3221225620

    Se non mi ricordo male, la velocità massima nella distribuzione di Maxwell-Boltzmann è sqrt(2*kb*t/m), non sqrt(3*kb*t/m)

    Aggiusta quelle costanti, in particolare pi greco, che non si possono vedere

    Consiglio: controlla ogni passaggio con i dati di un esercizio noto, anche svolto su carta
Devi accedere o registrarti per scrivere nel forum
4 risposte