我正在尝试使用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获得这个结果?
答案 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))