使用 SymPy,是否可以将符号/变量的可能值限制在某个范围内?我现在可以在定义符号时设置一些属性,例如positive=True
,但我需要更多控制,即我需要将其设置在区间 [0,1] 内。然后应该使用这个假设来求解、简化等。
问问题
10633 次
4 回答
11
您可以将边界指定为不等式,例如x >= lb
和x <= 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]
。
于 2013-10-24T15:40:30.063 回答
4
至于简化,你想要refine
. 不幸的是,它还不支持使用不等式语法,因此您必须使用Q.positive
or Q.negative
(或Q.nonpositive
orQ.nonnegative
用于非严格不等式)。它处理的最常见的简化是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)
请注意,在第二种情况下,您仍然会得到一个更简单的答案,因为它至少知道x - 1
在给定的假设下这是真实的。
如果您的假设与“x
是肯定的”或“x
是否定的”一样简单,那么成功的最佳机会就是在符号本身上定义它,例如
>>> Symbol('x', positive=True)
>>> sqrt(x**2)
x
于 2013-10-25T01:09:51.870 回答
3
现在你可以使用solveset
In [3]: solveset(x**2 - 1, x, Interval(0.5, 3))
Out[3]: {1}
于 2016-07-17T13:24:41.273 回答
0
在 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,我不知道为什么事情会分崩离析,但是一旦您知道,就很容易解决。
于 2018-01-25T22:18:05.110 回答