我试图计算积分-1到6 sinx dx,但是下面给出了-1,14附近的结果,正确的解是-0.41987。哪里出错了?如何让我的代码看起来更好更清晰?
float MonteCarlo ( float a , float b, long long int N ) // MonteCarlo(-1,6,200) integral -1 to 6 sinx dx
//N number of random (x,y)
{
srand(time(NULL));
float positive = 0; // number of points (x,y): 0<y<sinx
float negative = 0; // number of points (x,y): sinx<y<0
int i;
for(i=0;i<N;i++)
{
float x= ((float) rand()) / (float) RAND_MAX*(b-a)+a;
float y= ((float) rand()) / (float) RAND_MAX*2 -1 ;
if( sin(x)>0 && y<sin(x) ) positive++;
if( sin(x)<0 && y>sin(x) ) negative++;
}
positive=fabs(a-b)*2*(positive/ (float) N);//positive area
negative=fabs(a-b)*2*(negative/ (float) N);//negative area
return positive-negative;
}
答案 0 :(得分:0)
我认为您可以使用更简单的MC集成方法:首先必须计算样本的期望值(= sum / N),然后将其乘以(b-a)。但在这种情况下,您需要许多(> 1e6)样本才能获得精确的结果。
试试这个:
// MonteCarlo(-1,6,200) integral -1 to 6 sinx dx
float MonteCarlo ( float a , float b, long long int N )
{
srand(time(NULL));
int i;
float sum = 0;
for(i=0;i<N;i++)
{
x= (float) rand()*(b-a) + a;
sum = sum + sin(x);
}
return sum / N * (b-a);
}