ページ 11

超球の体積の求め方がよくわかりません!

Posted: 2019年1月01日(火) 18:08
by bana
crude法という方法でモンテカルロ積分を用いて、半径1の正領域で囲まれる超球の体積を求めるためのプログラムを作りたいです。(1万回中千回ごとに表示し、2次元、3次元、4次元、5次元の超球体積を求める)
課題として出されたのですがどうしてもわかりません。

授業内では下のようなcrude法プログラムを提示されたのですが、あまり説明をされなかったためよくわかりませんでした。

コード:

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
 
#define N	10000
#define D	5
 
void crude(double *, int);
void print(double *,int, int);
 
int main(void)
{
	double r[D],v[D]; int n,j;
	for(j=0;j<D;j++) r[j]=0;
 
	printf(" 回数  円面積 球体積  四次元  五次元\n\n");
	for( n=1; n<=N; n++ ){
		crude(r,D);
		v[0]=1.0;
		for(j=1;j<D;j++)
			v[j] = v[j-1]*r[j]/(double)n;
		if( (n%1000)==0 ) print(v,D,n);
	}
	return 0;
}
 
void crude (double *r, int dim)
{
	int j;
	double xx, rr;
 
	xx = rand()/((double)RAND_MAX+1.0);
 
	rr = 1.0;
	for( j=0;j<dim;j++){
		rr *= sqrt ( 1 - xx*xx );
		r[j] += rr;
	}
}

void print(double *v, int dim, int n)
{
	int j;
	printf("%6d", n);
	for( j=1; j<dim;j++ )
		printf(" %.6f", v[j] );
	printf("\n");
}
よろしくお願いします!

Re: 超球の体積の求め方がよくわかりません!

Posted: 2019年1月01日(火) 20:13
by dic
わかりません

Re: 超球の体積の求め方がよくわかりません!

Posted: 2019年1月03日(木) 23:06
by かずま
球の体積ということで、適当に書き直してみました。
モンテカルロなので乱数を使っていますが、
crude法なのかどうかは分かりません。

コード:

#include <stdio.h>   // printf
#include <stdlib.h>  // rand, srand
#include <time.h>    // time

#define N  10000
#define D  5

void crude(double *, int);
void print(double *, int, int);

int main(void)
{
	double r[D], v[D];  int n, j, k[D] = { 0 };

	srand(time(0));
	printf("  回数   円面積    球体積    四次元    五次元\n\n");
	for (n = 1; n <= N; n++) {
		crude(r, D);
		for (j = 0; j < D; j++)
			if (r[j] < 1) k[j]++;
		if (n % 1000 == 0) {
			for (j = 0; j < D; j++)
				v[j] = (double)k[j] * (2 << j) / n;
			print(v, D, n);
		}
	}
}

void crude(double *r, int dim)
{
	int j;
	double xx, rr = 0;
	for (j = 0; j < dim; j++) {
		xx = rand() / (RAND_MAX + 1.0);
		rr += xx * xx;
		r[j] = rr;
	}
}

void print(double *v, int dim, int n)
{
	int j;
	printf("%6d", n);
	for (j = 1; j < dim; j++)
		printf("  %f", v[j]);
	printf("\n");
}
実行結果

コード:

  回数   円面積    球体積    四次元    五次元

  1000  3.180000  4.552000  5.712000  5.952000
  2000  3.148000  4.340000  5.232000  5.536000
  3000  3.166667  4.277333  5.098667  5.536000
  4000  3.144000  4.206000  5.040000  5.416000
  5000  3.148800  4.176000  4.979200  5.427200
  6000  3.152000  4.160000  4.893333  5.306667
  7000  3.143429  4.142857  4.882286  5.234286
  8000  3.139000  4.137000  4.890000  5.216000
  9000  3.138222  4.156444  4.894222  5.184000
 10000  3.146400  4.184800  4.876800  5.216000
間違っているかもしれないので、疑問点は質問してください。