変数変換
積分の変数変換に於いて、変換後と変換前の微小積分要素の間には以下の関係が成り立つ。
実際に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