Вычисление интегралов методом MC

Я пытаюсь написать алгоритм, который будет решать интегралы, используя метод Монте-Карло. Тем не менее для заданных входных данных результат расчета отличается от ожидаемого; Я вычисляю выражение ехр (-ах ^ 2), а = 1 и точки находятся в диапазоне [0,5, 1]. Результат, который я ожидал получить, составляет около 0,29, но я получил что-то вроде 0,11. Может быть, есть предложения, что я делаю не так?

#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

Решение

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

должно быть

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

Вы отодвинули границу далеко.

1

Другие решения

Вы добавляете pickPoint(leftBorder, rightBorder) в leftBorder, Вы уже получаете значение между leftBorder а также rightBorder, Это дополнение не является необходимым.

0

По вопросам рекламы [email protected]