1

기호가 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=Truesympy.var으로 설정하는 것이 도움이됩니다. 이러한 식 이후

이전 과정에서 오는 (IT True-sin, cosexp 설정 할 필요없이), 나는 다음과 같은 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() 작품!

이 오류를 극복하는 다른 방법이 있습니까?

+0

나는 재귀 깊이와 비슷한 문제가있다. [여기서 한 번 재귀에 관한 질문을했다.] (http://stackoverflow.com/questions/17526625/baktracking-function-which-calculates-change-exceeds-maximum-recursion- 깊이) 그리고 유일한 대답은 "파이썬이 언어로서의 의미로 인해 재귀는 특히 효율적인 패러다임이 아니며"[이 질문에 대한] 참조 (http://stackoverflow.com/questions/)입니다. 3323001/최대 재귀 깊이) –

+0

코멘트 주셔서 감사합니다! SymPy의 개발자들은 재귀가 기호 평가의 일반적인 관행이라고 말하지만,이 경우 문제는 재귀가 아니라 기호가 '교환 가능'이 아니라고 생각합니다. –

+0

나는 sin, cos 및 exp에 is_commutative를 설정합니다. 그건 지원되지 않습니다. – asmeurer

답변

2

이와 같은 작은 표현식을 사용하면 이와 같은 재귀 오류가 SymPy의 버그 일 가능성이 큽니다. SymPy issue tracker에서 버그로 신고해야합니다.

+0

고맙습니다. 신고 해 드리겠습니다. 그러나 이것은 is_commutative = False 일 때만 발생한다고 이야기하는 것이 중요합니다. –

+0

놀라운 것은 아닙니다. noncommutative 기호가 많은만큼 사용되지 않기 때문에 더 많은 버그가있는 경향이 있습니다. – asmeurer

관련 문제