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

В SymPy есть полезная функция для создания словаря коэффициентов для данного выражения.

Однако я столкнулся с раздражающей ошибкой (/ признаком?), Из-за которой квадратные корни считаются частью переменной, а не частью значения коэффициента.

Минимальный пример:

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)}

NB, я использую последнюю версию SymPy 1.4

Это ошибка? Или альтернативный способ использования функции для получения ожидаемого значения, пожалуйста?

РЕДАКТИРОВАТЬ: я изменил вопрос, чтобы отметить, что я использую функцию Sympy sqrt. Я также попытался использовать np.sqrt NumPy, который оценивает правильно, но дает полное числовое значение, а не хороший аккуратный sqrt (2) для значения коэффициента k.

1 Ответ

1 голос
/ 15 апреля 2019

Документация прямо заявляет:

Возвращает термины отображения словаря в их Рациональный коэффициент.

Так чтоНачнем с того, что это ожидаемое поведение.Чтобы увидеть это, вы можете заметить, что 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}
...