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

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

トピックに返信する


答えを正確にご入力ください。答えられるかどうかでスパムボットか否かを判定します。

BBCode: ON
[img]: ON
[flash]: OFF
[url]: ON
スマイリー: OFF

トピックのレビュー
   

展開ビュー トピックのレビュー: 超球の体積の求め方がよくわかりません!

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

#3

by かずま » 2ヶ月前

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

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

#2

by dic » 2ヶ月前

わかりません

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

#1

by bana » 2ヶ月前

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

ページトップ