Python: 指数函数与高斯函数的积分乘积
Python: Integrate product of exponential and gaussian function
我有一个函数 y,它是 y1 = exp(-x) 和 exp(-x^2) 的乘积:
y1 = exp(-x)
y2 = exp(-x**2)
y = y1*y2 = exp(-x)*exp(-x**2) = exp(-x **2-x)
使用 sympy 集成函数 y1 或 y2 效果很好:
>>> 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))
也许我是瞎子,漏掉了一些明显的东西。
如果 sympy 无法对其进行符号计算,那么它只是 returns 一个 Integral 对象。您需要使用更强大的符号计算器,如 maxima or Wolfram|Alpha (link to solution)),或者求助于数值积分。以下是对其进行数值积分的几个选项:
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]))
我相信 Integral 被接受了,它给了你一个有效的 sympy 结果。我使用了 this site 并且它表明(我不是一个足够的数学家来验证它)答案中有错误函数(erf):
没有确切的分析答案,所以它给你的是它的内部表示。我几年前使用过 Mathematica,它会做类似的事情,但它提供了解决方案的多项式近似值。顺便说一句,答案大约是 0.5456413607650471.
我使用 http://www.codecogs.com/latex/eqneditor.php 生成方程图像。
我有一个函数 y,它是 y1 = exp(-x) 和 exp(-x^2) 的乘积:
y1 = exp(-x)
y2 = exp(-x**2)
y = y1*y2 = exp(-x)*exp(-x**2) = exp(-x **2-x)
使用 sympy 集成函数 y1 或 y2 效果很好:
>>> 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))
也许我是瞎子,漏掉了一些明显的东西。
如果 sympy 无法对其进行符号计算,那么它只是 returns 一个 Integral 对象。您需要使用更强大的符号计算器,如 maxima or Wolfram|Alpha (link to solution)),或者求助于数值积分。以下是对其进行数值积分的几个选项:
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]))
我相信 Integral 被接受了,它给了你一个有效的 sympy 结果。我使用了 this site 并且它表明(我不是一个足够的数学家来验证它)答案中有错误函数(erf):
没有确切的分析答案,所以它给你的是它的内部表示。我几年前使用过 Mathematica,它会做类似的事情,但它提供了解决方案的多项式近似值。顺便说一句,答案大约是 0.5456413607650471.
我使用 http://www.codecogs.com/latex/eqneditor.php 生成方程图像。