2017-01-02 34 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日志,ln)。

我如何从Sympy获得这个结果?

回答

4

不是sympy专家,但鉴于float的有限精度,sympy无法确定0.5 == 1/2。我重新排列等式了一点,所以只有整数开始发挥作用

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

,结果

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

但只要你有任何floatsFractions或类似的肯定也做的伎俩的东西)你的等式,你可能会得到floats回来。也用普通的python:2 * 0.5 -> 1.0

只是尝试:这也适用:

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