2016-07-04 2 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 시도 라인에 발생합니다. 이것은 해결할 수있는 아주 간단한 방정식처럼 보입니다. 설정해야 할 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

나는 잘못 기억했다. 괜찮아. 최적화 해. 답변에 대한 링크를 추가했습니다. –

+0

위대한, 내가 살펴 보겠습니다. 나는 Numpy에 매우 익숙하지만, Scipy에서 항상 좋은 것을 발견합니다. 올바른 답변을 표시해 주셔서 감사합니다. – themantalope