我的练习是将一些功能与同情相结合。第一个积分是(我要在图像上添加它,因为我不能在这里使用乳胶,但你也可以在代码中看到它):
与
而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)
但据我所知,唯一具有既不是负面也不是正面的属性的实数是零 - 并且应该用'非零=真'部分排除。
问:我的第一个代码可以做些什么来获得'好'的结果?
答案 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
保持原样在更大的计算环境中。
这里有一个非正式的解释,为什么假设(真实和非零)的影响小于(正面)或(负面)。
a
是正面的,那么可以做某件事,并且它会产生很好的输出。 a
为负数,则可以做另一件事,它会产生很好的输出。 鉴于a
是真实且非零,SymPy问:我能做第一件事吗?不,因为无法保证a
是正面的。然后它问:我能做第二件事吗?不,因为无法保证a
是否定的。所以,都没有完成。
核心问题是使用Python逻辑进行符号逻辑存在限制。在Python逻辑中,必须将所有内容评估为单个真值。在符号逻辑中,表达式可能具有未知的真值。另一个例子是被排斥的中间人的法律。 Python不知道&#34;东西或不是东西&#34;在没有首先评估&#34;东西&#34;的情况下,它总是真实的。符号逻辑可以知道这一点,即使&#34; stuff&#34;的真值。不明。 https://github.com/sympy/sympy/wiki/Assumptions-history