SymPy:将符号/变量限制为间隔

时间:2013-10-23 22:40:58

标签: range intervals solver sympy

使用SymPy,是否可以将符号/变量的可能值限制在一定范围内?我现在可以在定义符号时设置一些属性,比如positive=True,但我需要更多的控制,即我需要将它设置为区间[0,1]。然后应该使用这个假设来解决,简化等等。

4 个答案:

答案 0 :(得分:6)

您可以将界限指定为不等式,例如x >= lbx <= ub,例如:

from sympy.solvers import solve
from sympy import Symbol
x = Symbol('x')
solve([x >= 0.5, x <= 3, x**2 - 1], x)

在这里,我们搜索等式x**2 == 1的解,使x位于[0.5, 3]区间。

答案 1 :(得分:4)

至于简化,您需要refine。不幸的是,它还不支持使用不等式语法,因此您必须使用Q.positiveQ.negative(或Q.nonpositiveQ.nonnegative来表示非严格不等式)。如果sqrt(x**2) = x

,它处理的最常见的简化是x >= 0
>>> refine(sqrt((x - 1)**2), Q.positive(x - 1))
x - 1
>>> refine(sqrt((x - 1)**2), Q.positive(x))
Abs(x - 1)

请注意,在第二种情况下,您仍然会得到一个更简单的答案,因为它至少知道x - 1在给定的假设下是真实的。

如果您的假设与“x为正”或“x为负”一样简单,那么成功的最佳机会就是在符号本身上定义,例如

>>> Symbol('x', positive=True)
>>> sqrt(x**2)
x

答案 2 :(得分:2)

现在您可以使用solveset

In [3]: solveset(x**2 - 1, x, Interval(0.5, 3)) Out[3]: {1}

答案 3 :(得分:0)

在第1.1.1段中,我发现这是有效的。它可以很容易地适应你的情况。

>>> x = Symbol('x', domain=S.Reals)
>>> solve_domain = And(0 <= x, x < 2*pi).as_set()
>>> solve_domain
[0, 2⋅π)
# solve_domain must be evaluated before solveset call
>>> solveset(sin(x), x, solve_domain)
{0, π}

如果你在调用solveset之前没有评估solve_domain,我不知道为什么事情会崩溃,但是一旦你知道就很容易解决。