#python #sympy #symbolic-math #sqrt
#python #sympy #символьно-математический #sqrt
Вопрос:
В SymPy есть полезная функция для создания словаря коэффициентов для данного выражения.
Однако я сталкиваюсь с раздражающей ошибкой (/ feature?) при этом квадратные корни считаются частью переменной, а не частью значения коэффициента.
Минимальный пример:
from sympy import sqrt, symbols
k, t = symbols('k, t')
d = 1.5*t 2.5*sqrt(2)*k
d.as_coefficients_dict()
Это возвращает:
{𝑡:1.5, sqrt(2)*𝑘:2.5}
Когда вместо этого sqrt (2) следует рассматривать как часть коэффициента. Таким образом, я ожидал увидеть результат:
{𝑡:1.5, 𝑘:2.5*sqrt(2)}
ПРИМЕЧАНИЕ, я использую последнюю версию SymPy 1.4
Это ошибка? Или альтернативный способ использования функции для получения ожидаемого значения, пожалуйста?
РЕДАКТИРОВАТЬ: я изменил вопрос, чтобы отметить, что я использую функцию Sympy sqrt. Я также попытался использовать np.sqrt от NumPy, который вычисляет правильно, но дает полное числовое значение, а не хороший аккуратный sqrt (2) для значения коэффициента k.
Комментарии:
1.
from sympy import sqrt
Я думаю2. Я уже использую это. Спасибо, что отметили это, хотя — я исправил вопрос.
Ответ №1:
В документации явно указано:
Возвращает термины словаря, сопоставляющие их рациональный коэффициент.
Итак, начнем с того, что это ожидаемое поведение. Чтобы увидеть это, вы можете отметить, что проблема не в sqrt, а в том, что коэффициент иррационален. Если мы возьмем рациональный коэффициент, мы получим ваше ожидаемое поведение:
>>> from sympy import sqrt, symbols
>>> k, t = symbols('k, t')
>>> d = 1.5*t 2.5*sqrt(4)*k
>>> d.as_coefficients_dict()
{k: 5.00000000000000, t: 1.50000000000000}
Один из способов решить вашу проблему — явно запросить каждый коэффициент с заданными переменными:
>>> from sympy import sqrt, symbols
>>> k, t = symbols('k, t')
>>> d = 1.5*t 2.5*sqrt(2)*k
>>> {sym : d.coeff(sym) for sym in (k, t)}
{k: 2.5*sqrt(2), t: 1.50000000000000}
Комментарии:
1. Спасибо за разъяснение ожидаемого поведения. Опубликованный вами обходной путь работает хорошо, спасибо, хотя с единственным ограничением, которое мне теперь нужно явно указать переменные. Однако это не большая проблема.