我正在嘗試編寫一個算法,它將使用蒙特卡羅方法來求解積分。儘管如此,對於給定的輸入數據,計算結果與預期結果不同。我計算表達式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)));
}
爲什麼不做一個黎曼和? – Charles
與你的問題無關,但你不需要用'-1'來乘以負數。在C++中,否定運算符是可在任何表達式上使用的一元運算符。例如,如果你有一個變量或表達式'e',只需使用一元減去使其爲負數,如'-e'。 –