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 ⎠   

Кто-нибудь знает, почему это не работает, или что делаю не так?


person Karl Yngve Lervåg    schedule 09.10.2012    source источник
comment
Аналогичный вопрос: stackoverflow.com/questions/67982482/   -  person Robert Pollak    schedule 17.06.2021


Ответы (3)


В вашем примере есть две проблемы.

Первый sqrt(x**2)==x только для положительных действительных чисел.

Во-вторых, для SymPy 1/2 и 0.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.

person Krastanov    schedule 09.10.2012
comment
Спасибо! Однако досадно просто и очевидно. :) - person Karl Yngve Lervåg; 10.10.2012
comment
Хотя: Разве не (-1)**2 = 1**2, так что sqrt(x**2)==x верно как для положительных, так и для отрицательных действительных чисел? Кроме того, для любого положительного действительного числа x, sqrt(x) имеет как положительную, так и отрицательную части? - person Karl Yngve Lervåg; 10.10.2012
comment
@ KarlYngveLervåg, (-1)**2 = 1**2 не имеет большого отношения к значению sqrt(x**2). Более того, хотя есть два решения для x**2=a, sqrt(a) имеет одно значение (положительное решение). Проверьте en.wikipedia.org/wiki/. - person Krastanov; 10.10.2012
comment
Моя точка зрения заключалась только в том, что если x реально, то x**2 обязательно положительно. В любом случае, еще раз спасибо за очень полезный вклад! - person Karl Yngve Lervåg; 11.10.2012
comment
Соответствующая проблема Sympy: документы «символы» должны быть более конкретными, github.com/sympy/sympy/issues / 21629 - person Robert Pollak; 17.06.2021

Я предполагаю, что вы объявляете x как x = Symbol('x'). Если вы измените его на x = Symbol('x', real=True), выражение следует упростить. Вы можете найти причину, по которой вы должны явно указать, что ваша переменная real, в симпатичный багтрекер.

person halex    schedule 09.10.2012

Вам нужна функция powdenest. Если передан параметр force=True, предположения будут игнорироваться.

>>> powdenest(sqrt(x**2), force=True)
x
person asmeurer    schedule 10.10.2012
comment
Спасибо, powdenest кажется полезным. - person Karl Yngve Lervåg; 10.10.2012