如何使用SciPy计算依赖于两个变量的积分?

时间:2015-12-13 15:32:34

标签: python numpy scipy

如何使用SciPy计算此类积分?

函数P1和P2的乘积取决于 x 和积分变量 du

将结果表示为lambda函数会很好,例如:

joint_p = lambda x:quad( [这里有些代码] ,...

enter image description here

1 个答案:

答案 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