Интеграл с использованием симуляции Монте-Карло дает неверный результат - PullRequest
0 голосов
/ 15 мая 2018

Я пытался вычислить интеграл от exp (x), x в диапазоне [0,2] и выборку из равномерного dist. Каким-то образом интегральный результат составляет ровно половину ожидаемого значения. Кто-нибудь знает, в какой части я допустил ошибку? Спасибо!

x_upLimit=2
max = np.exp(x_upLimit)

def f(x):
    return np.exp(x)

def P_samples(N):
    return np.random.uniform(0, x_upLimit, N)

def expectation_value(N):
    s = P_samples(N)
    return sum(f(s))/N

# xs = np.linspace(0, 2)
# plt.plot(xs, np.array([max]*len(xs)))
# plt.plot(xs, f(xs), label ='f(x)')

#estimated
expectation_value(1000000) #3.1938802618
#expected
expr = integrate(exp(x), (x,0,2))
expected = expr.evalf() #6.38905609893065

Ответьте на вопрос моего владельца. Интеграл от Монте-Карло был правильным. Неправильное место - функция, используемая в «интегрировать». Должно быть

#expected
expr = integrate(exp(x)*1/(2-0), (x,0,2))
expected = expr.evalf() #3.19452804946533

1 Ответ

0 голосов
/ 15 мая 2018

Значение интеграла от exp (x), рассчитанное между 0 и 2, на самом деле равно 6,389 ... (как указано в используемой вами функции integrate).

Проблема заключается в ваша expectation_value функция, которая должна умножить среднее значение функции на диапазон интегрирования ( т.е. 2 в данном конкретном случае).См. здесь для подробного объяснения.

...