2016-07-04 93 views
3

我試圖用sympy解對數的一個簡單方程,但是當我嘗試執行代碼時,我得到一個RuntimeError: maximum recursion depth exceeded。下面是我在做什麼:在哪裏我嘗試sp.solve的方程線發生Sympy RuntimeError:解對數方程時超出最大遞歸深度

import sympy as sp 
import numpy as np 

pH = sp.Symbol("pH") 
pCO2 = sp.Symbol("pCO2") 
HCO3 = sp.Symbol("HCO3") 

myhco3 = 10.0**(7.0 - 6.1 + np.log10(0.03 * 44.0)) 


hh = sp.Eq(pH, 6.1 + sp.log(HCO3, 10) - sp.log(0.03 * pCO2, 10)) 
eqs = [hh, 
     sp.Eq(pH, 7.0), 
     sp.Eq(pCO2, 44.0)] 

result = sp.solve(eqs, dict=True) 
print result 

錯誤。這似乎是一個相當簡單的方程來解決。有沒有需要設置的一些sympy假設?

回答

2

如果你想要一個基於代數操作的符號解決方案(這是SymPy的用途),你應該儘可能避免使用浮點數。例如,6.1以雙精度表示爲3433994715870003/562949953421312,並且當像那樣的係數滿足對數時,代數操作可以容易地產生像1933167165348049724692481703936那樣的多項式方程,其不會導致任何好的。如果不是

hh = sp.Eq(pH, 6.1 + sp.log(HCO3, 10) - sp.log(0.03 * pCO2, 10)) 
eqs = [hh, sp.Eq(pH, 7.0), sp.Eq(pCO2, 44.0)] 

你寫

hh = sp.Eq(pH, sp.Rational('6.1') + sp.log(HCO3, 10) - sp.log(sp.Rational('0.03') * pCO2, 10)) 
eqs = [hh, sp.Eq(pH, 7), sp.Eq(pCO2, 44)] 

輸出端出現過一次:

[{pCO2: 44, pH: 7, HCO3: 33*10**(9/10)/25}] 

外賣點:

  1. 如果你的係數是浮點你需要一個浮點數輸出想要一個數字求解器(見SciPy.optimize)不是一個象徵性的。
  2. 對於符號解決方案,請確保等式中涉及的數字具有乾淨的代數結構:例如,sqrt(sp.Rational('6.1'))
+0

Numpy有一個可以靈活用於數值求解方程的子包嗎? – themantalope

+0

我誤解了;它在scipy.optimize。添加了答案的鏈接。 –

+0

太好了,我來看看。我對Numpy非常熟悉,但我始終在Scipy中發現更多的好東西。感謝徹底的答覆,標記爲正確的。 – themantalope

相關問題