如何检查sympy关系是否适用于某些值

时间:2013-11-16 23:28:10

标签: python sympy

我使用关系GreaterThan定义了一些约束 -

x = sympy.Symbol('x')
constraint1 = (x >= 0)

我现在想检查约束是否适用于任意值'x'。我尝试使用sympy.checksol,但得到属性错误,所以我猜这不是要走的路 -

In [7]: sympy.checksol(constraint1, {x: 3})
---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-7-cc41bd5986e3> in <module>()
----> 1 sympy.checksol(constraint1, {x: 3})

/Library/Python/2.7/site-packages/sympy/solvers/solvers.pyc in checksol(f, symbol, sol, **flags)
    200         if attempt == 0:
    201             val = f.subs(sol)
--> 202             if val.atoms() & illegal:
    203                 return False
    204         elif attempt == 1:

AttributeError: 'bool' object has no attribute 'atoms'

我甚至试过constraint1.evalf,但它总是回归自己 -

In [10]: constraint1.evalf(subs={x: 3})
Out[10]: x >= 0

In [11]: constraint1.evalf(subs={x: -3})
Out[11]: x >= 0

那么如何评估给定符号值的关系约束呢?

1 个答案:

答案 0 :(得分:4)

evalf用于表达式的数值计算,这不是你想要的。只需使用subs,就像您发现的那样

>>> constraint1.subs(x, -3)
False

请注意,如果你插入一些无法弄清楚的内容,它仍然会被评估:

>>> contraint1.subs(x, y)
y >= 0

此外,subs只进行基本检查。如果您需要更高级的检查,则应使用askask目前不会转换不等式,因此您需要手动将它们转换为Q.positiveQ.nonnegative