2017-06-22 85 views
1

我已经将符号设置为positive = True,并且已经检查了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 
+0

您能否提供您从wolfram alpha获得的输出?再次验证你的等式。在我看来,'sp.integrate(sp.exp(-z)* sp.exp(z ** 2),(z,-sp.oo,b))'不能收敛,所以你的整个表达式不应该收敛。 – Hannebambel

+0

我把sp.oo切换到100,它仍然没有评估: '63493635934241 * exp(3893/8)*积分(exp(-15 * x)* exp(x ** 2/2),(x, (exp(-17 * y/4)* exp(y ** 2/8),(y,-100,B))*积分(exp(-52 * z)* exp 2 * z ** 2),(z,-100,A))/ 1000000000000000' Wolfram [link](https://www.wolframalpha.com/input/?i=63493635934241*exp(3893%2F8) *积分(EXP(-15 * X)* EXP(X ** 2%2F2),+(X,+ C,+ 100))*积分(EXP(-17 * Y%2F4)* EXP(Y ** 2%2F8),+(Y,+ - 100,+ B))*积分(EXP(-52 * Z)* EXP(2 * Z ** 2),+(Z,+ - 100,+ A)) %2F1000000000000000) – japseow

+0

感谢您的链接。我仍然希望看到你的原始问题,即积分中的无穷大。只是出于好奇心,阿尔法对这个说法。 – Hannebambel

回答

2

sympy是很能够 “解决” 这个积分用有限的限制:

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会在将它传递给sympy之前将其评估为一些浮点数。

出于某种原因sympy不计算下面的积分:

sym.pprint(sym.integrate(sym.exp(-x)*sym.exp(x**2),(x,0,100))) 

如果你告诉sympy整合之前要简化表达然而它的作用:

sym.pprint(sym.integrate(sym.powsimp(sym.exp(-x)*sym.exp(x**2)),(x,0,100))) 

编辑:类似于japseow的评论我发现了一种更简单的方式来进行整合。 Simpliy添加以下到上面的代码:

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)) 

或作为一个衬里(以下容易阅读,但仍然精确的)

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)) 

最后一行显示,这两种方法导致完全相同的结果。

+0

哦,我明白了,那很整洁!感谢您为我清理的东西:) – japseow

+0

有反正我可以做到这一点没有分裂f2分开?它应该是基于一些输入矩阵的可变函数。我为整个函数尝试了powsimp()并整合了整个东西,但它似乎不起作用。 – japseow

+0

我注意到了这一点,这就是为什么我决定拆分它;-​​)我会看看如果我能找到其他东西来使它工作,但可能仍然是这个案件的具体情况。如果你的输入矩阵产生其他函数,你的milage可能会有所不同。 – Hannebambel