У меня есть некоторые большие выражения, которые имеют свои символы с атрибутом is_commutative=False
.Ошибка максимальной глубины рекурсии в 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)
Если я пытаюсь сделать f.simplify()
это вызывает ошибку:
RuntimeError: maximum recursion depth exceeded.
Я уже пытался the "gotcha"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()
работает!
Есть ли другой способ преодолеть эту ошибку?
У меня была аналогичная проблема с глубиной рекурсии, [задан вопрос о рекурсии здесь один раз] (http://stackoverflow.com/questions/17526625/baktracking-function-which-calculates-change-exceeds-maximum-recursion- глубина), и единственный ответ, который я получил, «из-за семантики Python как языка, рекурсия не является особенно эффективной парадигмой» и ссылкой на [этот вопрос] (http://stackoverflow.com/questions/ 3323001/максимальная рекурсия-глубина) –
Благодарим вас за комментарий! разработчики из SymPy говорят, что рекурсия является обычной практикой для символической оценки, но для этого случая я считаю, что проблема заключается не в рекурсии, а в том, что символы не являются «коммутативными» ... –
Я не заметил, что вы 're setting is_commutative на sin, cos и exp. Это не поддерживается. – asmeurer