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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
bana

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

#1

投稿記事 by bana » 1ヶ月前

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");
}
よろしくお願いします!

dic
記事: 531
登録日時: 8年前
住所: 宮崎県

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

#2

投稿記事 by dic » 1ヶ月前

わかりません

かずま

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

#3

投稿記事 by かずま » 1ヶ月前

球の体積ということで、適当に書き直してみました。
モンテカルロなので乱数を使っていますが、
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
間違っているかもしれないので、疑問点は質問してください。

返信

“C言語何でも質問掲示板” へ戻る