sympy - 在 Sympy 中定义符号的范围

标签 sympy simplify sqrt

在 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/

相关文章:

list - F#中元素的最优雅组合

C#高精度计算

C++语句可以简化

performance - MATLAB 中加速 exp(A*x) 的解析方法

python - Gmpy sqrt精度

c - 快速反演算法比 math.h 1/sqrt 函数慢

python - 使用 sympy 扩展索引符号方程

python-3.x - 在 SymPy 中定义保存数值的符号

latex - 在 SymPy 中获取特定符号

python - Python 中的系数矩阵 - 组元素