変数変換
積分の変数変換に於いて、変換後と変換前の微小積分要素の間には以下の関係が成り立つ。
![]() |
||
![]() |
![]() |
実際にBox-Muller法を用いて確率変数を生成し、分布のヒストグラムを書いてみると以下のようになる。
例えばC言語でプログラムすると、以下のように書ける(試行数100000回)。
#include <stdio.h>
#include <math.h>
#include <time.h>
#include <stdlib.h>
#define PI (M_PI)
#define MAX (5.0)
#define MIN (-MAX)
#define DELTA (0.05)
#define HEIKIN(i) ( MIN+DELTA*(i)+DELTA/2.0 )
#define NUMBER ((int)( (MAX-MIN)/DELTA ))
#define SHIKOU (100000)
double get_random(void) ;
void calc_y(double*,double*) ;
int main(void)
{
FILE *fptr1, *fptr2 ;
double y1, y2 ;
int i, shikou ;
int Y1[NUMBER] = {0}, Y2[NUMBER] = {0} ;
for( shikou=0; shikou<SHIKOU; shikou++){
calc_y( &y1, &y2) ;
i = 0 ;
do{
if( y1 >= MIN+DELTA*i && y1 < MIN+DELTA*(i+1) ) Y1[i]++ ;
else if( y2 >= MIN+DELTA*i && y2 < MIN+DELTA*(i+1) ) Y2[i]++ ;
i++ ;
}while( i<NUMBER ) ;
}
fptr1 = fopen("Y1_n.dat", "w") ;
fptr2 = fopen("Y2_n.dat", "w") ;
for( i=0; i<NUMBER; i++){
fprintf( fptr1, "%lf %lf\n", HEIKIN(i), ((double)Y1[i])/(SHIKOU*DELTA)) ;
fprintf( fptr2, "%lf %lf\n", HEIKIN(i), ((double)Y2[i])/(SHIKOU*DELTA)) ;
}
fclose( fptr1) ;
fclose( fptr2) ;
return 0 ;
}
double get_random()
{
static int flag=0;
if(flag==0){
srand(time(NULL)) ;
flag=1 ;
}
return 1.0*rand()/(RAND_MAX+1.) -0.0 ;
}
void calc_y(double *y1, double *y2)
{
double x1, x2 ;
x1 = get_random() ;
x2 = get_random() ;
*y1 = sqrt( -2*log(x1) ) * cos(2*PI*x2) ;
*y2 = sqrt( -2*log(x1) ) * sin(2*PI*x2) ;
}
著者: 茅根裕司 chinone_at_astr.tohoku.ac.jp