This is the code I created to calculate in C ++ using Monte Carlo methods, the average distance between the points evenly distributed in a cube. I do not understand why in the output file "distance_media_when_to_the_number_of_configurations.txt", the value of the second column is always the same. I wanted the value to vary until it stabilized in value. I put the formulas used in an attached image. The goal is that with the txt file you can create a graph like the one in the attachment where the x-axis is the logarithm of the left values of the txt file and the y-axis is the value of the right column of the txt file . How can I change the file to get the mean value of the average distance over time (right column of the txt file)?
#include<iostream>#include<cstdlib>#include<math.h>#include<fstream>#include<iomanip>usingnamespacestd;voiddistanciamediatotal(int&numero_configuracoes,int&numero_de_pontos,constchar*name_of_file,int&semente,intcaso){doublex[numero_de_pontos];doubley[numero_de_pontos];doublez[numero_de_pontos];doubledmedia_auxiliar;doubledij=0.0;doubledijsomatorio_quando_i_menor_j=0.0;doubledistancia_media_total=0.0;doublesomatorio_d_media=0.0;longlonginti;longlongintj;longlongintk;longlongintm;ofstreamfile;file.open(name_of_file);switch(caso){case0:for(k=0;k<numero_configuracoes;k++){dijsomatorio_quando_i_menor_j=0.0;distancia_media_total=0.0;srand48(semente);for(i=0;i<numero_de_pontos;i++){x[i]=drand48();y[i]=drand48();z[i]=drand48();}for(j=1;j<numero_de_pontos;j++){for(i=0;i<j;i++){dij=sqrt(pow((x[j]-x[i]),2)+pow((y[j]-y[i]),2)+pow((z[j]-z[i]),2));dijsomatorio_quando_i_menor_j+=dij;}}dmedia_auxiliar=dijsomatorio_quando_i_menor_j*2/(double)(numero_de_pontos*(numero_de_pontos-1));somatorio_d_media+=dmedia_auxiliar;distancia_media_total=somatorio_d_media/(k+1);file<<k+1<<"\t" << setprecision(10) << distancia_media_total << endl;
}
file.close();
break;
case 1:
for(m=2;m<=numero_de_pontos;m++){
somatorio_d_media = 0.0;
for (k=0;k<numero_configuracoes;k++){
srand48(semente);
dijsomatorio_quando_i_menor_j=0.0;
distancia_media_total = 0.0;
for(i=0;i<numero_de_pontos;i++){
x[i]=drand48();
y[i]=drand48();
z[i]=drand48();
}
for(j=1;j<m;j++){
for (i=0; i<j;i++){
dij=sqrt(pow((x[j]-x[i]),2)+pow((y[j]-y[i]),2)+pow((z[j]-z[i]),2));
dijsomatorio_quando_i_menor_j+=dij;
}
}
dmedia_auxiliar=dijsomatorio_quando_i_menor_j*2/(double)(m*(m-1));
somatorio_d_media+= dmedia_auxiliar;
}
distancia_media_total = somatorio_d_media/numero_configuracoes;
file << m << "\t" << setprecision(10) << distancia_media_total << endl;
}
file.close();
break;
default:
cout << "Teste nao identificado \n" << endl;
}
}
int main (){
long long int numero=1;
long long int numerototal=10;
long long int Nd;
long long int i;
int semente=17;
srand48(semente);
double x=0.0;
double y=0.0;
double distancia;
double pi=0.0;
double errocomlogaritmo=0.0;
// Exercicio 1 - Calculo do valor de pi
//Gerar pontos distribuidos uniformemente num quadrado unitario;
//Calculo da distancia de cada ponto a origem;
//Determinacao dos pontos que se encontram dentro do semicirculo
//Estimar o valor de pi;
//Fazer dois graficos: o primeiro do valor da estimativa de pi
//em funcao do numero de pontos gerados; o segundo da dependencia
//funcional em funcao do numero de pontos gerados.
/*ofstream file;
file.open("Dados_para_o_numero_pi.txt");
for(int k=0;k<numerototal;k++){
numero*=10;
Nd=0;
for(i=0;i<numero;i++){
x = drand48();
y = drand48();
distancia = pow(x,2)+pow(y,2);
//Se os pontos que estão no quadrado estao tambem dentro do
//semicirculo, soma mais uma unidade a Nd
if(distancia<=1.0)
Nd++;
}
pi = 4*Nd/(double)numero;
errocomlogaritmo = log10(fabs(M_PI-pi));
file << numero << "\t" << setprecision(10) << pi << "\t" << k+1 << "\t" << setprecision(8) <<
errocomlogaritmo << "\t" << endl;
}
file.close();*/
//Exercicio 2 - Pontos numa caixa
//Resolucao do integral usando o Metodo de Monte Carlo
//varia-se o numero de configuracoes, mantendo fixo o numero de pontos
int numero_configuracoes_maximo = 100000;
int numero_de_pontos=1000;
distanciamediatotal(numero_configuracoes_maximo, numero_de_pontos, "distancia_media_quando_se_varia_o_numero_de_configuracoes.txt", semente, 0);
//Varia-se o numero de pontos, mantendo fixo o numero de configuracoes
int numero_configuracoes = 1000;
//distanciamediatotal(numero_configuracoes, numero_de_pontos, "distancia_media_quando_se_varia_o_numero_de_pontos.txt", semente, 1);
return 0;
}