3

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 ⎠   

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

4

3 回答 3

6

你的例子有两个问题。

首先sqrt(x**2)==x仅适用于实数。

其次,对于 SymPy1/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 对象。

于 2012-10-09T17:25:41.030 回答
3

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

于 2012-10-09T09:53:40.497 回答
3

你想要的功能是powdenest. 如果传递force=True参数,它将忽略假设

>>> powdenest(sqrt(x**2), force=True)
x
于 2012-10-10T02:47:51.117 回答