2013-07-19 3 views
3

기본적으로 나는 단지 k을 해결하려고합니다. 방정식 1.12방정식 해결 - 오버플로 오류

import math 
from sympy import * 

a = 1.45 
b = 4.1 
c = 14.0 

al = math.log(a, 2) 
bl = math.log(b, 2) 
cl = math.log(c, 2) 

k = symbols('k') 

print solve(Eq(1/k**al + 1/k**bl + 1/k**cl, 1.12), k) 

이 너무 환영 다른 라이브러리를 사용 OverflowError: Python int too large to convert to C long

솔루션을 제기으로 동일합니다.

답변

4

시도 할 수 있습니다. 이 경우 기호 솔루션을 찾으므로 sol를 사용하지 않아야합니다. 여기서 문제는이 부동 소수점 지수를 매우 큰 분자와 분모가있는 합리적인 지수로 변환 한 다음 어느 정도는 큰 숫자에 해당하는 차수의 다항식을 만들려고 시도하는데,이 숫자는 실패합니다.

수치상 해결하려면 nsolve을 사용할 수 있습니다.

>>> print nsolve(Eq(1/k**al + 1/k**bl + 1/k**cl, 1.12), 2) 
1.82427203413783 

숫자 솔루션에 관심이있는 경우 SciPy와 같은 숫자 라이브러리를 사용하는 것이 좋습니다. lambdify을 사용하여 SymPy 표현식을 NumPy 배열을 사용하는 SciPy와 같은 라이브러리에 더 적합한 함수로 변환 할 수 있습니다.

+0

감사합니다, 매력처럼 일했습니다! 이 줄의 끝에있는 '2'는 무엇을 의미합니까? 항상'2'의 값입니까? 수많은 문서에서 나는 여기에'k'와 같은 기호를 넣었다. – nutship

+1

'solve'에서 해결할 Symbol 또는 Symbol 목록을 전달합니다. 'nsolve'에서 한 번에 하나의 Symbol 만 풀 수 있습니다 (나머지는 숫자 여야하기 때문에), 그걸 전달할 필요가 없습니다. 그러나 그것이 필요한 것은 초기 추측입니다. 그것은 '2'입니다. 여러 솔루션이 포함 된 방정식이 있으면 찾고있는 솔루션 근처에서 추측을 통해 다른 솔루션을 찾을 수 있습니다. – asmeurer

1

이것은 알려진 issue입니다.

당신은 당신이 숫자 값을 사용하고 있기 때문에, 당신이 수치 솔루션을 찾고 있다고 가정하고

solve(Eq(1/k**al + 1/k**bl + 1/k**cl, 1.12), k, rational=False) 
+0

고맙지 만 '방정식을 풀기 위해 알고리즘이 구현되지 않았습니다.' – nutship

+0

@nutship 질문 한 코드 구문 이외의 다른 것에 관한 것일 수 있습니다. 어쩌면 방정식이 너무 복잡 할 수도 있습니다. 솔버 [doc] (http://docs.sympy.org/0.7.3/tutorial/solvers.html)를 살펴보십시오. – zsong