2017-01-02 81 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))