2016-07-04 64 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

相关问题