Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Stohastic / duohyst / main

.c
Скачиваний:
4
Добавлен:
18.08.2019
Размер:
5.24 Кб
Скачать
#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;
}
Соседние файлы в папке duohyst
  • #
    18.08.2019215 б4duohyst.depend
  • #
    18.08.2019396 б5duohyst.layout
  • #
    18.08.20191 Кб5FILE.txt
  • #
    18.08.2019450 б5fileread.sce
  • #
    18.08.20192.03 Кб5gyst.txt
  • #
    18.08.20195.24 Кб4main.c