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

Simple symbolic algebra rearranging with Sympy can't preserve logarithms symbolically

我正在尝试使用 Sympy 来重新排列简单的表达式;尽管 Sympy 似乎拒绝将结果保留为符号表达式,而是以数字方式计算对数。

有没有办法象征性地将Sympy结果强制return?

这是一个最小的工作示例:

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)

其中return

a=0.832554611157698b

这当然是正确答案,尽管我更愿意被告知符号代数结果,其(手动导出时)是:

a = sqrt(log(2)) * b

其中 log 以 e 为底(即自然对数,ln)。

我怎样才能从 Sympy 获得这个结果?

不是 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))