使用Monte Carlo方法计算积分SINX DX



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

我认为您可以使用更简单的方法进行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);
}

最新更新