SymPy:将符号/变量限制在区间内

18
使用 SymPy,是否可以将符号/变量的可能值限制在某个范围内?我知道可以在定义符号时设置一些属性,例如 positive=True,但我需要更多控制,即我需要将它设置为在区间 [0,1] 中。然后应该使用此假设进行求解、简化等操作。
4个回答

11

您可以将边界指定为不等式,例如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] 内。


10
谢谢,那个有效。不过,我需要同时对多个变量执行相同的操作,这将引发NotImplementedError错误:只支持单变量不等式。很遗憾… - Se Norm

6

如果要简化表达式,可以使用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

4

现在你可以使用 solveset

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


1
为了帮助 OP 解决当前的问题,可以在答案中添加一些解释说明。 - ρяσѕρєя K
3
这对多个变量和不等式也适用吗? - Se Norm

2
在sympy 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,事情就会分崩离析,但一旦你知道了这种情况,就很容易解决。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接