Добавил:
yermolenkoigor9
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Stohastic / Hidrogenucle / main
.c#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define _USE_MATH_DEFINES
#define N 1000//количество точек в которых находился элетрон
float F(float r,float nue, int S)//функция для отбора отказа
{
float P,Y,R,a=0.5;
switch(S)
{
case 1:
R = 2*exp(-r/a); Y = 0.5/sqrt(M_PI);//основное состояние
break;
case 2:
R = (1-0.5*r/a)*exp(-0.5*r/a)/sqrt(2.); Y = 0.5/sqrt(M_PI);//S состояние n=2
break;
case 3:
R = 2*(1-2*r/a/3.+2*r*r/a/a/27.)*exp(-r/a/3.)/3./sqrt(3.); Y = 0.5/sqrt(M_PI);//S состояние n=3
break;
case 4:
R = 0.5*r*exp(-0.5*r/a)/a/sqrt(6.); Y = 0.5*sqrt(3.)/sqrt(2*M_PI)*sin(2*M_PI*nue);//P состояние n=2
break;
case 5:
R = 4*r*r*exp(-r/a/3.)/a/a/81./sqrt(30.); Y = 0.25*sqrt(30.)/sqrt(M_PI)*sin(2*M_PI*nue)*cos(2*M_PI*nue);//D состояние n=2
break;
}
P = R*R*Y*Y*(r/a)*(r/a)*sin(M_PI_2*nue);
return P;
}
//selection-denial Neumann
int otb=0;//количество отбросов
void seleden(float *x,float *y,int S)//метод отбора-отказа для заданного распределения
{
float r2,r,nue;
int i=0;
while(i<N)
{
r = (1.*rand())/(RAND_MAX+0.);
nue=(1.*rand())/(RAND_MAX+0.);
r2 =(1.*rand())/(RAND_MAX+0.);
if(r2 < F(r,nue,S))
{
x[i] = r*cos(nue*2*M_PI);//если точка прошла - считаем её координату
y[i] = r*sin(nue*2*M_PI);
i++;//и переходим к следующей
}
else otb++;//если не подошла - отбрасываем её
}
}
int main()
{
int k,t;
float x[N],y[N];
FILE *fp = fopen("coords.txt","w");
//FILE *fp1= fopen("NT.txt","w");
fprintf(fp,"%d \n",N);
for(k=1;k<6;k++)//цикл по состояниям B S P D
{
seleden(x,y,k);
printf("%d\n",otb);// печатаем сколько отброшено
for(t=0;t<N;t++)
{
//printf("%f %f\n",x[t],y[t]);
fprintf(fp,"%f %f\n",x[t],y[t]);//записываем координаты в файл
}
}
fclose(fp);
//fclose(fp1);
return 0;
}