如何使用SciPy计算此类积分?
函数P1和P2的乘积取决于 x 和积分变量 du
将结果表示为lambda函数会很好,例如:
joint_p = lambda x:quad( [这里有些代码] ,...
答案 0 :(得分:1)
有没有理由直接使用scipy.integrate.quad
不起作用?我的意思是:
import scipy as sp
#define some dummy p1 and p2
p1 = lambda y: 3*y+2
p2 = lambda y: -4*y-4
#define p_{xi1+xi2}
pplus = lambda x: sp.integrate.quad(lambda u,x=x: p1(u)*p2(x-u),0,x)[0]
#define p_{xi1/xi2}
pdivide = lambda x: sp.integrate.quad(lambda u,x=x: u*p1(u)*p2(u/x),0,sp.minimum(x,1))[0]/x**2
#use it
x = 0.2
outplus = pplus(x)
outdivide = pdivide(x)
这将导致
print outplus, outdivide
-2.016 -8.06666666667
您可能希望定义一个正确的函数而不是后面的lambda
,以便捕获quad
的完整输出,以检查集成是否一切正常。
让我们查看sympy
:
import sympy as sym
U,X = sym.symbols('U,X')
pplus_sym = sym.lambdify(X,sym.integrate((3*U+2)*(-4*(X-U)-4),(U,0,X)))
dic = {'Min': sp.minimum}; #it's best if we tell lambdify what to use for Min
pdivide_sym = sym.lambdify(X,sym.integrate(U*(3*U+2)*(-4*(U/X)-4),(U,0,sym.Min(X,1)))/(X**2),dic)
然后结果是
print pplus_sym(x), pdivide_sym(x)
-2.016 -8.06666666667