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:我知道我可以宣布这些符号是正面的

解决方法:

问题很简单: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版本中,标准偏差的积极性条件可能会放松到非负性条件(即允许接受积极性 – 不确定的情况).

上一篇:python – 在sympy中进行符号集成的快速方法是什么?


下一篇:python – SymPy虚数