用Sympy重新排列的简单符号代数不能象征性地保留对数

时间:2017-01-02 13:26:50

标签: python sympy symbolic-math algebra

我正在尝试使用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(即自然对数,ln)。

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

1 个答案:

答案 0 :(得分:4)

不是sympy专家,但考虑到float的准确性有限,同情不能确定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))