在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:我知道我可以宣布这些符号是正面的
解决方法:
问题很简单: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版本中,标准偏差的积极性条件可能会放松到非负性条件(即允许接受积极性 – 不确定的情况).