2017-05-28 831 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之間的值。這個補充是沒有必要的。