Максимальная ошибка глубины рекурсии в Sympy при использовании некоммутативных символов

У меня есть некоторые большие выражения, которые имеют свои символы с атрибутом is_commutative=False.

Вот пример:

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)

Если я пытаюсь выполнить f.simplify() возникает ошибка:

RuntimeError: maximum recursion depth exceeded.

Я уже пробовал " sys.setrecursionlimit " sys.setrecursionlimit, но в этом случае это не помогает.

Что нужно сделать, чтобы установить commutative=True в sympy.var. (Без необходимости устанавливать его 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() работает!

Есть ли другой способ преодолеть эту ошибку?

1 ответ

При таком маленьком выражении ошибка рекурсии, подобная этой, скорее всего, указывает на ошибку в SymPy. Вы должны сообщить об этом как об ошибке в отслеживателе проблем SymPy.

licensed under cc by-sa 3.0 with attribution.