Добавил:
yermolenkoigor9
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define N 10000//повторы эксперимента для дисперсии
#define nn 15//количество столбиков
#define IA 16807// Минимальный компактный генератор случайных чисел Парка и Миллера
#define IM 2147483647// константы Льюиса-Гудмана-Миллера
#define AM (1./IM)
#define IQ 127773// константы Шаржа
#define IR 2836
#define MASK 123456789// маска чтоб не мешались нули
#define NTAB 32// числa Бейса-Дурхема
#define NWUP 8
#define NDIV (1+(IM-1)/NTAB)
#define EPS 1.2e-7
#define RNMX (1.0-EPS)
static long dummy;
// начальное значение для всех генераторов
void Seed(long dum) {dummy=dum;}
// возвращает случайное число на промежутке от 0 до 1
float unirand0(void) {
long k;
float ans;
dummy^=MASK;// избегаем dummy==0
k=dummy/IQ;
if((dummy=IA*(dummy-k*IQ)-IR*k)<0) dummy+=IM;
ans=AM*dummy;
dummy^=MASK;// восстанавливаем dummy
return(ans);
}
float unirand1(void) {
int j;
long k;
static long iy=0,iv[NTAB];
float temp;
// инициализация
if(dummy<=0 || !iy) {
// следим, чтобы значение было положительным
if(dummy<0) dummy=-dummy;
else if(dummy==0) dummy=1;
for(j=NTAB+NWUP-1;j>=0;j--) {
k=dummy/IQ;
if((dummy=IA*(dummy-k*IQ)-IR*k)<0) dummy+=IM;
if(j<NTAB) iv[j]=dummy;
}
// первый элемент из таблицы
iy=iv[0];
}
// генерируем новое число
k=dummy/IQ;
if((dummy=IA*(dummy-k*IQ)-IR*k)<0) dummy+=IM;
iy=iv[j=iy/NDIV];iv[j]=dummy;
if((temp=AM*iy)>RNMX) return(RNMX);
else return(temp);
}
float gauss()
{
float rnd=0.0;
int i;
for(i=1;i<12;i++)rnd+=unirand1();//от нуля до единицы
return rnd - 6.0;
}
float rayleigh()
{
float u,l,t;
u=gauss();l=gauss();
t = sqrt(l*l+u*u);
return t;
}
//гистограмма//массив случайных//пределы//кол-во точек//массив гистограммы//кол-во столбиков
void hist(float *x,float *y,float x0,float xn, float y0,float yn,int n,float *p,int m)
{
float xi,dx,pn,dy,yi;
int i,j,k;
dx=(xn-x0)/m;
dy=(yn-y0)/m;
pn=1.0/n;
for(i=0;i<m;i++)
for(k=0;k<m;k++)
{
*(p+i*m+k)=0;//=p[i][k]
for(j=0;j<n;j++)
{
xi=x0+i*dx;
yi=y0+k*dy;
if((xi<x[j])&&(x[j]<xi+dx)&&(yi<y[j])&&(y[j]<yi+dy))
{
*(p+i*m+k)+=pn;//=p[i][k]
}
}
}
}
float matozhid(float *x)
{
float M = 0;
int k;
for(k=0;k<N;k++)
M += x[k]*1.;//тут может быть массив вероятностей
return M/N;
}
float dispers(float *x,float m)//dyspersia
{
float Dy = 0.;
int k;
for(k=0;k<N;k++)
Dy += (x[k]-m)*(x[k]-m);
return sqrt(Dy/N);
}
float covariac(float *x, float *y)//ковариация
{
float cov,Mpr[N],Mx,My;
int i;
Mx = matozhid(x);
My = matozhid(y);
for(i=0;i<N;i++)
Mpr[i] = (x[i]-Mx)*(y[i]-My);
cov = matozhid(Mpr);
return cov;
}
float coefcorl(float *x, float *y)//коэффициент корреляции
{
float crlc,Dx,Dy;
Dx = dispers(x,matozhid(x));
Dy = dispers(y,matozhid(y));
crlc = covariac(x,y)/(Dx*Dy);
return crlc;
}
float coefcor2(float *x, float *y)//коэффициент корреляции
{
float crlc,dsx,dsy,Sx,Sy,Mx,My,Mxy,xy[N];
int i;
for(i=0;i<N;i++)
xy[i] = x[i]*y[i];
Mx = matozhid(x);
My = matozhid(y);
Mxy = matozhid(xy);
for(i=0;i<N;i++)
{
dsx += (x[i]*x[i] - Mx*Mx); //сумма разностей квадратов
dsy += (y[i]*y[i] - My*My);
}
Sx = sqrt(dsx/N);
Sy = sqrt(dsy/N);
crlc = (Mxy-Mx*My)/(Sx*Sy);
return crlc;
}
float F(float x,float y)//функция для отбора отказа
{
//float qx=1.,qy=1.,rxy=0.,mx=0.,my=0.;
float qx=5.,qy=1.,rxy=0.,mx=0.,my=0.;
return exp(-0.5*((x-mx)*(x-mx)/((1.-rxy*rxy)*qx*qx)-(2*rxy*(x-mx)*(y-my))/((1.-rxy*rxy)*qx*qy)+(y-my)*(y-my)/((1.-rxy*rxy)*qy*qy)))/(6.283*qx*qy*sqrt(1.-rxy*rxy));
}
//selection-denial Neumann
int shu=0;//количество отбросов
void seleden(float *x,float *y)
{
float r2;
int i=0;
while(i<N)
{
x[i]=unirand1()*40-20;//Парк-Миллер с перетасовкой
y[i]=unirand1()*40-20;
r2 = unirand1()*1;//верхний ограничитель
if(r2 < F(x[i],y[i])) i++;
else shu++;
}
}
int main()
{
float P[nn][nn],x[N],y[N],Dx;
int i,k;
FILE *fp = fopen("gyst.txt","w");
/*
for(i=0;i<N;i++)
{
x[i]=unirand1();//Парк-Миллер с перетасовкой
y[i]=unirand1();
//y[i]=rxy*x[i]+sqrt(1-rxy*rxy*unirand1());
//x[i] = gauss();//нормальное распределение Гауса
//x[i] = rayleigh();//нормальное распределение Рэлея
//printf("%f\n",x[i]);
}
*/
seleden(x,y);//отбора отказа для точки с двумя координатами
printf("deleted %d from %d\n",shu,N);
hist(x,y,-9,9,-9,9, N,&P[0][0], nn);//для гистограммы статический массив P[nn][nn]
//hist(x,y,-3,2,-3,2, N,&P[0][0], nn);//для гауса другие границы
Dx = dispers(x,matozhid(x));
printf("matozhid: %f \n",matozhid(x));
printf("dispsquar %f \n",Dx);
printf("covariac: %f \n",covariac(x,y));
printf("coefcorl: %f \n",coefcorl(x,y));
printf("coefcor2: %f \n",coefcor2(x,y));
for(k=0;k<nn;k++){
// printf("\n");
for(i=0;i<nn;i++)
fprintf(fp,"%f ",P[k][i]);
//printf("%f ",P[k][i]);
}
fclose(fp);
return 0;
}