Python 积分无法计算

Python 积分无法计算,python,sympy,Python,Sympy,我已经将符号设置为正=真,并且我已经检查了Wolfram Alpha上的积分。积分应该是可行的,并且输出应该包含一个erfi函数 >>> sp_int = sp.integrate(f2, (z, -sp.oo, a3), (y, -sp.oo, a4), (x, SPR1, sp.oo)) >>> f2 63493635934241*exp(3893/8)*exp(-15*x)*exp(x**2/2)*exp(-17*y/4)*exp(y**2/8)*exp

我已经将符号设置为正=真,并且我已经检查了Wolfram Alpha上的积分。积分应该是可行的,并且输出应该包含一个erfi函数

>>> sp_int = sp.integrate(f2, (z, -sp.oo, a3), (y, -sp.oo, a4), (x, SPR1, sp.oo))
>>> f2
63493635934241*exp(3893/8)*exp(-15*x)*exp(x**2/2)*exp(-17*y/4)*exp(y**2/8)*exp(-52*z)*exp(2*z**2)/1000000000000000
>>> sp_int
63493635934241*exp(3893/8)*Integral(exp(-15*x)*exp(x**2/2), (x, SPR1, oo))*Integral(exp(-17*y/4)*exp(y**2/8), (y, -oo, a4))*Integral(exp(-52*z)*exp(2*z**2), (z, -oo, a3))/1000000000000000
Symphy完全能够使用有限极限“求解”该积分:

import sympy as sym

x, y, z = sym.symbols('x y z', real=True)
a3, a4, SPR1 = sym.symbols('a3, a4, SPR1', real=True, positive=True)

f2 = sym.Rational(63493635934241,1000000000000000)*sym.exp(3893/8)*sym.exp(-15*x)*sym.exp(x**2/2)*sym.exp(-17*y/4)*sym.exp(y**2/8)*sym.exp(-52*z)*sym.exp(2*z**2)

gx = sym.exp(-15*x)*sym.exp(x**2/2)
gy = sym.exp(-17*y/4)*sym.exp(y**2/8)
gz = sym.exp(-52*z)*sym.exp(2*z**2)

Gx = sym.integrate(sym.powsimp(gx), (x,SPR1, 100))
Gy = sym.integrate(sym.powsimp(gy), (y,-100, a4))
Gz = sym.integrate(sym.powsimp(gz), (z,-100, a3))

sym.pprint(Gx)
sym.pprint(Gy)
sym.pprint(Gz)

F2 = sym.Rational(63493635934241,1000000000000000)*sym.exp(sym.Rational(3893,8))*Gx*Gy*Gz

sym.pprint(F2)
sym.pprint(sym.simplify(F2))
注意使用
sym.Rational(3893,8)
代替
3893/8
。这确保sympy将该数字视为有理数。否则,python将在将其传递给Symphy之前对其进行一些浮点计算

出于某种原因,Symphy不计算以下积分:

sym.pprint(sym.integrate(sym.exp(-x)*sym.exp(x**2),(x,0,100)))
但是,如果在积分之前让Symphy简化表达式,则会发生以下情况:

sym.pprint(sym.integrate(sym.powsimp(sym.exp(-x)*sym.exp(x**2)),(x,0,100)))
编辑:与japseow的评论类似,我发现了一种更简单的集成方法。简单地在上述代码中添加以下内容:

F2x = sym.integrate(f2.powsimp(), (x,SPR1, 100))
F2xy = sym.integrate(F2x.powsimp(), (y,-100, a4))
F2xyz = sym.integrate(F2xy.powsimp(), (z,-100, a3))

sym.pprint(F2xyz)

sym.pprint(sym.simplify(F2-F2xyz))
或者作为一行(不太容易阅读,但仍然准确)


最后一行显示两种方法得到完全相同的结果。

请提供您从wolfram alpha获得的输出?再次验证你的方程。在我看来,
sp.integrate(sp.exp(-z)*sp.exp(z**2),(z,-sp.oo,b))
无法收敛,所以你的整个表达式不应该收敛。我将sp.oo切换到100,它仍然没有计算:
63493635934241*exp(3893/8)*Integral(exp(-15*x)*exp(x**2/2),(x,C,100))*Integral(exp(-17*y/4)*exp(y**2/8),-100,b))*Integral(exp(-52*z)*exp(2*z**2),(z,-100,A))/10000000000000
Wolfram感谢您的链接。我仍然希望看到Wolfram alpha与您的原始问题有关的内容,即积分中的无穷大。只是出于对Wolfram alpha对此的解释的好奇。哦,我明白了,这很好!感谢您为我澄清了一切:)不管怎样,我可以在不分开f2的情况下这样做吗?它应该是一个基于一些输入矩阵的变量函数。我尝试对整个函数使用powsimp()并对整个函数进行集成,但它似乎不起作用。我注意到了同样的情况,这就是我决定拆分它的原因;-)我会看看我是否能找到其他的方法来让它工作,但可能仍然是针对这个案例的。如果你的输入矩阵产生其他函数,你的理解可能会有所不同。我认为这是因为在一次积分之后,它会取消所有的东西,你必须重新生成表达式。这是有效的:
f=f.expand().nsimpilify()
integral\u z=sym.integrate(f.powsimp(),(z,-100,A))
integral\u zy=sym.integral(integral_z.powsimp(),(y,-100,B))
integral_zyx=sym.integral(integral_zy.powsimp(),(x,C,100))
integral_zyx.subs({A:1,B:1,C:1}).evalf()
F2complete = sym.integrate(sym.integrate(sym.integrate(f2.powsimp(), (x,SPR1, 100)).powsimp(), (y,-100,a4)).powsimp(), (z,-100,a3))

sym.pprint(F2complete)

sym.pprint(sym.simplify(F2-F2complete))