假设正数时,Sympy可能存在不一致

时间:2016-06-15 10:00:36

标签: python sympy

在Python 2.7.11上使用Sympy软件包版本1.0我发现(对我而言)是不一致的。这是我使用的代码:

import sympy as sy
from sympy.stats import Normal, density
from sympy.assumptions import assuming, Q, ask

sy.init_printing()

a = sy.symbols('a', real=True)
with assuming(Q.positive(a)): 
    print ask(Q.positive(a))
    N = Normal('N', 0, a)

我得到的是

True
从预期的第一次打印

,但创建Normal对象时出现异常

ValueError: Standard deviation must be positive

任何人都可以解释一下是不是这样,为什么?谢谢!

PS:我知道我可以宣布这些符号是正面的

1 个答案:

答案 0 :(得分:3)

问题很简单:SymPy中有两个假设系统,称为旧式和新式假设。他们还没有很好地互动。

旧式假设定义了符号的谓词,例如

x = Symbol("x", positive=True)
然后使用诸如.is_positive

之类的方法对通用表达式执行

推导

>>> x.is_positive
True

最新版本的SymPy已将旧式假设与新式假设相关联,因此您现在可以查询

>>> ask(Q.positive(x))
True

旧版本的SymPy会返回None,因为两个假设系统根本没有关联。

问题是这种关系尚未互惠:旧式假设系统不了解用新式假设系统定义的假设。您可以自己验证:

>>> with assuming(Q.positive(y)):
...    print y.is_positive    
None

随机变量 Normal 要求标准差参数为正,验证是使用旧式假设完成的。因此,您的案件失败了。

请注意,标准偏差的积极性条件很可能在下一个SymPy版本中放松到非负性条件(即允许接受积极性 - 不确定的情况)。