我使用关系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
那么如何评估给定符号值的关系约束呢?
答案 0 :(得分:4)
evalf
用于表达式的数值计算,这不是你想要的。只需使用subs
,就像您发现的那样
>>> constraint1.subs(x, -3)
False
请注意,如果你插入一些无法弄清楚的内容,它仍然会被评估:
>>> contraint1.subs(x, y)
y >= 0
此外,subs只进行基本检查。如果您需要更高级的检查,则应使用ask
(ask
目前不会转换不等式,因此您需要手动将它们转换为Q.positive
或Q.nonnegative
。