기호가 is_commutative=False
인 기호가있는 큰 표현식이 있습니다. 나는이 오류가 발생합니다 f.simplify()
을하려고하면비 교환 기호를 사용할 때 Sympy에서 최대 재귀 깊이 오류
import sympy
from sympy import pi, sin, cos, exp
sympy.var('L, xPL, cosa, i, j, r2, sina, t, x', commutative=False)
sin.is_commutative = False
cos.is_commutative = False
exp.is_commutative = False
f = L*(r2 + sina*x)**(-1)*cosa*x*exp(10000.0*x*xPL*(2*i + 1 + i**2)**(-1)/L**2 \
- 5000.0*xPL**2*(2*i + 1 + i**2)**(-1)/L**2 - 5000.0*x**2*(2*i + 1 \
+ i**2)**(-1)/L**2)*cos(pi*j*t - j*t**2/2 + pi*t - t**2/2) \
- (r2 + sina*x)**(-1)*cosa*x**2*exp(10000.0*x*xPL*(2*i + 1 \
+ i**2)**(-1)/L**2 - 5000.0*xPL**2*(2*i + 1 + i**2)**(-1)/L**2 \
- 5000.0*x**2*(2*i + 1 + i**2)**(-1)/L**2)*cos(pi*j*t - j*t**2/2 + pi*t - t**2/2)
: 여기
은 예입니다RuntimeError: maximum recursion depth exceeded.
가 이미 the "gotcha"sys.setrecursionlimit
을 시도했지만이 경우에는 도움이되지 않습니다.
commutative=True
을 sympy.var
으로 설정하는 것이 도움이됩니다. 이러한 식 이후
이전 과정에서 오는 (IT True
-sin
, cos
및 exp
설정 할 필요없이), 나는 다음과 같은 workaroud 있습니다
def get_new_f(f):
sin.is_commutative = True
cos.is_commutative = True
exp.is_commutative = True
str_f = str(f)
for s in f.free_symbols:
sympy.var(str(x))
return eval(str_f)r
get_new_f(f).simplify()
작품!
이 오류를 극복하는 다른 방법이 있습니까?
나는 재귀 깊이와 비슷한 문제가있다. [여기서 한 번 재귀에 관한 질문을했다.] (http://stackoverflow.com/questions/17526625/baktracking-function-which-calculates-change-exceeds-maximum-recursion- 깊이) 그리고 유일한 대답은 "파이썬이 언어로서의 의미로 인해 재귀는 특히 효율적인 패러다임이 아니며"[이 질문에 대한] 참조 (http://stackoverflow.com/questions/)입니다. 3323001/최대 재귀 깊이) –
코멘트 주셔서 감사합니다! SymPy의 개발자들은 재귀가 기호 평가의 일반적인 관행이라고 말하지만,이 경우 문제는 재귀가 아니라 기호가 '교환 가능'이 아니라고 생각합니다. –
나는 sin, cos 및 exp에 is_commutative를 설정합니다. 그건 지원되지 않습니다. – asmeurer