使用蒙特卡罗方法计算积分sinx dx?

时间:2017-03-13 21:28:20

标签: montecarlo integral

  

我试图计算积分-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;
}

1 个答案:

答案 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);
}