2017-01-02 10 views
0

Я пытаюсь использовать Sympy для переупорядочения простых выражений; хотя кажется, что Sympy отказывается сохранить результат как символическое выражение и вместо этого вычисляет логарифм численно.Простая символьная алгебра, перестраиваемая с помощью Sympy, не может символически сохранять логарифмы

Есть ли способ заставить Sympy символически возвращать результат?

Вот минимальный рабочий пример:

import sympy as sy 

sy.init_printing() 

def rearrange(expression, lhs): 
    rhs = sy.solve(expression,lhs)[0] 
    return sy.Eq(lhs, rhs) 

a, b = sy.symbols('a, b', real=True, positive=True) 

eqn = sy.Eq(sy.exp(-a**2/b**2), 0.5) 

rearrange(eqn, a) 

который возвращает

a=0.832554611157698b 

Это правильный ответ, конечно, хотя я бы предпочел, чтобы быть сказанным символический результат алгебра, которая (когда производятся вручную):

a = sqrt(log(2)) * b 

где log является базовым e (т.е. natur al log, ln).

Как получить этот результат от Sympy, пожалуйста?

ответ

4

не является экспертом sympy, но с ограниченной точностью float, sympy не может быть уверен 0.5 == 1/2. я переставить уравнение немного, так что только целые числа вступают в игру (Fractions или что-то подобное, безусловно, также сделать трюк)

eqn = sy.Eq(2*sy.exp(-a**2/b**2), 1) 

с результатом

a == b*sqrt(log(2)) 

, но как только у вас есть какие-либо floats в ваше уравнение, вы, скорее всего, получите floats назад. также в обычном python: 2 * 0.5 -> 1.0.

просто попытался: это также работает:

eqn = sy.Eq(sy.exp(-a**2/b**2), Fraction(1, 2))