Python: интегрировать произведение экспоненциальной и гауссовой функции

У меня есть функция y, которая является произведением y1 = exp(-x) и exp(-x^2):

у1 = ехр(-х)

у2 = ехр(-х**2)

y = y1*y2 = exp(-x)*exp(-x**2) = exp(-x **2-x)

Интеграция функций y1 или y2 отлично работает с использованием sympy:

>>> import sympy as sy
>>> import numpy as np
>>> x = sy.Symbol('x')
>>> y1 = sy.exp(-x)
>>> sy.integrate(y1, (x, 0, np.inf))
1

а также

>>> y2 = sy.exp(-x**2)
>>> sy.integrate(y2, (x, 0, np.inf))
0.5*sqrt(pi)

Однако всякий раз, когда я пытаюсь интегрировать произведение y1*y2 = y, интеграл не принимается:

>>> y = y1*y2
>>> sy.integrate(y, (x, 0, np.inf))
Integral(exp(-x)*exp(-x**2), (x, 0, np.inf))

Возможно, я слеп и упускаю что-то очевидное.


person Retze    schedule 21.09.2017    source источник
comment
Никакой ошибки не выдает? Integral(exp(-x)*exp(-x**2), (x, 0, np.inf)) это весь возвращаемый вывод?   -  person pretzlstyle    schedule 22.09.2017
comment
@jphollowed не дает мне никаких ошибок, только этот вывод   -  person Retze    schedule 22.09.2017


Ответы (2)


Если sympy не может оценить его символически, то он просто возвращает объект Integral. Вам нужно либо использовать более мощный символьный калькулятор, например maxima, либо Wolfram|Alpha (ссылка на решение)), либо прибегнуть к численному интегрированию. Вот несколько вариантов численного интегрирования:

import sympy as sy
import numpy as np
import scipy as sp
import scipy.integrate

x = sy.Symbol('x')
y1 = sy.exp(-x)
y2 = sy.exp(-x**2)
y = y1*y2

# Pure scipy without sympy
print(sp.integrate.quad(lambda x: np.exp(-x) * np.exp(-(x**2)), 0, np.inf))

# Mix of scipy and sympy
print(sp.integrate.quad(lambda x_arg: y.subs(x, x_arg).evalf(), 0, np.inf))

# Without using scipy
print(sy.mpmath.quad(sy.lambdify([x], y), [0, np.inf]))
person Scott B    schedule 21.09.2017
comment
Большое спасибо, приятель. Похоже, я придерживаюсь численного интегрирования. - person Retze; 22.09.2017

Я считаю, что Integral принимается и дает вам достоверный результат. Я использовал этот сайт, и он указывает (я недостаточно математик, чтобы проверить это) ответ имеет функцию ошибки (erf):

введите здесь описание изображения

Точного аналитического ответа нет, поэтому он дает вам свое внутреннее представление. Я использовал Mathematica много лет назад, и она делала что-то подобное, но давала полиномиальное приближение к решению. Кстати, ответ примерно 0,5456413607650471.

Я использовал http://www.codecogs.com/latex/eqneditor.php создать изображение уравнения.

person William Allcock    schedule 21.09.2017
comment
Спасибо за ваш вклад. Да, интеграция этого типа функции имеет тенденцию создавать функцию ошибки erf (x), подобную той, которую вы упомянули. - person Retze; 22.09.2017