SymPy simpleify не пытается факторинг

Есть ли обходной путь для очевидной неспособности 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

Я считаю, что это всегда автоматически упрощается

Jonas Wolff 09.09.2018 11:18
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
69
1

Ответы 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 - сумма.

Я отредактировал свой вопрос, добавив «упрощать», что также не учитывается. Так что я полагаю, что дело в упрощении без попытки разложить на множители, чем что-либо, имеющее квадратный корень.

Wynne 09.09.2018 19:31
simplify не считает, что (x+1)**2 проще, чем x**2+2*x+1; этот точный пример рассматривается в руководство. Конечно, с квадратным корнем наверху (и с положительным x), вероятно, и должно. Тем не менее, типичный ответ состоит в том, что упрощение не является четко определенным понятием, как факторизация; поэтому для получения предсказуемой производительности следует применять определенные преобразования, такие как factor, expand, logcombine и т. д.
user6655984 09.09.2018 22:24

Любое предложение о том, что можно сделать, когда ввод продиктован пользователем, а не разработчиком? Другими словами, мой код не знает, с каким выражением он имеет дело. (Кроме того, упрощение (x + 1 - sqrt (x ** 2 + 2 * x + 1)) не равно нулю.)

Wynne 10.09.2018 12:11

Вы можете поднять вопрос о подобном упрощении на SymPy трекер. В общем, неизбежно, что часть пользовательского ввода оставит пользователя неудовлетворенным упрощением, которое они получили от SymPy.

user6655984 10.09.2018 15:31

Другие вопросы по теме