我正在尝试用sympy中的对数解决一个简单的等式,但是当我尝试执行代码时,我得到RuntimeError: maximum recursion depth exceeded
。这就是我在做的事情:
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
错误发生在我尝试sp.solve
方程的行上。这似乎是一个相当简单的方程式来解决。是否需要设定一些同情假设?
答案 0 :(得分: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}]
外卖点:
sqrt(sp.Rational('6.1'))
。