2012-10-09 102 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'似乎很有用。 –