【问题标题】:Defining a range for a symbol in Sympy在 Sympy 中定义符号的范围
【发布时间】:2016-01-06 18:11:43
【问题描述】:

在 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。如何获得同情以简化上述表达式?

【问题讨论】:

  • 您可以使用新的样式假设声明 Q.positive(x+1) & Q.positive(x-1)。不幸的是,新假设尚未与推理规则相关联,因此它们目前毫无用处。另请注意,在这种情况下,简化会忽略假设,否则会太慢。

标签: sympy simplify sqrt


【解决方案1】:

虽然单个符号不能支持该假设,但表达式可以。让我们定义一个具有所需范围的表达式:

>>> p = Symbol('p', positive=True)
>>> neg1to1 = (p - 1)/(p + 1)

现在用那个值替换 x 并简化

>>> asp = expr.subs(x, neg1to1).simplify(); asp
2*p/(p + 1)

现在从它和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

【讨论】:

    【解决方案2】:

    使用有针对性的强制扩张会有所帮助:

    >>> expand(expr, power=True, force=True, mul=False)
    x + 1
    

    expand 文档字符串将说明每个选项。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-15
      • 2014-08-23
      相关资源
      最近更新 更多