2016-07-04 5 views
3

Я пытаюсь решить простое уравнение с логарифмами в sympy, однако при попытке выполнить код я получаю RuntimeError: maximum recursion depth exceeded. Вот что я делаю: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 

Ошибка возникает в строке, где я пытаюсь sp.solve для уравнений. Это похоже на довольно простое уравнение для решения. Есть ли какое-то симптомное предположение, которое нужно установить?

ответ

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