我应该怎么做才能获得积分的“正常”结果?

时间:2018-03-12 21:58:01

标签: python-3.x sympy

我的练习是将一些功能与同情相结合。第一个积分是(我要在图像上添加它,因为我不能在这里使用乳胶,但你也可以在代码中看到它):
enter image description here

enter image description here
而a是一个真正的常数。

这是我的代码:

%pylab inline
from sympy import *
init_printing()
v, a = symbols('v, a', real=True, nonzero=True)
f = sqrt(2/pi)*(v**2*exp((-v**2)/(2*a**2)))/(a**3)
print(integrate(v*f, (v, 0, oo)))

(注意:我只使用print来获得这个可复制的结果) 但结果真的很难看:

Piecewise((2*sqrt(2)*a/sqrt(pi), Abs(periodic_argument(polar_lift(a)**(-2), oo)) < pi/2), (Integral(sqrt(2)*v**3*exp(-v**2/(2*a**2))/(sqrt(pi)*a**3), (v, 0, oo)), True))

但是有了修改

v, a = symbols('v, a', positive=True)

v, a = symbols('v, a', negative=True)

结果是

2*sqrt(2)*a/sqrt(pi)

但据我所知,唯一具有既不是负面也不是正面的属性的实数是零 - 并且应该用'非零=真'部分排除。

问:我的第一个代码可以做些什么来获得'好'的结果?

1 个答案:

答案 0 :(得分:1)

在当前的开发版本中,输出不那么难看:

Piecewise((2*sqrt(2)*a/sqrt(pi), pi/2 > 2*Abs(arg(a))), (Integral(sqrt(2)*v**3*exp(-v**2/(2*a**2))/(sqrt(pi)*a**3), (v, 0, oo)), True))

但仍有改进的余地。我建议在issue tracker提出问题。

变通方法

Piecewise的原因是,如果条件pi/2 > 2*Abs(arg(a))不成立,SymPy不确定积分是否收敛。既然你知道它会在你的上下文中收敛,你可以通过设置conds="none"来告诉SymPy不要理解收敛条件:

>>> integrate(v*f, (v, 0, oo), conds="none") 
2*sqrt(2)*a/sqrt(pi)

或者,使用假设:设置&#34;肯定&#34; a上的假设就足够了。您可以通过使用正符号临时交换a来完成整合步骤。

>>> apos = symbols('apos', positive=True)
>>> integrate(v*f.subs(a, apos), (v, 0, oo)).subs(apos, a)
2*sqrt(2)*a/sqrt(pi)

这允许a保持原样在更大的计算环境中。

解释

这里有一个非正式的解释,为什么假设(真实和非零)的影响小于(正面)或(负面)。

  1. 如果已知a是正面的,那么可以做某件事,并且它会产生很好的输出。
  2. 如果已知a为负数,则可以做另一件事,它会产生很好的输出。
  3. 鉴于a是真实且非零,SymPy问:我能做第一件事吗?不,因为无法保证a是正面的。然后它问:我能做第二件事吗?不,因为无法保证a是否定的。所以,都没有完成。

      

    核心问题是使用Python逻辑进行符号逻辑存在限制。在Python逻辑中,必须将所有内容评估为单个真值。在符号逻辑中,表达式可能具有未知的真值。另一个例子是被排斥的中间人的法律。 Python不知道&#34;东西或不是东西&#34;在没有首先评估&#34;东西&#34;的情况下,它总是真实的。符号逻辑可以知道这一点,即使&#34; stuff&#34;的真值。不明。 https://github.com/sympy/sympy/wiki/Assumptions-history