使用 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))
我正在尝试使用 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))