Я вычисляю следующий интеграл с помощью scipy:
from scipy.stats import norm
def integrand(y, x):
# print "y: %s x: %s" % (y,x)
return (du(y)*measurment_outcome_belief(x, 3)(y))*fv_belief(item.mean, item.var)(x)
return dblquad(
integrand, norm.ppf(0.001, item.mean, item.var),
norm.ppf(0.999, item.mean, item.var),
lambda x: norm.ppf(0.001, x, 3),
lambda x: norm.ppf(0.999, x, 3))[0]
У меня есть предположение о состоянии предмета (нормальное распределение) и измерения, зависящие от реальной стоимости предмета. (Также нормальное распределение). Используя этот интеграл, я вычисляю ценность информации (насколько полезно для измерения этого предмета).
Проблема в том, что вычисление этого интеграла занимает много времени. Есть ли более эффективный способ его вычисления (мне не нужна 100% точность), например, интеграция Монте-Карло или что-то подобное?
Я знаю, что в python есть skmonaco
библиотека для интеграции monte carlo, но пределы интеграла должны быть числами, в отличие от scipy, внутренние интегральные пределы зависят от внешних (например, сверху
lambda x: norm.ppf(0.001, x, 3)
) Вот как вычисляется двойной интеграл с помощью skmonaco
>>> from skmonaco import mcquad
>>> mcquad(lambda x_y: x_y[0]*x_y[1], # integrand
... xl=[0.,0.],xu=[1.,1.], # lower and upper limits of integration
... npoints=100000 # number of points
... )
Как видите, пределы внутреннего интеграла здесь не зависят от внешнего интеграла. Может ли кто-нибудь порекомендовать библиотеку или способ эффективного вычисления этого интеграла?