вычислить интеграл, используя scipy, где подынтегральное выражение - это произведение с параметрами, поступающими из (произвольно длинного) списка - PullRequest
0 голосов
/ 05 февраля 2019

Я хочу решить проблему со сборщиком купонов в общем случае (с разными возможностями для каждого купона), используя формулу Флайолета, которую я нашел в википедии (см. https://en.wikipedia.org/wiki/Coupon_collector%27s_problem).). По формуле я должен вычислить интеграл, гдеподынтегральное выражение является продуктом. Я использую scipy.integrad.quad и лямбда-нотацию для интеграции. Проблема в том, что число факторов в подынтегральном выражении не является фиксированным (имеет параметры, поступающие из списка). Когда я пытаюсь умножитьФакторы интегрирования Я получаю ошибку, так как я не могу умножить формальные выражения, по-видимому. Но если я этого не сделаю, я не знаю, как получить переменную интеграции x in.

Я нашел способы интегрировать продукт,если есть, например, только два фактора. И это, кажется, не связано с двойной интеграцией или чем-то подобным. Может ли кто-нибудь помочь (я новичок в этом деле)?

import numpy as np
from scipy import integrate
....
def compute_general_case(p_list):
    integrand = 1
    for p in p_list:
        integrand_factor = lambda x: 1 - np.exp(-p * x)
        integrand *= integrand_factor
    integrand = 1 - integrand
    erg = integrate.quad(integrand, 0, np.inf)
    print(erg)

1 Ответ

0 голосов
/ 05 февраля 2019

Вы можете определить функцию интеграции с произвольным числом аргументов, при условии, что вы передадите их quad, используя args=:

def integrand(x, *p_list):
    p_list = np.asarray(p_list)
    return 1 - np.product(1 - np.exp(-x * p_list))   #don't need to for-loop a product in numpy

result, abserr = quad(integrand, 0, np.inf, args=[1,1,1,1])
print(result, abserr)
>> 2.083333333333334 2.491001112400493e-10

Для получения дополнительной информации см. здесь

...