【问题标题】:Sympy: Simplifying square roots of squaresSympy:简化平方的平方根
【发布时间】:2012-10-09 09:24:17
【问题描述】:

Sympy 似乎无法简化涉及变量平方根的表达式:

In [28]: a = x**2
In [29]: b = a**(1/2)
In [30]: b
Out[30]: 
    0.5
⎛ 2⎞   
⎝x ⎠   
In [31]: b.simplify()
Out[31]: 
    0.5
⎛ 2⎞   
⎝x ⎠   

我无法让它与simplify 的其他变体一起使用,尤其是我认为b.powsimp() 应该可以使用。

In [32]: b.powsimp()
Out[32]: 
    0.5
⎛ 2⎞   
⎝x ⎠   

有谁知道为什么这不起作用,或者我做错了什么?

【问题讨论】:

标签: python simplify sympy


【解决方案1】:

你的例子有两个问题。

第一个sqrt(x**2)==x 仅用于实数。

其次,对于 SymPy,1/20.5 不是同一个东西。第一个是Rational 实例,第二个是float 实例。

最后,举个例子:

>>> x = Symbol('x', real=True)
>>> (x**2)**(1./2)
∣x∣**1.0
>>> (x**2)**(S(1)/2) # S() is short for sympify()
∣x∣

sympify 将 python 对象转换为更合适的 SymPy 对象。

【讨论】:

  • 谢谢!然而,令人讨厌的简单和明显。 :)
  • 虽然:不是(-1)**2 = 1**2,这样sqrt(x**2)==x 对正实数和负实数都为真?此外,对于任何正实数xsqrt(x) 既有正的部分又有负的部分?
  • @KarlYngveLervåg, (-1)**2 = 1**2sqrt(x**2) 的值没有太大关系。此外,虽然x**2=a 确实有两种解决方案,但sqrt(a) 有一个值(正解)。检查en.wikipedia.org/wiki/…
  • 我的意思是,如果x 是真实的,那么x**2 必然是肯定的。无论如何,再次感谢您提供非常有用的意见!
  • 相关 Sympy 问题:“'symbols' 文档应该更具体”,github.com/sympy/sympy/issues/21629
【解决方案2】:

我假设您将x 声明为x = Symbol('x')。如果将其更改为x = Symbol('x', real=True),则应简化表达式。您可以在sympy bugtracker 中找到必须明确声明您的变量为real 的原因。

【讨论】:

    【解决方案3】:

    你想要的函数是powdenest。如果传递了force=True 参数,它将忽略假设

    >>> powdenest(sqrt(x**2), force=True)
    x
    

    【讨论】:

    • 谢谢,powdenest 似乎很有用。
    猜你喜欢
    • 1970-01-01
    • 2021-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多