2012-10-09 67 views
2

Sympy似乎并不能够简化,其中一个变量的平方的平方根参与的表达式: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 ⎠ 

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

回答

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对象。

+0

谢谢!尽管简单而明显。 :) –

+0

虽然:不是'(-1)** 2 = 1 ** 2',这样sqrt(x ** 2)== x'对于正和负实数都是正确的吗?此外,对于任何正实数'x','sqrt(x)'既有正数也有负数? –

+0

@KarlYngveLervåg,'(-1)** 2 = 1 ** 2'与'sqrt(x ** 2)'的值没有多大关系。此外,虽然'x ** 2 = a'的确有两种解决方案,'sqrt(a)'具有单个值(正解)。检查http://en.wikipedia.org/wiki/Square_root#Principal_square_root_of_a_complex_number – Krastanov

3

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

2

你想要的功能是powdenest。如果通过force=True参数,它将忽略假设

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

谢谢,'powdenest'似乎很有用。 –