2017-05-28 146 views
0

我正在尝试编写一个算法,它将使用蒙特卡罗方法来求解积分。尽管如此,对于给定的输入数据,计算结果与预期结果不同。我计算表达式exp(-ax^2),a = 1并且点在[0.5,1]的范围内。我期望得到的结果大约是0.29,但我得到了0.11。也许有什么建议我做错了什么?使用MC方法计算积分

#include<iostream> 
#define N 100000000 
#include<ctime> 
#include<cmath> 
#include<cstdio> 
#include<cstdlib> 

double pickPoint(double left, double right); 
double functionE(double a, double x); 

int main(){ 
    srand(time(NULL)); 
    double a; 
    std::cin >> a; 
    double leftBorder, rightBorder; 
    std::cin >> leftBorder >> rightBorder; 
    double result = 0; 
    for (int j = 0; j < N; j++){ 
     result += functionE(a, leftBorder + pickPoint(leftBorder, rightBorder)); 
    } 
    printf("%lf", (rightBorder - leftBorder) * (result/N)); 
    return 0; 
} 

double pickPoint(double left, double right){ 
    return left + (double)(rand()/(RAND_MAX + 1.0) * (right - left)); 
} 

double functionE(double a, double x){ 
    return exp((-a*pow(x, 2))); 
} 
+0

为什么不做一个黎曼和? – Charles

+0

与你的问题无关,但你不需要用'-1'来乘以负数。在C++中,否定运算符是可在任何表达式上使用的一元运算符。例如,如果你有一个变量或表达式'e',只需使用一元减去使其为负数,如'-e'。 –

回答

1

result += functionE(a, leftBorder + pickPoint(leftBorder, rightBorder));

应该

result += functionE(a, pickPoint(leftBorder, rightBorder));

你推边境不远了。

0

您在添加pickPoint(leftBorder, rightBorder)leftBorder。您已获得leftBorderrightBorder之间的值。这个补充是没有必要的。