SymPy: Limit symbol/variable to interval

10,531

Solution 1

You can specify the bounds as inequalities such as x >= lb and x <= ub, for example:

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

Here we search for a solution of equation x**2 == 1 such that x is in the interval [0.5, 3].

Solution 2

As for simplification, you want refine. Unfortunately, it doesn't yet support using inequality syntax, so you'll have to use Q.positive or Q.negative (or Q.nonpositive or Q.nonnegative for non-strict inequalities). The most common simplification that it handles is sqrt(x**2) = x if x >= 0.

>>> refine(sqrt((x - 1)**2), Q.positive(x - 1))
x - 1
>>> refine(sqrt((x - 1)**2), Q.positive(x))
Abs(x - 1)

Note in the second case you still get a simpler answer because it at least knows that x - 1 is real under the given assumptions.

If your assumptions are as simple as "x is positive" or "x is negative", the best chance for success is to define it on the Symbol itself, like

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

Solution 3

Now you can use solveset

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

Share:
10,531

Related videos on Youtube

Se Norm
Author by

Se Norm

Updated on September 15, 2022

Comments

  • Se Norm
    Se Norm over 1 year

    Using SymPy, is it possible to limit the possible values of a symbol/variable to a certain range? I now I can set some properties while defining symbols, like positive=True, but I need more control, i.e. I need to set it to be in the interval [0,1]. This assumption should then be used for solving, simplifying etc.

  • Se Norm
    Se Norm over 10 years
    Thanks, that works. However, I need the same for multiple variables at the same time, which raises NotImplementedError: only univariate inequalities are supported. Too bad...
  • ρяσѕρєя K
    ρяσѕρєя K almost 8 years
    Add some explanation with answer for how this answer help OP in fixing current issue
  • Se Norm
    Se Norm almost 8 years
    Does that work for multiple variables and inequalities as well?