在 Sympy 中,可以定义符号可能采用的值的约束
x = symbols('x', real=True)
是否可以说一个符号只能在一定范围内取值,比如-1 < x < 1
?我对此感兴趣的原因是因为我试图让 sympy 自动简化如下所示的表达式
expr = sqrt(1+x) * sqrt((1-x)*(1+x)) / sqrt(1-x)
正在运行simplify(expr)
不会产生任何简化,而当-1<x<1
时简化的结果应该是 1+x
。我如何获得 sympy 来简化上面的表达式?
最佳答案
虽然单个符号不能满足该假设,但表达式可以。让我们定义一个具有所需范围的表达式:
>>> p = Symbol('p', positive=True)
>>> neg1to1 = (p - 1)/(p + 1)
现在用该值替换 x 并简化
>>> asp = expr.subs(x, neg1to1).simplify(); asp
2*p/(p + 1)
现在从 x 与 neg1to1
之间的关系恢复 x:
>>> p_as_x = solve(neg1to1 - x, p)[0]
>>> asp.subs(p, p_as_x).simplify()
x + 1
您可以将其转换为一个函数,以允许 x 的任何范围:
>>> def simplify_assuming_range(expr, x, lo, hi):
... from sympy import Dummy, solve
... p = Dummy(positive=True)
... xr = (p - 1)/(p + 1)*(hi - lo) + lo
... rx = solve(xr - x, p)[0]
... return expr.subs(x, xr).simplify().subs(p, rx).simplify()
...
>>> simplify_assuming_range(expr,x,-1,1)
x + 1
关于sympy - 在 Sympy 中定义符号的范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33027352/