Sympy:简化平方根的平方

3

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

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

我无法使用其他变体的simplify函数使其正常工作,特别是我认为b.powsimp()应该可以工作。

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

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


类似问题:https://stackoverflow.com/questions/67982482/sympy-simplify-small-compound-fraction-with-squares-and-roots - Robert Pollak
3个回答

6
您的示例存在两个问题。
首先,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 对象。


谢谢!虽然很简单和显而易见,但有点烦人。 :) - Karl Yngve Lervåg
虽然:不是 (-1)**2 = 1**2,但是对于正负实数,sqrt(x**2)==x 是成立的吗?此外,对于任何正实数 xsqrt(x) 都有正负两个部分? - Karl Yngve Lervåg
@KarlYngveLervåg,(-1)**2 = 1**2sqrt(x**2)的值没有太大关系。此外,虽然x**2=a确实有两个解,但sqrt(a)只有一个值(即正解)。请参考http://en.wikipedia.org/wiki/Square_root#Principal_square_root_of_a_complex_number。 - Krastanov
我的意思只是如果 x 是实数,那么 x**2 必然是正数。不管怎样,再次感谢非常有用的建议! - Karl Yngve Lervåg
相关的Sympy问题:“'symbols'文档应该更具体”,https://github.com/sympy/sympy/issues/21629 - Robert Pollak

3
您需要的函数是 powdenest。如果传递了 force=True 参数,它将忽略假设。
>>> powdenest(sqrt(x**2), force=True)
x

谢谢,powdenest 看起来很有用。 - Karl Yngve Lervåg

3

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接