SymPy: Limit symbol/variable to interval

假装没事ソ 提交于 2019-12-18 20:18:36

问题


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.


回答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].




回答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



回答3:


Now you can use solveset

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




回答4:


In sympy 1.1.1 I found that this works. It can be easily adapted to your case.

>>> 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, π}

I don't know why things fall apart if you don't evaluate solve_domain before calling solveset, but it's easy to work around once you know.



来源:https://stackoverflow.com/questions/19553652/sympy-limit-symbol-variable-to-interval

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!