在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:我知道我可以宣布这些符号是正面的
答案 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版本中放松到非负性条件(即允许接受积极性 - 不确定的情况)。