Поиск коэффициентов с использованием Sympy не включает квадратный корень (sqrt) в качестве значения

#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. Спасибо за разъяснение ожидаемого поведения. Опубликованный вами обходной путь работает хорошо, спасибо, хотя с единственным ограничением, которое мне теперь нужно явно указать переменные. Однако это не большая проблема.