Есть ли обходной путь для очевидной неспособности SymPy упростить sqrt (x ** 2 + 2 * x + 1)?
from sympy import *
x = Symbol('x', real=True, positive=True)
simplify(sqrt(x**2)) # returns x
simplify(sqrt(x**2+2*x+1)) #fails to return x+1
SymPy не пытается все упростить на первый взгляд, слишком много проблем (начиная с производительности), если он это сделал. См. Статью Автоматическое упрощение в вики-сайте SymPy.
Если вы хотите разложить выражение на множители, вы должны сказать SymPy сделать это.
factor(sqrt(x**2+2*x+1)) # returns x+1
Формула sqrt(x**2)
становится x
, потому что (x**a)**b
можно безопасно объединить с x**(a*b)
, когда основание положительно, а показатели степени действительны. (Даже в этом случае «может» не всегда означает «должно быть». В SymPy присутствует некоторое автоматическое упрощение, может быть, даже слишком много.)
Ключевое различие между ними заключается в том, что x**2
- это явно сила, а x**2 + 2*x + 1
- сумма.
Я отредактировал свой вопрос, добавив «упрощать», что также не учитывается. Так что я полагаю, что дело в упрощении без попытки разложить на множители, чем что-либо, имеющее квадратный корень.
simplify
не считает, что (x+1)**2
проще, чем x**2+2*x+1
; этот точный пример рассматривается в руководство. Конечно, с квадратным корнем наверху (и с положительным x), вероятно, и должно. Тем не менее, типичный ответ состоит в том, что упрощение не является четко определенным понятием, как факторизация; поэтому для получения предсказуемой производительности следует применять определенные преобразования, такие как factor
, expand
, logcombine
и т. д.
Любое предложение о том, что можно сделать, когда ввод продиктован пользователем, а не разработчиком? Другими словами, мой код не знает, с каким выражением он имеет дело. (Кроме того, упрощение (x + 1 - sqrt (x ** 2 + 2 * x + 1)) не равно нулю.)
Вы можете поднять вопрос о подобном упрощении на SymPy трекер. В общем, неизбежно, что часть пользовательского ввода оставит пользователя неудовлетворенным упрощением, которое они получили от SymPy.
Я считаю, что это всегда автоматически упрощается