Я пытаюсь вычислить определенный двойной интеграл, используя scipy. Интегральная функция немного сложна, так как содержит некоторые вероятностные распределения, чтобы определить вес вероятности каждого значения x и y (например, смешанной модели). Следующий код оценивается как отрицательное число, но оно должно быть связано с [0,1]. Кроме того, для вычисления потребовалось около получаса.
У меня есть два вопроса.
1) Есть ли лучший способ вычислить этот интеграл?
2) Откуда это отрицательное значение? Большой вопрос для меня - как ускорить вычисления, так как я могу найти ошибку в своем коде, которая позже приведет к отрицательному результату самостоятельно.
from scipy import stats
from scipy.integrate import dblquad
import itertools
p= [list whose entries are each different stats.beta(a,b) distributions]
def integrand(x,y):
delta=x-y
marg=0
for distA,distB in itertools.permutations(p,2):
first=distA.pdf(x)
second=distB.pdf(y)
weight1=0
weight2=0
for distC in p:
if distC == distA:
continue
w1=distC.cdf(x)-distC.cdf(y)
if weight1 == 0:
weight1=w1
else:
weight1=weight1*w1
marg+=(first*weight1*second)
I=delta*marg
return I
expect=dblquad(integrand,0,1,lambda x: 0, lambda x: x)
Это, по сути, вопрос, почему ожидаемое значение максимального расстояния между двумя точками находится в векторе распределений. Пределы интегрирования: y ∊ [0, x] и x ∊ [0,1]. Это дало мне около -49, с оценочной погрешностью интеграла порядка 10e-10, поэтому это не должно происходить из-за метода интегрирования.
Я боролся с этим некоторое время и ценю любую помощь. Спасибо.
редактировать: исправлена опечатка