2016-12-14 60 views
2

我在使用Sympy解決方程時遇到了問題。當我運行的代碼,例如:solve()執行中止

print(correction(10))

我希望它打印數量是F。相反,它給了我錯誤:執行中止。

def correction(r): 

    from sympy import cosh, log, exp, symbols, solve 
    f = symbols('f') 

    def equation(): 
     return cosh(((r - 1.0)/(r + 1.0))*(log(2.0)/f)) - 0.5*exp(log(2.0)/f) 

    correction = solve(equation(),f) 
    return correction 

什麼問題?

+0

聽起來像你正在運行到一定時間或內存限制。如果我用'r!= 0'來試試這個,那麼這只是一個消耗CPU的內存,而後者正在使用越來越多的內存。或者結論:'sympy'搜尋自己死亡。 – dhke

回答

4

您的方程非常非線性,我的猜測是無法找到封閉的解決方案。這就是爲什麼sympy.solve失敗。您擁有的唯一選擇是以數字方式解決方程式。 Sympy爲此提供了nsolve函數,它是數值求解器中的典型代表,它需要估算解。

import sympy as sp 
r, f = sp.symbols('r, f') 
expr = sp.cosh(((r - 1)/(r + 1))*(sp.log(2)/f)) - sp.Rational(1,2)*sp.exp(sp.log(2)/f) 

sol = sp.nsolve(expr.subs({r:10}), f, 0.5) 
print(sol) 

0.699259455239414

+0

一如既往的聰明。你是怎麼選擇1/2的? –

+1

@BillBell簡單地畫出了函數,並在那個點附近發現了一個零:) – Stelios

+1

你能解釋一下'sp.Rational'和'expr.subs({r:10})'部分的用途嗎?我以前沒有遇到過這些。 –